[gdb/breakpoint, PIE] Handle setting breakpoint on label without address
authorTom de Vries <tdevries@suse.de>
Thu, 3 Sep 2020 10:30:10 +0000 (12:30 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 3 Sep 2020 10:30:10 +0000 (12:30 +0200)
When adding:
...
if ![runto_main] then {
    fail "can't run to main"
    return 0
}
...
to test-case gdb.base/label-without-address.exp and running it with target
board unix/-fPIE/-pie, we run into:
...
(gdb) break main:L1^M
Breakpoint 2 at 0x555555554000: file label-without-address.c, line 22.^M
...
That is, for a label with optimized-out address, we set a breakpoint at the
relocation base.

The root cause is that the dwarf reader, despite finding that attribute
DW_AT_low_pc is missing, still tags the L1 symbol as having LOC_LABEL, which
means it has a valid address, which defaults to 0.

Fix this by instead tagging the L1 symbol with LOC_OPTIMIZED_OUT.

Tested on x86_64-linux.

gdb/ChangeLog:

2020-09-03  Tom de Vries  <tdevries@suse.de>

PR breakpoint/26546
* dwarf2/read.c (new_symbol): Tag label symbol without DW_AT_low_pc as
LOC_OPTIMIZED_OUT instead of LOC_LABEL.

gdb/testsuite/ChangeLog:

2020-09-03  Tom de Vries  <tdevries@suse.de>

PR breakpoint/26546
* gdb.base/label-without-address.exp: Runto main first.

gdb/ChangeLog
gdb/dwarf2/read.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/label-without-address.exp

index 1ac74546c196c02b0a8b0964429ccfeb4ae28837..ca251b27b42f7763e52a51c6fbfd41e5e1d9ce53 100644 (file)
@@ -1,3 +1,9 @@
+2020-09-03  Tom de Vries  <tdevries@suse.de>
+
+       PR breakpoint/26546
+       * dwarf2/read.c (new_symbol): Tag label symbol without DW_AT_low_pc as
+       LOC_OPTIMIZED_OUT instead of LOC_LABEL.
+
 2020-09-02  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * maint.c (index_digits): New function.
index c610ae4f068dfb72951514365b8d886ac1ffacb9..865f9e2118ba26075479eafb1f8bfe24a327c924 100644 (file)
@@ -21447,10 +21447,12 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
              addr = attr->value_as_address ();
              addr = gdbarch_adjust_dwarf2_addr (gdbarch, addr + baseaddr);
              SET_SYMBOL_VALUE_ADDRESS (sym, addr);
+             SYMBOL_ACLASS_INDEX (sym) = LOC_LABEL;
            }
+         else
+           SYMBOL_ACLASS_INDEX (sym) = LOC_OPTIMIZED_OUT;
          SYMBOL_TYPE (sym) = objfile_type (objfile)->builtin_core_addr;
          SYMBOL_DOMAIN (sym) = LABEL_DOMAIN;
-         SYMBOL_ACLASS_INDEX (sym) = LOC_LABEL;
          add_symbol_to_list (sym, cu->list_in_scope);
          break;
        case DW_TAG_subprogram:
index 63dcad7d99e305ffd2bee027a913f3e665a1f3b4..8fd4e8c5e46591a61e52d6e1b76cfc3c89d0abf4 100644 (file)
@@ -1,3 +1,8 @@
+2020-09-03  Tom de Vries  <tdevries@suse.de>
+
+       PR breakpoint/26546
+       * gdb.base/label-without-address.exp: Runto main first.
+
 2020-09-02  Tom Tromey  <tromey@adacore.com>
 
        * gdb.ada/mi_var_access.exp: Test children of access variable.
index 0fcb1fd19a9dd80fee0e57d301834e2b5bfff304..c688149cf3815b591e2417ede9af57deb9c74d0a 100644 (file)
@@ -19,6 +19,11 @@ if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
     return -1
 }
 
+if ![runto_main] then {
+    fail "can't run to main"
+    return 0
+}
+
 set supported 0
 gdb_test_multiple "l main:L1" "" {
     -wrap -re "No label \"L1\" defined in function \"main\"\." {