As they are referenced by DW_TAG_imported_declaration, as we can see from these warnings: ⬢[acme@toolbox zzam@xxxxxxxxxx]$ pdwtags popup.cpp.o > /dev/null die__process_class: tag not supported 0x2f (template_type_parameter)! die__process_class: tag not supported 0x30 (template_value_parameter)! die__process_class: tag not supported 0x4107 (GNU_template_parameter_pack)! die__process_function: tag not supported 0x4108 (GNU_formal_parameter_pack)! tag__recode_dwarf_type: couldn't find 0x5706e type for 0xedb9 (imported_declaration)! tag__recode_dwarf_type: couldn't find 0x57074 type for 0xedc1 (imported_declaration)! tag__recode_dwarf_type: couldn't find 0x5707a type for 0xedc9 (imported_declaration)! namespace__recode_dwarf_types: couldn't find 0x5706e type for 0xedb9 (imported_declaration)! namespace__recode_dwarf_types: couldn't find 0x57074 type for 0xedc1 (imported_declaration)! namespace__recode_dwarf_types: couldn't find 0x5707a type for 0xedc9 (imported_declaration)! ⬢[acme@toolbox zzam@xxxxxxxxxx]$ Looking at the DWARF info for one of those types not found: ⬢[acme@toolbox zzam@xxxxxxxxxx]$ readelf -wi popup.cpp.o | grep -w edb9 -A5 <2><edb9>: Abbrev Number: 14 (DW_TAG_imported_declaration) <edba> DW_AT_decl_file : 64 <edbb> DW_AT_decl_line : 100 <edbc> DW_AT_decl_column : 20 <edbd> DW_AT_import : <0x5706e> [Abbrev Number: 51 (DW_TAG_enumerator)] <2><edc1>: Abbrev Number: 14 (DW_TAG_imported_declaration) ⬢[acme@toolbox zzam@xxxxxxxxxx]$ And then: ⬢[acme@toolbox zzam@xxxxxxxxxx]$ readelf -wi popup.cpp.o | grep -w 5706e -A3 <3><5706e>: Abbrev Number: 51 (DW_TAG_enumerator) <5706f> DW_AT_name : (indirect string, offset: 0xaec05): _S_single <57073> DW_AT_const_value : 0 <3><57074>: Abbrev Number: 51 (DW_TAG_enumerator) ⬢[acme@toolbox zzam@xxxxxxxxxx]$ So we need to hash those DW_TAG_enumerator and not just the DW_TAG_enumerator_type containing them. This way tag__recode_dwarf_type() and namespace__recode_dwarf_types() will find them when looking them up using dwarf_cu__find_type_by_ref(). This was found first on the stratagus codebase (C++) at https://github.com/Wargus/stratagus.git. This didn't generate any difference in output from pahole, not influenced BTF generation as tested using tests/reproducible_build.sh. Reported-by: Matthias Schwarzott <zzam@xxxxxxxxxx> Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> --- dwarf_loader.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dwarf_loader.c b/dwarf_loader.c index 2d49960120b56f78..d914b91c1f375f7f 100644 --- a/dwarf_loader.c +++ b/dwarf_loader.c @@ -1776,6 +1776,7 @@ static struct tag *die__create_new_enumeration(Dwarf_Die *die, struct cu *cu, st goto out_delete; enumeration__add(enumeration, enumerator); + cu__hash(cu, &enumerator->tag); } while (dwarf_siblingof(die, die) == 0); out: return &enumeration->namespace.tag; -- 2.45.0