aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2020-09-03 12:30:10 +0200
committerTom de Vries <tdevries@suse.de>2020-09-03 12:30:10 +0200
commit8f5c6526ebbd8b5749dd2f348796b53f3e2b25ee (patch)
treebc5dad38b60871dccc205aa07d9e929a73946c6d
parent9184ef8a92371746d0f36580adf2ad6845f1ced3 (diff)
downloadgdb-8f5c6526ebbd8b5749dd2f348796b53f3e2b25ee.zip
gdb-8f5c6526ebbd8b5749dd2f348796b53f3e2b25ee.tar.gz
gdb-8f5c6526ebbd8b5749dd2f348796b53f3e2b25ee.tar.bz2
[gdb/breakpoint, PIE] Handle setting breakpoint on label without address
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.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/dwarf2/read.c4
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.base/label-without-address.exp5
4 files changed, 19 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1ac7454..ca251b2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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.
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index c610ae4..865f9e2 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -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:
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 63dcad7..8fd4e8c 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -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.
diff --git a/gdb/testsuite/gdb.base/label-without-address.exp b/gdb/testsuite/gdb.base/label-without-address.exp
index 0fcb1fd..c688149 100644
--- a/gdb/testsuite/gdb.base/label-without-address.exp
+++ b/gdb/testsuite/gdb.base/label-without-address.exp
@@ -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\"\." {