From patchwork Mon Dec 11 11:42:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zeck S X-Patchwork-Id: 81897 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6912A38582B1 for ; Mon, 11 Dec 2023 12:11:15 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-qt1-x835.google.com (mail-qt1-x835.google.com [IPv6:2607:f8b0:4864:20::835]) by sourceware.org (Postfix) with ESMTPS id B92793858D37 for ; Mon, 11 Dec 2023 12:10:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B92793858D37 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org B92793858D37 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::835 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702296661; cv=none; b=c4TfYAADdq1cXK+dsjthEB6ihY5oKWqTBV0LhdOGukMbgzGumYeWf3AMhj3ID/lFp3mJ3jTjXrZFo9O3Oas109Wfe8v8G8bDm5Wqh6jtw48bUELW8HkntCqGxXdQSL3aWxCYxHuOedkDgv3o1BifLb8j41B4pH8ShdvI+3Mk8LA= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702296661; c=relaxed/simple; bh=KcWNeDxLK9Xs5ylaTNoyiI/ex+T52P5W9C5ocPuVwy8=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=RFlO7CmGdJPxhrq6knqVW1JggnBVgtxKg7ecK3vhf0Kj+fkTRJn6rvrTOha5V5Qr/BtnQblH4GzE8y9KqHB4kmuAI/dWXHM2GyfRQhGp4mhF6PpVHqXttYwkM4xGmlVwvlySJeoD3oFpLHXyRgDInCNeMioOgb7S4GGOPbQB8js= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-qt1-x835.google.com with SMTP id d75a77b69052e-4259024f6daso22178731cf.3 for ; Mon, 11 Dec 2023 04:10:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1702296656; x=1702901456; darn=sourceware.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+iuBVtTDxq3msUAzLFjumZKNJU1kRltqxoG8iX/43qk=; b=lb9p1fdNhy4rEuNEGyW0iUD3FtNfiq2yzz202NuGoX8ycJMfJYyxG22v4uHgRtDY3p HwKslcZnVTwZ8vx4Ug6M9E//xOyiQMUgMskm2TY2fMYgU86w+TViC+0lXpkTACK8wmW0 /PzRTAXcvY42not4FswSuHUgg6mRQfiK+cmNclikwJtiSadPcZRmsyxaIdveGfZl3XIB 1MQ//bztjDZJlFFL25M5/bHbV6VKtnfTzsYQJjzxs+Gf+OTZWnjsf36L7OGNmXezOpJd FC1cqS2PqGuIJLXi/UxEybqE+lsNO6CAFS8kvc4eQCdUEXBh4d7UYcc3CkmktS0L0qVw sNLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702296656; x=1702901456; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+iuBVtTDxq3msUAzLFjumZKNJU1kRltqxoG8iX/43qk=; b=Hrsvf291QUVGsyCcLWm2vM8gPzLxkrf6JGIputTNxrmqZsCaUMuFKNYYwB3pQog/C0 GFySBCEMHd8mLEkS7IzkDmPg5+PHbL+eJ85qjpLC8l+9Sm5sfqYXi2n3JBklluJo9Iuu xe/hQXD5ihUvkgyP/zbhyHj/INYOGjzAt3VgXBMNdG88Gak2xw1QFNhnYScOkcKHFjYs /A18EDsTiWQbGJ9JBEWRWusBUKsEWuypNkqgmnmhGLi2JjsuH97GztfvS8q99jgdAagr VfCaoEgkutXlkzcxAD23SsgTrQVFxrh4HhxUD3ZnYFidKPrvk4oDvWGcgAMlEAEx7GJO sjNQ== X-Gm-Message-State: AOJu0YyshXwUPxl6Z4J5IdU3IIuIs6VaeLE2ST6rxu4xBSWQ/DP+X5bN 8jcp8rxxvj1BdA1dft+j1ECx7kCQATg= X-Google-Smtp-Source: AGHT+IGQOTnUlR09gbg9tu4hXoiPZhtHtUxjU3QR++2ZHK/qiBv6h5QluB0gBeq04QfbYHTKd58CiQ== X-Received: by 2002:ac8:5bc1:0:b0:425:8b0b:c626 with SMTP id b1-20020ac85bc1000000b004258b0bc626mr3491784qtb.104.1702296656292; Mon, 11 Dec 2023 04:10:56 -0800 (PST) Received: from localhost.localdomain (66-85-86-66-85-86-131.cpe.sparklight.net. [66.85.86.131]) by smtp.gmail.com with ESMTPSA id kr21-20020ac861d5000000b0040331a24f16sm3142920qtb.3.2023.12.11.04.10.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Dec 2023 04:10:55 -0800 (PST) From: Zeck S To: gdb-patches@sourceware.org Cc: Zeck S Subject: [RFC][PATCH?] fixed some segfaults and bugs in mdebug support Date: Mon, 11 Dec 2023 05:42:53 -0600 Message-ID: <20231211114252.451602-2-zeck654321@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org I'm not quite sure what to do. I have done some testing using the qemu-mips board I made. There are a lot of limitations I'm running into. I can just run as much of the testsuite as I can and see what happens. Here are the main problems: 1. IDO only supports ansi c. This is a problem for some headers in glibc which use c99. 2. Test code sometimes has GCC features in them like asm() 3. Test expectations sometimes assume features from nicer formats like DWARF. I knew I probably couldn't get standard library stuff working. Even if I hack past the C99 issues (variadic macros), there's also problems with compiler specific files like stddef.h. I started testing by just running gdb.base/info-types-c.exp alone, since I knew I fixed bugs in that area, and the test didn't use stdio.h. Found that the .c file used asm() which IDO doesn't support. Commented that code out, ran the test. Failed. Fixed a segfault that had been introduced since I started this project. Still failed. Fixed some typedef handling to get closer to the expected output. However, the expected output includes line numbers for types. mdebug format doesn't include line information for types. There are also differences in output stemming from mdebug assuming the debugger knows size information etc about "basic" types, unlike dwarf, which includes information about them. So at this point, I realize, I've modified the .c file for the test which already seems not great, and I realize due to limitations of mdebug, I can't ever make the test pass. Not sure how to demonstrate this as progress, but uh, it feels like progress? For the curious, this is the bash script I wrapped IDO with. stderr is directed to dev null, because qemu-irix puts some non fatal errors there, which confuses the test runner. Put the script in a directory in PATH. Passing an executable path as CC_FOR_TARGET does not work. It must be the name of a file in PATH. #!/bin/sh echo "$@" >> theargs for arg do if [ "$arg" = "-static" ] then link=1 fi done if [ "$link" = 1 ] then mips-unknown-linux-gnu-gcc "$@" else for arg do shift [ "$arg" = "-fdiagnostics-color=never" ] && continue [ "$arg" = "-g" ] && continue set -- "$@" "$arg" done /path/to/qemu-irix -L /path/to/ido/ido7.1_compiler /path/to/ido/ido7.1_compiler/usr/bin/cc -Xcpluscomm -nostdlib -nostdinc -mips2 -g2 "$@" 2>/dev/null fi --- gdb/mdebugread.c | 89 ++++++++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 37 deletions(-) diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index cd6638224e7..191932e91cd 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -237,7 +237,7 @@ static struct type *new_type (char *); enum block_type { FUNCTION_BLOCK, NON_FUNCTION_BLOCK }; static struct block *new_block (struct objfile *objfile, - enum block_type, enum language); + enum block_type, enum language, bool isGlobal); static struct compunit_symtab *new_symtab (const char *, int, struct objfile *); @@ -246,7 +246,7 @@ static struct linetable *new_linetable (int); static struct blockvector *new_bvect (int); static struct type *parse_type (int, union aux_ext *, unsigned int, int *, - int, const char *); + int, const char *, bool); static struct symbol *mylookup_symbol (const char *, const struct block *, domain_enum, enum address_class); @@ -572,7 +572,7 @@ add_data_symbol (SYMR *sh, union aux_ext *ax, int bigend, || sh->sc == scNil || sh->index == indexNil) s->set_type (builtin_type (objfile)->nodebug_data_symbol); else - s->set_type (parse_type (cur_fd, ax, sh->index, 0, bigend, name)); + s->set_type (parse_type (cur_fd, ax, sh->index, 0, bigend, name, false)); /* Value of a data symbol is its memory address. */ } @@ -705,7 +705,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, break; } s->set_value_longest (svalue); - s->set_type (parse_type (cur_fd, ax, sh->index, 0, bigend, name)); + s->set_type (parse_type (cur_fd, ax, sh->index, 0, bigend, name, false)); add_symbol (s, top_stack->cur_st, top_stack->cur_block); break; @@ -761,7 +761,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, t = builtin_type (objfile)->builtin_int; else { - t = parse_type (cur_fd, ax, sh->index + 1, 0, bigend, name); + t = parse_type (cur_fd, ax, sh->index + 1, 0, bigend, name, false); if (strcmp (name, "malloc") == 0 && t->code () == TYPE_CODE_VOID) { @@ -805,7 +805,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, s->type ()->set_is_prototyped (true); /* Create and enter a new lexical context. */ - b = new_block (objfile, FUNCTION_BLOCK, s->language ()); + b = new_block (objfile, FUNCTION_BLOCK, s->language (), false); s->set_value_block (b); b->set_function (s); b->set_start (sh->value); @@ -1135,7 +1135,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, } top_stack->blocktype = stBlock; - b = new_block (objfile, NON_FUNCTION_BLOCK, psymtab_language); + b = new_block (objfile, NON_FUNCTION_BLOCK, psymtab_language, false); b->set_start (sh->value + top_stack->procadr); b->set_superblock (top_stack->cur_block); top_stack->cur_block = b; @@ -1247,7 +1247,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, f->set_loc_bitpos (sh->value); bitsize = 0; f->set_type (parse_type (cur_fd, ax, sh->index, &bitsize, bigend, - name)); + name, false)); f->set_bitsize (bitsize); } break; @@ -1269,7 +1269,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, pend = is_pending_symbol (cur_fdr, ext_sh); if (pend == NULL) { - t = parse_type (cur_fd, ax, sh->index, NULL, bigend, name); + t = parse_type (cur_fd, ax, sh->index, NULL, bigend, name, true); add_pending (cur_fdr, ext_sh, t); } else @@ -1382,7 +1382,7 @@ basic_type (int bt, struct objfile *objfile) if (map_bt[bt]) return map_bt[bt]; - type_allocator alloc (objfile, get_current_subfile ()->language); + type_allocator alloc (objfile, psymtab_language); switch (bt) { @@ -1514,7 +1514,7 @@ basic_type (int bt, struct objfile *objfile) static struct type * parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, - int bigend, const char *sym_name) + int bigend, const char *sym_name, bool isStTypedef) { TIR t[1]; struct type *tp = 0; @@ -1571,7 +1571,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, } } - type_allocator alloc (mdebugread_objfile, get_current_subfile ()->language); + type_allocator alloc (mdebugread_objfile, psymtab_language); /* Move on to next aux. */ ax++; @@ -1628,7 +1628,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, xref_fh = get_rfd (fd, rf); xref_fd = xref_fh - debug_info->fdr; tp = parse_type (xref_fd, debug_info->external_aux + xref_fh->iauxBase, - rn->index, NULL, xref_fh->fBigendian, sym_name); + rn->index, NULL, xref_fh->fBigendian, sym_name, false); } /* All these types really point to some (common) MIPS type @@ -1785,6 +1785,13 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, if (t->continued) complaint (_("illegal TIR continued for %s"), sym_name); + if (isStTypedef) + { + struct type *wrap = alloc.new_type (TYPE_CODE_TYPEDEF, 0, sym_name); + wrap->set_target_type(tp); + tp = wrap; + } + return tp; } @@ -1839,7 +1846,7 @@ upgrade_type (int fd, struct type **tpp, int tq, union aux_ext *ax, int bigend, indx = parse_type (fh - debug_info->fdr, debug_info->external_aux + fh->iauxBase, - id, NULL, bigend, sym_name); + id, NULL, bigend, sym_name, false); /* The bounds type should be an integer type, but might be anything else due to corrupt aux entries. */ @@ -2154,8 +2161,7 @@ parse_external (EXTR *es, int bigend, const section_offsets §ion_offsets, with that and do not need to reorder our linetables. */ static void -parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines, - CORE_ADDR lowest_pdr_addr) +parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines) { unsigned char *base; int j, k; @@ -2169,7 +2175,6 @@ parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines, for (j = 0; j < fh->cpd; j++, pr++) { CORE_ADDR l; - CORE_ADDR adr; unsigned char *halt; /* No code for this one. */ @@ -2186,9 +2191,7 @@ parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines, halt = base + fh->cbLine; base += pr->cbLineOffset; - adr = pr->adr - lowest_pdr_addr; - - l = adr >> 2; /* in words */ + l = pr->adr >> 2; /* in words */ for (lineno = pr->lnLow; base < halt;) { count = *base & 0x0f; @@ -4053,6 +4056,14 @@ mdebug_expand_psymtab (legacy_psymtab *pst, struct objfile *objfile) { (*swap_pdr_in) (cur_bfd, pdr_ptr, pdr_in); + char *sym_ptr = (char *)(debug_info->external_sym) + + (fh->isymBase + pdr_in->isym) * external_sym_size; + + SYMR sh; + (*swap_sym_in) (cur_bfd, sym_ptr, &sh); + + pdr_in->adr = sh.value; + /* Determine lowest PDR address, the PDRs are not always sorted. */ if (pdr_in == pr_block.data ()) @@ -4154,16 +4165,16 @@ mdebug_expand_psymtab (legacy_psymtab *pst, struct objfile *objfile) { (*swap_pdr_in) (cur_bfd, pdr_ptr, pdr_in); - /* Determine lowest PDR address, the PDRs are not always - sorted. */ - if (pdr_in == pr_block.data ()) - lowest_pdr_addr = pdr_in->adr; - else if (pdr_in->adr < lowest_pdr_addr) - lowest_pdr_addr = pdr_in->adr; + sym_ptr = (char *)(debug_info->external_sym) + + (fh->isymBase + pdr_in->isym) * external_sym_size; + + SYMR sh; + (*swap_sym_in) (cur_bfd, sym_ptr, &sh); + + pdr_in->adr = sh.value; } - parse_lines (fh, pr_block.data (), lines, maxlines, - lowest_pdr_addr); + parse_lines (fh, pr_block.data (), lines, maxlines); if (lines->nitems < fh->cline) lines = shrink_linetable (lines); @@ -4291,7 +4302,7 @@ cross_ref (int fd, union aux_ext *ax, struct type **tpp, rf = rn->rfd; } - type_allocator alloc (mdebugread_objfile, get_current_subfile ()->language); + type_allocator alloc (mdebugread_objfile, psymtab_language); /* mips cc uses a rf of -1 for opaque struct definitions. Set TYPE_STUB for these types so that check_typedef will @@ -4412,7 +4423,8 @@ cross_ref (int fd, union aux_ext *ax, struct type **tpp, sh.index, NULL, fh->fBigendian, - debug_info->ss + fh->issBase + sh.iss); + debug_info->ss + fh->issBase + sh.iss, + sh.st == stTypedef); add_pending (fh, esh, *tpp); break; @@ -4438,7 +4450,8 @@ cross_ref (int fd, union aux_ext *ax, struct type **tpp, sh.index, NULL, fh->fBigendian, - debug_info->ss + fh->issBase + sh.iss); + debug_info->ss + fh->issBase + sh.iss, + true); } else { @@ -4542,6 +4555,7 @@ add_line (struct linetable *lt, int lineno, CORE_ADDR adr, int last) return lineno; lt->item[lt->nitems].line = lineno; + lt->item[lt->nitems].is_stmt = 1; lt->item[lt->nitems++].set_unrelocated_pc (unrelocated_addr (adr << 2)); return lineno; } @@ -4634,9 +4648,10 @@ new_symtab (const char *name, int maxlines, struct objfile *objfile) /* All symtabs must have at least two blocks. */ bv = new_bvect (2); - bv->set_block (GLOBAL_BLOCK, new_block (objfile, NON_FUNCTION_BLOCK, lang)); - bv->set_block (STATIC_BLOCK, new_block (objfile, NON_FUNCTION_BLOCK, lang)); + bv->set_block (GLOBAL_BLOCK, new_block (objfile, NON_FUNCTION_BLOCK, lang, true)); + bv->set_block (STATIC_BLOCK, new_block (objfile, NON_FUNCTION_BLOCK, lang, false)); bv->static_block ()->set_superblock (bv->global_block ()); + bv->global_block ()->set_compunit_symtab(cust); cust->set_blockvector (bv); cust->set_debugformat ("ECOFF"); @@ -4723,9 +4738,10 @@ new_bvect (int nblocks) static struct block * new_block (struct objfile *objfile, enum block_type type, - enum language language) + enum language language, bool isGlobal) { - struct block *retval = new (&objfile->objfile_obstack) block; + struct block *retval = isGlobal ? new (&objfile->objfile_obstack) global_block + : new (&objfile->objfile_obstack) block; if (type == FUNCTION_BLOCK) retval->set_multidict (mdict_create_linear_expandable (language)); @@ -4754,8 +4770,7 @@ new_type (char *name) { struct type *t; - t = type_allocator (mdebugread_objfile, - get_current_subfile ()->language).new_type (); + t = type_allocator (mdebugread_objfile, psymtab_language).new_type (); t->set_name (name); INIT_CPLUS_SPECIFIC (t); return t;