aboutsummaryrefslogtreecommitdiff
path: root/gdb/objfiles.c
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2024-10-10 11:37:34 +0100
committerAndrew Burgess <aburgess@redhat.com>2024-10-27 20:18:49 +0000
commitf8258cdaf95a80de8375ae54fa968c452733043f (patch)
treea67cfc08760355347ed416c6411185e3f1bfef3e /gdb/objfiles.c
parenta723c56efb07c4f8b3f6a3ed4b878a2f8f5572cc (diff)
downloadgdb-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.c1
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 ())
{