From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 47766 invoked by alias); 3 May 2018 22:36:28 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 47610 invoked by uid 89); 3 May 2018 22:36:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.5 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_STOCKGEN,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy= X-HELO: gateway21.websitewelcome.com Received: from gateway21.websitewelcome.com (HELO gateway21.websitewelcome.com) (192.185.46.113) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 03 May 2018 22:36:25 +0000 Received: from cm13.websitewelcome.com (cm13.websitewelcome.com [100.42.49.6]) by gateway21.websitewelcome.com (Postfix) with ESMTP id 95C85400CB127 for ; Thu, 3 May 2018 17:36:24 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id EMpsfhct9QUwqEMpsfR35B; Thu, 03 May 2018 17:36:24 -0500 X-Authority-Reason: nr=8 Received: from 97-122-176-117.hlrn.qwest.net ([97.122.176.117]:51190 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.89_1) (envelope-from ) id 1fEMps-003rsK-CH; Thu, 03 May 2018 17:36:24 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA 3/6] Make PSYMBOL_VALUE_ADDRESS take objfile argument Date: Thu, 03 May 2018 22:36:00 -0000 Message-Id: <20180503223621.22544-4-tom@tromey.com> In-Reply-To: <20180503223621.22544-1-tom@tromey.com> References: <20180503223621.22544-1-tom@tromey.com> X-BWhitelist: no X-Source-L: No X-Exim-ID: 1fEMps-003rsK-CH X-Source-Sender: 97-122-176-117.hlrn.qwest.net (bapiya.Home) [97.122.176.117]:51190 X-Source-Auth: tom+tromey.com X-Email-Count: 4 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-SW-Source: 2018-05/txt/msg00076.txt.bz2 This changes PSYMBOL_VALUE_ADDRESS to take an objfile argument. This is necessary so that we can later relocate a partial symbol at its point of use. It also adds a "raw" form of the accessor, to compute the unrelocated value; and a special macro to be used for setting the field. Note that the macro doesn't actually perform any relocation -- it uses the argument, to ensure that any possible syntax errors are caught, but it multiplies it by 0 so that it has no effect. ChangeLog 2018-05-03 Tom Tromey * psympriv.h (SET_PSYMBOL_VALUE_ADDRESS) (PSYMBOL_VALUE_RAW_ADDRESS): New macros. (PSYMBOL_VALUE_ADDRESS): Add 'objfile' parameter. * psymtab.c (find_pc_sect_psymtab_closer, find_pc_sect_psymbol) (fixup_psymbol_section, relocate_psymtabs): Update. (print_partial_symbols): Add 'objfile' parameter. Update. (dump_psymtab, add_psymbol_to_bcache, psym_fill_psymbol_map): Update. --- gdb/ChangeLog | 11 +++++++++++ gdb/psympriv.h | 7 ++++++- gdb/psymtab.c | 50 ++++++++++++++++++++++++++++---------------------- 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/gdb/psympriv.h b/gdb/psympriv.h index 31f2a2b3e9..8daaa377b7 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -51,7 +51,12 @@ struct partial_symbol }; #define PSYMBOL_VALUE(symbol) (symbol)->pginfo.value.ivalue -#define PSYMBOL_VALUE_ADDRESS(symbol) (symbol)->pginfo.value.address +#define SET_PSYMBOL_VALUE_ADDRESS(symbol, addr) \ + (((symbol)->pginfo.value.address) = (addr)) +#define PSYMBOL_VALUE_RAW_ADDRESS(symbol) ((symbol)->pginfo.value.address + 0) +#define PSYMBOL_VALUE_ADDRESS(objfile, symbol) \ + ((symbol)->pginfo.value.address \ + + (0 * (ANOFFSET ((objfile)->section_offsets, ((symbol)->pginfo.section))))) #define PSYMBOL_LANGUAGE(symbol) (symbol)->pginfo.language #define PSYMBOL_SECTION(symbol) (symbol)->pginfo.section #define PSYMBOL_OBJ_SECTION(objfile, symbol) \ diff --git a/gdb/psymtab.c b/gdb/psymtab.c index e9a6a23b9d..3b6f0d53b5 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -267,7 +267,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile, object's symbol table. */ p = find_pc_sect_psymbol (objfile, tpst, pc, section); if (p != NULL - && (PSYMBOL_VALUE_ADDRESS (p) + && (PSYMBOL_VALUE_ADDRESS (objfile, p) == BMSYMBOL_VALUE_ADDRESS (msymbol))) return tpst; @@ -276,7 +276,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile, symbol tables with line information but no debug symbols (e.g. those produced by an assembler). */ if (p != NULL) - this_addr = PSYMBOL_VALUE_ADDRESS (p); + this_addr = PSYMBOL_VALUE_ADDRESS (objfile, p); else this_addr = tpst->textlow; @@ -334,7 +334,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc, object's symbol table. */ p = find_pc_sect_psymbol (objfile, pst, pc, section); if (p == NULL - || (PSYMBOL_VALUE_ADDRESS (p) + || (PSYMBOL_VALUE_ADDRESS (objfile, p) != BMSYMBOL_VALUE_ADDRESS (msymbol))) goto next; } @@ -427,10 +427,11 @@ find_pc_sect_psymbol (struct objfile *objfile, if (SYMBOL_DOMAIN (p) == VAR_DOMAIN && PSYMBOL_CLASS (p) == LOC_BLOCK - && pc >= PSYMBOL_VALUE_ADDRESS (p) - && (PSYMBOL_VALUE_ADDRESS (p) > best_pc + && pc >= PSYMBOL_VALUE_ADDRESS (objfile, p) + && (PSYMBOL_VALUE_ADDRESS (objfile, p) > best_pc || (psymtab->textlow == 0 - && best_pc == 0 && PSYMBOL_VALUE_ADDRESS (p) == 0))) + && best_pc == 0 + && PSYMBOL_VALUE_ADDRESS (objfile, p) == 0))) { if (section != NULL) /* Match on a specific section. */ { @@ -439,7 +440,7 @@ find_pc_sect_psymbol (struct objfile *objfile, section)) continue; } - best_pc = PSYMBOL_VALUE_ADDRESS (p); + best_pc = PSYMBOL_VALUE_ADDRESS (objfile, p); best = p; } } @@ -450,10 +451,11 @@ find_pc_sect_psymbol (struct objfile *objfile, if (SYMBOL_DOMAIN (p) == VAR_DOMAIN && PSYMBOL_CLASS (p) == LOC_BLOCK - && pc >= PSYMBOL_VALUE_ADDRESS (p) - && (PSYMBOL_VALUE_ADDRESS (p) > best_pc + && pc >= PSYMBOL_VALUE_ADDRESS (objfile, p) + && (PSYMBOL_VALUE_ADDRESS (objfile, p) > best_pc || (psymtab->textlow == 0 - && best_pc == 0 && PSYMBOL_VALUE_ADDRESS (p) == 0))) + && best_pc == 0 + && PSYMBOL_VALUE_ADDRESS (objfile, p) == 0))) { if (section != NULL) /* Match on a specific section. */ { @@ -462,7 +464,7 @@ find_pc_sect_psymbol (struct objfile *objfile, section)) continue; } - best_pc = PSYMBOL_VALUE_ADDRESS (p); + best_pc = PSYMBOL_VALUE_ADDRESS (objfile, p); best = p; } } @@ -488,7 +490,7 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile) case LOC_STATIC: case LOC_LABEL: case LOC_BLOCK: - addr = PSYMBOL_VALUE_ADDRESS (psym); + addr = PSYMBOL_VALUE_ADDRESS (objfile, psym); break; default: /* Nothing else will be listed in the minsyms -- no use looking @@ -815,15 +817,17 @@ psym_relocate (struct objfile *objfile, { fixup_psymbol_section (psym, objfile); if (PSYMBOL_SECTION (psym) >= 0) - PSYMBOL_VALUE_ADDRESS (psym) += ANOFFSET (delta, - PSYMBOL_SECTION (psym)); + SET_PSYMBOL_VALUE_ADDRESS (psym, + PSYMBOL_VALUE_RAW_ADDRESS (psym) + + ANOFFSET (delta, PSYMBOL_SECTION (psym))); } for (partial_symbol *psym : objfile->static_psymbols) { fixup_psymbol_section (psym, objfile); if (PSYMBOL_SECTION (psym) >= 0) - PSYMBOL_VALUE_ADDRESS (psym) += ANOFFSET (delta, - PSYMBOL_SECTION (psym)); + SET_PSYMBOL_VALUE_ADDRESS (psym, + PSYMBOL_VALUE_RAW_ADDRESS (psym) + + ANOFFSET (delta, PSYMBOL_SECTION (psym))); } objfile->psymbol_map.clear (); @@ -887,7 +891,7 @@ psym_forget_cached_source_info (struct objfile *objfile) } static void -print_partial_symbols (struct gdbarch *gdbarch, +print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile, struct partial_symbol **p, int count, const char *what, struct ui_file *outfile) { @@ -971,7 +975,9 @@ print_partial_symbols (struct gdbarch *gdbarch, break; } fputs_filtered (", ", outfile); - fputs_filtered (paddress (gdbarch, PSYMBOL_VALUE_ADDRESS (*p)), outfile); + fputs_filtered (paddress (gdbarch, + PSYMBOL_VALUE_RAW_ADDRESS (*p)), + outfile); fprintf_filtered (outfile, "\n"); p++; } @@ -1036,13 +1042,13 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab, } if (psymtab->n_global_syms > 0) { - print_partial_symbols (gdbarch, + print_partial_symbols (gdbarch, objfile, &objfile->global_psymbols[psymtab->globals_offset], psymtab->n_global_syms, "Global", outfile); } if (psymtab->n_static_syms > 0) { - print_partial_symbols (gdbarch, + print_partial_symbols (gdbarch, objfile, &objfile->static_psymbols[psymtab->statics_offset], psymtab->n_static_syms, "Static", outfile); } @@ -1479,7 +1485,7 @@ psym_fill_psymbol_map (struct objfile *objfile, if (PSYMBOL_CLASS (psym) == LOC_STATIC) { - CORE_ADDR addr = PSYMBOL_VALUE_ADDRESS (psym); + CORE_ADDR addr = PSYMBOL_VALUE_RAW_ADDRESS (psym); if (seen_addrs->find (addr) == seen_addrs->end ()) { seen_addrs->insert (addr); @@ -1726,7 +1732,7 @@ add_psymbol_to_bcache (const char *name, int namelength, int copy_name, holes. */ memset (&psymbol, 0, sizeof (psymbol)); - PSYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr; + SET_PSYMBOL_VALUE_ADDRESS (&psymbol, coreaddr); PSYMBOL_SECTION (&psymbol) = -1; PSYMBOL_SET_LANGUAGE (&psymbol, language, &objfile->objfile_obstack); PSYMBOL_DOMAIN (&psymbol) = domain; -- 2.13.6