aboutsummaryrefslogtreecommitdiff
path: root/gdb/objfiles.c
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2021-09-14 14:41:27 +0200
committerTom de Vries <tdevries@suse.de>2021-09-14 14:41:27 +0200
commit211aafd18d10b7739a16df5cc637952fd3f508e8 (patch)
tree0f5787b71bcaf829dc407d2c24a156393daead85 /gdb/objfiles.c
parent2762d288534f48dc8653524b878883472037a57c (diff)
downloadbinutils-211aafd18d10b7739a16df5cc637952fd3f508e8.zip
binutils-211aafd18d10b7739a16df5cc637952fd3f508e8.tar.gz
binutils-211aafd18d10b7739a16df5cc637952fd3f508e8.tar.bz2
[gdb/symtab] Fix function range handling in psymtabs
Consider the test-case from this patch. We run into: ... (gdb) PASS: gdb.dwarf2/dw2-ranges-psym-warning.exp: continue bt^M warning: (Internal error: pc 0x4004b6 in read in psymtab, but not in symtab.)^M ^M warning: (Internal error: pc 0x4004b6 in read in psymtab, but not in symtab.)^M ^M warning: (Internal error: pc 0x4004b6 in read in psymtab, but not in symtab.)^M ^M warning: (Internal error: pc 0x4004b6 in read in psymtab, but not in symtab.)^M ^M warning: (Internal error: pc 0x4004b6 in read in psymtab, but not in symtab.)^M ^M warning: (Internal error: pc 0x4004b6 in read in psymtab, but not in symtab.)^M ^M read in psymtab, but not in symtab.)^M ^M )^M (gdb) FAIL: gdb.dwarf2/dw2-ranges-psym-warning.exp: bt ... This happens as follows. The function foo: ... <1><31>: Abbrev Number: 4 (DW_TAG_subprogram) <33> DW_AT_name : foo <37> DW_AT_ranges : 0x0 ... has these ranges: ... 00000000 00000000004004c1 00000000004004d2 00000000 00000000004004ae 00000000004004af 00000000 <End of list> ... which have a hole at at [0x4004af,0x4004c1). However, the address map of the partial symtabs incorrectly maps addresses in the hole (such as 0x4004b6 in the backtrace) to the foo CU. The address map of the full symbol table of the foo CU however does not contain the addresses in the hole, which is what the warning / internal error complains about. Fix this by making sure that ranges of functions are read correctly. The patch adds a bit to struct partial_die_info, in this hole (shown for x86_64-linux): ... /* 11: 7 | 4 */ unsigned int canonical_name : 1; /* XXX 4-byte hole */ /* 16 | 8 */ const char *raw_name; ... So there's no increase in size for 64-bit, but AFAIU there will be an increase for 32-bit. Tested on x86_64-linux. gdb/ChangeLog: 2021-08-10 Tom de Vries <tdevries@suse.de> PR symtab/28200 * dwarf2/read.c (struct partial_die_info): Add has_range_info and range_offset field. (add_partial_subprogram): Handle pdi->has_range_info. (partial_die_info::read): Set pdi->has_range_info. gdb/testsuite/ChangeLog: 2021-08-10 Tom de Vries <tdevries@suse.de> PR symtab/28200 * gdb.dwarf2/dw2-ranges-psym-warning-main.c: New test. * gdb.dwarf2/dw2-ranges-psym-warning.c: New test. * gdb.dwarf2/dw2-ranges-psym-warning.exp: New file.
Diffstat (limited to 'gdb/objfiles.c')
0 files changed, 0 insertions, 0 deletions