From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [RFA 3/6] Make PSYMBOL_VALUE_ADDRESS take objfile argument
Date: Thu, 03 May 2018 22:36:00 -0000 [thread overview]
Message-ID: <20180503223621.22544-4-tom@tromey.com> (raw)
In-Reply-To: <20180503223621.22544-1-tom@tromey.com>
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 <tromey@redhat.com>
* 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
next prev parent reply other threads:[~2018-05-03 22:36 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-03 22:36 [RFA 0/6] Make psymbols independent of the progspace Tom Tromey
2018-05-03 22:36 ` Tom Tromey [this message]
2018-06-01 20:06 ` [RFA 3/6] Make PSYMBOL_VALUE_ADDRESS take objfile argument Keith Seitz
2018-06-01 21:03 ` Tom Tromey
2018-06-05 20:50 ` Simon Marchi
2018-05-03 22:36 ` [RFA 6/6] Make psymbols and psymtabs independent of the program space Tom Tromey
2018-06-05 20:34 ` Keith Seitz
2018-05-03 22:36 ` [RFA 5/6] Add validity bits for psymtab high and low fields Tom Tromey
2018-06-01 21:23 ` Keith Seitz
2018-06-05 17:25 ` Tom Tromey
2018-06-05 17:38 ` Keith Seitz
2018-05-03 22:36 ` [RFA 1/6] Remove dead code in end_psymtab Tom Tromey
2018-06-01 18:55 ` Keith Seitz
2018-06-05 19:41 ` Simon Marchi
2018-05-03 22:36 ` [RFA 2/6] Change representation of psymbol to flush out accessors Tom Tromey
2018-06-01 19:19 ` Keith Seitz
2018-06-04 18:11 ` Tom Tromey
2018-06-05 19:49 ` Simon Marchi
2018-06-05 22:56 ` Tom Tromey
2018-06-05 23:31 ` Simon Marchi
2018-05-03 22:36 ` [RFA 4/6] Introduce accessors for psymtab high and low fields Tom Tromey
2018-06-01 20:48 ` Keith Seitz
2018-06-04 18:14 ` Tom Tromey
2018-06-05 21:03 ` Simon Marchi
2018-05-25 17:58 ` [RFA 0/6] Make psymbols independent of the progspace Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180503223621.22544-4-tom@tromey.com \
--to=tom@tromey.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox