[02/11,gdb/macros] Handle 64-bit dwarf in gdb.base/fission-macro.exp
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_build--master-arm |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-arm |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 |
success
|
Testing passed
|
Commit Message
When enabling 64-bit dwarf in the test-case gdb.base/fission-macro.exp, we run
into:
...
(gdb) break -qualified main^M
DW_MACRO_define_strx pointing outside of .debug_str.dwo section \
[in module fission-macro-5-640.dwo]^M
(gdb) FAIL: gdb.base/fission-macro.exp: dwarf_version=5: dwarf_bits=64: \
gdb_breakpoint: set breakpoint at main
...
A dwarf-5 .debug_str_offsets section starts with a header consisting of:
- an initial length (4 bytes for 32-bit and 12 bytes for 64-bit),
- a 2 byte version string, and
- 2 bytes padding
so in total 8 bytes for 32-bit and 16 bytes for 64-bit.
This offset is calculated here in dwarf_decode_macros:
...
str_offsets_base = cu->header.addr_size;
...
and in both cases this evaluates to 8.
So in the 64-bit case, we interpret the last 8 bytes of the header as an offset.
Fix this by computing str_offsets_base correctly for dwarf-5, for both the
32-bit and 64-bit case.
Tested on x86_64-linux.
Tested test-case using a current gcc trunk build, and gcc 14.
---
gdb/dwarf2/read.c | 11 ++++++++++-
gdb/testsuite/gdb.base/fission-macro.exp | 2 +-
2 files changed, 11 insertions(+), 2 deletions(-)
@@ -21232,7 +21232,16 @@ dwarf_decode_macros (struct dwarf2_cu *cu, unsigned int offset,
str_offsets_section = &cu->dwo_unit->dwo_file
->sections.str_offsets;
str_section = &cu->dwo_unit->dwo_file->sections.str;
- str_offsets_base = cu->header.addr_size;
+ if (cu->per_cu->version () <= 4)
+ str_offsets_base = cu->header.addr_size;
+ else
+ {
+ bfd *abfd = str_offsets_section->get_bfd_owner ();
+ unsigned int bytes_read = 0;
+ read_initial_length (abfd, str_offsets_section->buffer, &bytes_read, false);
+ const bool is_dwarf64 = bytes_read != 4;
+ str_offsets_base = is_dwarf64 ? 16 : 8;
+ }
}
else
{
@@ -67,7 +67,7 @@ proc do_tests { dwarf_version dwarf_bits strict_dwarf } {
}
foreach_with_prefix dwarf_version {5} {
- foreach_with_prefix dwarf_bits {32} {
+ foreach_with_prefix dwarf_bits {32 64} {
foreach_with_prefix strict_dwarf {0 1} {
do_tests $dwarf_version $dwarf_bits $strict_dwarf
}