Index: llvm/include/llvm/MC/MCObjectFileInfo.h =================================================================== --- llvm/include/llvm/MC/MCObjectFileInfo.h +++ llvm/include/llvm/MC/MCObjectFileInfo.h @@ -277,7 +277,7 @@ return DwarfAccelTypesSection; } MCSection *getDwarfInfoDWOSection() const { return DwarfInfoDWOSection; } - MCSection *getDwarfTypesSection(uint64_t Hash) const; + MCSection *getDwarfTypesSection(uint64_t Hash, uint16_t DwarfVersion) const; MCSection *getDwarfTypesDWOSection() const { return DwarfTypesDWOSection; } MCSection *getDwarfAbbrevDWOSection() const { return DwarfAbbrevDWOSection; } MCSection *getDwarfStrDWOSection() const { return DwarfStrDWOSection; } Index: llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp =================================================================== --- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -2612,7 +2612,8 @@ if (useSplitDwarf()) NewTU.setSection(Asm->getObjFileLowering().getDwarfTypesDWOSection()); else { - NewTU.setSection(Asm->getObjFileLowering().getDwarfTypesSection(Signature)); + NewTU.setSection(Asm->getObjFileLowering().getDwarfTypesSection( + Signature, getDwarfVersion())); // Non-split type units reuse the compile unit's line table. CU.applyStmtList(UnitDie); } Index: llvm/lib/MC/MCObjectFileInfo.cpp =================================================================== --- llvm/lib/MC/MCObjectFileInfo.cpp +++ llvm/lib/MC/MCObjectFileInfo.cpp @@ -444,6 +444,7 @@ // Fission Sections DwarfInfoDWOSection = Ctx->getELFSection(".debug_info.dwo", DebugSecType, ELF::SHF_EXCLUDE); + // FIXME: DwarfTypesDWOSection should be .debug_info.dwo for DWARF v5. DwarfTypesDWOSection = Ctx->getELFSection(".debug_types.dwo", DebugSecType, ELF::SHF_EXCLUDE); DwarfAbbrevDWOSection = @@ -616,6 +617,7 @@ COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ, SectionKind::getMetadata(), "debug_macinfo"); + // FIXME: DwarfTypesDWOSection should be .debug_info.dwo for DWARF v5. DwarfInfoDWOSection = Ctx->getCOFFSection( ".debug_info.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | @@ -812,11 +814,14 @@ } } -MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash) const { +MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash, + uint16_t DwarfVersion) const { switch (TT.getObjectFormat()) { case Triple::ELF: - return Ctx->getELFSection(".debug_types", ELF::SHT_PROGBITS, ELF::SHF_GROUP, - 0, utostr(Hash)); + return Ctx->getELFSection( + DwarfVersion <= 4 ? ".debug_types" : ".debug_info", + TT.isMIPS() ? ELF::SHT_MIPS_DWARF : ELF::SHT_PROGBITS, + ELF::SHF_GROUP, 0, utostr(Hash)); case Triple::MachO: case Triple::COFF: case Triple::Wasm: Index: llvm/test/CodeGen/X86/dwarf-headers.ll =================================================================== --- llvm/test/CodeGen/X86/dwarf-headers.ll +++ llvm/test/CodeGen/X86/dwarf-headers.ll @@ -59,16 +59,16 @@ ; DWO-4: 0x00000000: Type Unit: {{.*}} version = 0x0004 abbr_offset ; DWO-4: 0x00000017: DW_TAG_type_unit -; Verify the v5 non-split headers. +; Verify the v5 non-split headers. Type units come first. +; All .debug_info sections are reported in one go, but the offset resets for +; each new section. ; ; SINGLE-5: .debug_info contents: -; SINGLE-5: 0x00000000: Compile Unit: {{.*}} version = 0x0005 unit_type = DW_UT_compile abbr_offset -; SINGLE-5: 0x0000000c: DW_TAG_compile_unit -; -; FIXME: V5 wants type units in .debug_info not .debug_types. -; SINGLE-5: .debug_types contents: ; SINGLE-5: 0x00000000: Type Unit: {{.*}} version = 0x0005 unit_type = DW_UT_type abbr_offset ; SINGLE-5: 0x00000018: DW_TAG_type_unit +; SINGLE-5-NOT: contents: +; SINGLE-5: 0x00000000: Compile Unit: {{.*}} version = 0x0005 unit_type = DW_UT_compile abbr_offset +; SINGLE-5: 0x0000000c: DW_TAG_compile_unit ; Verify the v5 split headers. ; Index: llvm/test/DebugInfo/X86/string-offsets-multiple-cus.ll =================================================================== --- llvm/test/DebugInfo/X86/string-offsets-multiple-cus.ll +++ llvm/test/DebugInfo/X86/string-offsets-multiple-cus.ll @@ -31,39 +31,13 @@ ; with the correct offsets. Check that strings referenced by compile units 2 and 3 ; are displayed correctly. ; -; CU 1 ; BOTH: .debug_info contents: -; BOTH-NOT: .contents: -; BOTH: DW_TAG_compile_unit -; BOTH-NOT: {{DW_TAG|NULL}} -; BOTH: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF:[0-9a-f]+]]) -; -; CU 2 -; BOTH-NOT: contents: -; BOTH: DW_TAG_compile_unit -; BOTH-NOT: {{DW_TAG|NULL}} -; BOTH: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF]]) -; BOTH-NOT: NULL -; BOTH: DW_TAG_variable -; BOTH-NOT: {{DW_TAG|NULL}} -; BOTH: DW_AT_name [DW_FORM_strx1] ( indexed (00000009) string = "glob2") -; -; CU 3 -; BOTH-NOT: contents: -; BOTH: DW_TAG_compile_unit -; BOTH-NOT: {{DW_TAG|NULL}} -; BOTH: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF]]) -; BOTH-NOT: NULL -; BOTH: DW_TAG_variable -; BOTH-NOT: {{DW_TAG|NULL}} -; BOTH: DW_AT_name [DW_FORM_strx1] ( indexed (0000000f) string = "glob3") ; ; Verify that all 3 type units have the proper DW_AT_str_offsets_base attribute. -; TYPEUNITS: .debug_types contents: ; TYPEUNITS-NOT: contents: ; TYPEUNITS: DW_TAG_type_unit ; TYPEUNITS-NOT: {{DW_TAG|NULL}} -; TYPEUNITS: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF]]) +; TYPEUNITS: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF:[0-9a-f]+]]) ; TYPEUNITS-NOT: NULL ; TYPEUNITS: DW_TAG_enumerator ; TYPEUNITS-NOT: NULL @@ -84,6 +58,33 @@ ; TYPEUNITS-NOT: NULL ; TYPEUNITS: DW_TAG_enumeration_type ; TYPEUNITS: DW_AT_name [DW_FORM_strx1] ( indexed (00000013) string = "E3") + +; CU 1 +; BOTH-NOT: .contents: +; BOTH: DW_TAG_compile_unit +; BOTH-NOT: {{DW_TAG|NULL}} +; DEFAULT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF:[0-9a-f]+]]) +; TYPEUNITS: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF]]) +; +; CU 2 +; BOTH-NOT: contents: +; BOTH: DW_TAG_compile_unit +; BOTH-NOT: {{DW_TAG|NULL}} +; BOTH: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF]]) +; BOTH-NOT: NULL +; BOTH: DW_TAG_variable +; BOTH-NOT: {{DW_TAG|NULL}} +; BOTH: DW_AT_name [DW_FORM_strx1] ( indexed (00000009) string = "glob2") +; +; CU 3 +; BOTH-NOT: contents: +; BOTH: DW_TAG_compile_unit +; BOTH-NOT: {{DW_TAG|NULL}} +; BOTH: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x[[CU1_STROFF]]) +; BOTH-NOT: NULL +; BOTH: DW_TAG_variable +; BOTH-NOT: {{DW_TAG|NULL}} +; BOTH: DW_AT_name [DW_FORM_strx1] ( indexed (0000000f) string = "glob3") ; ; Extract the offset of a string to verify that it is referenced in the string ; offsets section.