diff options
author | Andrew Burgess <aburgess@redhat.com> | 2024-10-10 11:37:34 +0100 |
---|---|---|
committer | Andrew Burgess <aburgess@redhat.com> | 2024-10-27 20:18:49 +0000 |
commit | f8258cdaf95a80de8375ae54fa968c452733043f (patch) | |
tree | a67cfc08760355347ed416c6411185e3f1bfef3e /gdb/objfiles.c | |
parent | a723c56efb07c4f8b3f6a3ed4b878a2f8f5572cc (diff) | |
download | gdb-users/aburgess/try-gdb-block-entry-pc.zip gdb-users/aburgess/try-gdb-block-entry-pc.tar.gz gdb-users/aburgess/try-gdb-block-entry-pc.tar.bz2 |
gdb: fix handling of DW_AT_entry_pc of inlined subroutinesusers/aburgess/try-gdb-block-entry-pc
The entry PC for a DIE, e.g. an inline function, might not be the base
address of the DIE. Currently though, in block::entry_pc(), GDB
always returns the base address (low-pc or the first address of the
first range) as the entry PC.
This commit extends the block class to carry the entry PC as a
separate member variable. Then the DWARF reader is extended to read
and set the entry PC for the block. Now in block::entry_pc(), if the
entry PC has been set to a specific value, this is the value returned.
I have not removed the old code in block::entry_pc(). If the specific
entry PC value was not set then we still fall back on the old approach
of just returning the base address. Doing this feels more useful than
just claiming there is no entry PC. This should also mean that we
shouldn't see any change in behaviour for compilers that don't emit
the DW_AT_entry_pc, or for debug readers (e.g. stabs) that don't set
the entry PC value within a block.
The DWARF-5 spec for reading the entry PC is a super-set of the spec
as found in DWARF-4. For example, if there is no DW_AT_entry_pc then
DWARF-4 says to use DW_AT_low_pc while DWARF-5 says to use the base
address, which is DW_AT_low_pc or the first address in the first range
specified by DW_AT_ranges if there is no DW_AT_low_pc.
I have taken the approach of just implementing the DWARF-5 spec for
everyone. There doesn't seem to be any benefit to deliberately
ignoring a ranges based entry PC value for DWARF-4. If some naughty
compiler has emitted that, then lets use it.
Similarly, DWARF-4 says that DW_AT_entry_pc is an address. DWARF-5
allows an address or a constant, where the constant is an offset from
the base address. I allow both approaches for all DWARF versions.
There doesn't seem to be any downsides to this approach.
The inline-entry.exp test was originally contributed by Bernd here:
https://inbox.sourceware.org/gdb-patches/AS1PR01MB94659E4D9B3F4A6006CC605FE4922@AS1PR01MB9465.eurprd01.prod.exchangelabs.com
though I have made some edits, making more use of lib/gdb.exp
functions, making the gdb_test output patterns a little tighter, and
updating the test to run with Clang. I also moved the test to
gdb.opt/ as that seemed like a better home for it.
Co-Authored-By: Bernd Edlinger <bernd.edlinger@hotmail.de>
Diffstat (limited to 'gdb/objfiles.c')
-rw-r--r-- | gdb/objfiles.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 555195d..761a090 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -621,6 +621,7 @@ objfile_relocate1 (struct objfile *objfile, { b->set_start (b->start () + delta[block_line_section]); b->set_end (b->end () + delta[block_line_section]); + b->set_entry_pc (b->entry_pc () + delta[block_line_section]); for (blockrange &r : b->ranges ()) { |