From: Tom de Vries Date: Thu, 3 Sep 2020 10:30:10 +0000 (+0200) Subject: [gdb/breakpoint, PIE] Handle setting breakpoint on label without address X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8f5c6526ebbd8b5749dd2f348796b53f3e2b25ee;p=binutils-gdb.git [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 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 PR breakpoint/26546 * gdb.base/label-without-address.exp: Runto main first. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1ac74546c19..ca251b27b42 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2020-09-03 Tom de Vries + + 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 * maint.c (index_digits): New function. diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index c610ae4f068..865f9e2118b 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 63dcad7d99e..8fd4e8c5e46 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-09-03 Tom de Vries + + PR breakpoint/26546 + * gdb.base/label-without-address.exp: Runto main first. + 2020-09-02 Tom Tromey * 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 0fcb1fd19a9..c688149cf38 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\"\." {