diff options
author | Fangrui Song <maskray@google.com> | 2020-07-01 12:31:44 -0700 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2020-07-01 12:31:44 -0700 |
commit | a8caed5d7faa639a1e6769eba551d15d8ddd9510 (patch) | |
tree | 650bccaa0261f07d7b0d8778376817bb85996fe9 | |
parent | 33d1369f183f1c276e3f0f52b5573fb2f5843b1c (diff) | |
download | gdb-a8caed5d7faa639a1e6769eba551d15d8ddd9510.zip gdb-a8caed5d7faa639a1e6769eba551d15d8ddd9510.tar.gz gdb-a8caed5d7faa639a1e6769eba551d15d8ddd9510.tar.bz2 |
Recognize -1 as a tombstone value in .debug_line
LLD from 11 onwards (https://reviews.llvm.org/D81784) uses -1 to
represent a relocation in .debug_line referencing a discarded symbol.
Recognize -1 to fix gdb.base/break-on-linker-gcd-function.exp when the
linker is a newer LLD.
gdb/ChangeLog:
* dwarf2/read.c (lnp_state_machine::check_line_address): Test -1.
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 13 |
2 files changed, 11 insertions, 6 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 404ee40..0077981 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2020-07-01 Fangrui Song <maskray@google.com> + + * dwarf2/read.c (lnp_state_machine::check_line_address): Test -1. + 2020-07-01 Alok Kumar Sharma <AlokKumar.Sharma@amd.com> * dwarf2/read.c (set_die_type): Removed conditions to restrict diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 4622d14..405b5fb 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -19983,7 +19983,7 @@ public: we're processing the end of a sequence. */ void record_line (bool end_sequence); - /* Check ADDRESS is zero and less than UNRELOCATED_LOWPC and if true + /* Check ADDRESS is -1, or zero and less than UNRELOCATED_LOWPC, and if true nop-out rest of the lines in this sequence. */ void check_line_address (struct dwarf2_cu *cu, const gdb_byte *line_ptr, @@ -20377,12 +20377,13 @@ lnp_state_machine::check_line_address (struct dwarf2_cu *cu, const gdb_byte *line_ptr, CORE_ADDR unrelocated_lowpc, CORE_ADDR address) { - /* If ADDRESS < UNRELOCATED_LOWPC then it's not a usable value, it's outside - the pc range of the CU. However, we restrict the test to only ADDRESS - values of zero to preserve GDB's previous behaviour which is to handle - the specific case of a function being GC'd by the linker. */ + /* Linkers resolve a symbolic relocation referencing a GC'd function to 0 or + -1. If ADDRESS is 0, ignoring the opcode will err if the text section is + located at 0x0. In this case, additionally check that if + ADDRESS < UNRELOCATED_LOWPC. */ - if (address == 0 && address < unrelocated_lowpc) + if ((address == 0 && address < unrelocated_lowpc) + || address == (CORE_ADDR) -1) { /* This line table is for a function which has been GCd by the linker. Ignore it. PR gdb/12528 */ |