[gdb/symtab] Handle DW_AT_ranges with DW_FORM_sec_off in partial DIE

While looking into a failure in gdb.go/package.exp with gcc-11, I noticed that
gdb shows some complaints when loading the executable (also with gcc-10, where
the test-case passes):
...
$ gdb -batch -iex "set complaints 100" package.10 -ex start
During symbol reading: Attribute value is not a constant (DW_FORM_sec_offset)
Temporary breakpoint 1 at 0x402ae6: file gdb.go/package1.go, line 8.
During symbol reading: Attribute value is not a constant (DW_FORM_sec_offset)
During symbol reading: Invalid .debug_rnglists data (no base address)
...

Fix this by using as_unsigned () to read DW_AT_ranges in the partial DIE
reader, similar to how that is done in dwarf2_get_pc_bounds.

Tested on x86_64-linux.

gdb/ChangeLog:

2021-01-25  Bernd Edlinger  <bernd.edlinger@hotmail.de>
	    Simon Marchi  <simon.marchi@polymtl.ca>
	    Tom de Vries  <tdevries@suse.de>

	* dwarf2/read.c (partial_die_info::read): Use as_unsigned () for
	DW_AT_ranges.

gdb/testsuite/ChangeLog:

2021-01-25  Tom de Vries  <tdevries@suse.de>

	* gdb.dwarf2/dw2-ranges-psym.exp (gdb_load_no_complaints): New proc.
	* lib/gdb.exp: Use gdb_load_no_complaints.
This commit is contained in:
Tom de Vries
2021-01-25 16:32:31 +01:00
parent f3bdc2dbb9
commit 9f6c202e57
5 changed files with 53 additions and 2 deletions

View File

@@ -1,3 +1,10 @@
2021-01-25 Bernd Edlinger <bernd.edlinger@hotmail.de>
Simon Marchi <simon.marchi@polymtl.ca>
Tom de Vries <tdevries@suse.de>
* dwarf2/read.c (partial_die_info::read): Use as_unsigned () for
DW_AT_ranges.
2021-01-25 Tom Tromey <tromey@adacore.com>
* dwarf2/read.c (get_mpz): New function.

View File

@@ -19833,7 +19833,7 @@ partial_die_info::read (const struct die_reader_specs *reader,
/* It would be nice to reuse dwarf2_get_pc_bounds here,
but that requires a full DIE, so instead we just
reimplement it. */
unsigned int ranges_offset = (attr.constant_value (0)
unsigned int ranges_offset = (attr.as_unsigned ()
+ (need_ranges_base
? cu->ranges_base
: 0));

View File

@@ -1,3 +1,8 @@
2021-01-25 Tom de Vries <tdevries@suse.de>
* gdb.dwarf2/dw2-ranges-psym.exp (gdb_load_no_complaints): New proc.
* lib/gdb.exp: Use gdb_load_no_complaints.
2021-01-25 Tom Tromey <tromey@adacore.com>
* gdb.ada/fixed_points.exp: Add regression test.

View File

@@ -120,11 +120,14 @@ Dwarf::assemble $asm_file {
}
}
if { [prepare_for_testing "failed to prepare" ${testfile} \
if { [build_executable "failed to prepare" ${testfile} \
[list $srcfile $srcfile2 $asm_file] {nodebug}] } {
return -1
}
clean_restart
gdb_load_no_complaints $binfile
if ![runto_main] {
return -1
}

View File

@@ -5095,6 +5095,42 @@ proc gdb_load { arg } {
return 0
}
#
# gdb_load_no_complaints -- As gdb_load, but in addition verifies that
# loading caused no symbol reading complaints.
#
proc gdb_load_no_complaints { arg } {
global gdb_prompt gdb_file_cmd_msg decimal
# Save current setting of complaints.
set save ""
set show_complaints_re \
"Max number of complaints about incorrect symbols is ($decimal)\\."
gdb_test_multiple "show complaints" "" {
-re -wrap $show_complaints_re {
set save $expect_out(1,string)
}
}
# Fall back to regular gdb_load if we couldn't get the current setting
# of complaints.
if { $save == "" } {
return gdb_load $arg
}
# Temporarily set complaint to a small non-zero number.
gdb_test_no_output "set complaints 5" ""
gdb_load $arg
# Verify that there were no complaints.
set re "^Reading symbols from \[^\r\n\]*\r\n$gdb_prompt $"
gdb_assert {[regexp $re $gdb_file_cmd_msg]} "No complaints"
# Restore saved setting of complaints.
gdb_test_no_output "set complaints $save" ""
}
# gdb_reload -- load a file into the target. Called before "running",
# either the first time or after already starting the program once,
# for remote targets. Most files that override gdb_load should now