From 774935aa0c2b10b54509e5816a86f4f2c1c1d9bf Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Fri, 11 Apr 2025 16:38:04 -0400 Subject: [PATCH] gdb/dwarf: skip type units in create_dwo_cus_hash_table When compiling with -gsplit-dwarf -fdebug-types-section, DWARF 5 .debug_info.dwo sections may contain some type units: $ llvm-dwarfdump -F -color a-test.dwo | head -n 5 a-test.dwo: file format elf64-x86-64 .debug_info.dwo contents: 0x00000000: Type Unit: length = 0x000008a0, format = DWARF32, version = 0x0005, unit_type = DW_UT_split_type, abbr_offset = 0x0000, addr_size = 0x08, name = 'vector >', type_signature = 0xb499dcf29e2928c4, type_offset = 0x0023 (next unit at 0x000008a4) In this case, create_dwo_cus_hash_table wrongly creates a dwo_unit for it and adds it to dwo_file::cus. create_dwo_debug_type_hash_table later correctly creates a dwo_unit that it puts in dwo_file::tus. This can be observed with: $ ./gdb -nx -q --data-directory=data-directory -ex 'maint set dwarf sync on' -ex "maint set worker-threads 0" -ex "set debug dwarf-read 2" -ex "file a.out" -batch ... [dwarf-read] create_dwo_cus_hash_table: Reading .debug_info.dwo for /home/smarchi/build/binutils-gdb/gdb/a-test.dwo: [dwarf-read] create_dwo_cus_hash_table: offset 0x0, dwo_id 0xb499dcf29e2928c4 [dwarf-read] create_dwo_cus_hash_table: offset 0x8a4, dwo_id 0x496a8791a842701b [dwarf-read] create_dwo_cus_hash_table: offset 0x941, dwo_id 0xefd13b3f62ea9fea ... [dwarf-read] create_dwo_debug_type_hash_table: Reading .debug_info.dwo for /home/smarchi/build/binutils-gdb/gdb/a-test.dwo [dwarf-read] create_dwo_debug_type_hash_table: offset 0x0, signature 0xb499dcf29e2928c4 [dwarf-read] create_dwo_debug_type_hash_table: offset 0x8a4, signature 0x496a8791a842701b [dwarf-read] create_dwo_debug_type_hash_table: offset 0x941, signature 0xefd13b3f62ea9fea ... Fix it by skipping anything that isn't a compile unit in create_dwo_cus_hash_table. After this patch, the debug output of create_dwo_cus_hash_table only shows one created dwo_unit, as we expect. I couldn't find any user-visible problem related to this, I just noticed it while debugging. Change-Id: I7dddf766fe1164123b6702027b1beb56114f25b1 Reviewed-By: Tom de Vries --- gdb/dwarf2/read.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 7d6dfd03e27..794c3973cb5 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -6342,6 +6342,12 @@ create_dwo_cus_hash_table (dwarf2_cu *cu, dwo_file &dwo_file) if (reader.is_dummy()) continue; + /* DWARF 5 .debug_info.dwo sections may contain some type units. Skip + everything that is not a compile unit. */ + if (const auto ut = reader.cu ()->header.unit_type; + ut != DW_UT_compile && ut != DW_UT_split_compile) + continue; + std::optional signature = lookup_dwo_id (reader.cu (), reader.top_level_die ()); if (!signature.has_value ()) -- 2.47.3