Recognize -1 as a tombstone value in .debug_line
authorFangrui Song <maskray@google.com>
Wed, 1 Jul 2020 19:31:44 +0000 (12:31 -0700)
committerFangrui Song <maskray@google.com>
Wed, 1 Jul 2020 19:31:44 +0000 (12:31 -0700)
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.

gdb/ChangeLog
gdb/dwarf2/read.c

index 404ee40667895438752ba2ac74295a4928c6b175..007798135e57ad2d3e206c2d38d7098f783b4d53 100644 (file)
@@ -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
index 4622d14a05c6819b482c9c97c14a14755876aa72..405b5fb3348c94aad10e3bb40f393137ddb0759c 100644 (file)
@@ -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 */