Index: llvm/trunk/include/llvm/MC/MCObjectFileInfo.h =================================================================== --- llvm/trunk/include/llvm/MC/MCObjectFileInfo.h +++ llvm/trunk/include/llvm/MC/MCObjectFileInfo.h @@ -241,6 +241,9 @@ MCSection *getCompactUnwindSection() const { return CompactUnwindSection; } MCSection *getDwarfAbbrevSection() const { return DwarfAbbrevSection; } MCSection *getDwarfInfoSection() const { return DwarfInfoSection; } + MCSection *getDwarfInfoSection(uint64_t Hash) const { + return getDwarfComdatSection(".debug_info", Hash); + } MCSection *getDwarfLineSection() const { return DwarfLineSection; } MCSection *getDwarfLineStrSection() const { return DwarfLineStrSection; } MCSection *getDwarfFrameSection() const { return DwarfFrameSection; } @@ -277,7 +280,9 @@ return DwarfAccelTypesSection; } MCSection *getDwarfInfoDWOSection() const { return DwarfInfoDWOSection; } - MCSection *getDwarfTypesSection(uint64_t Hash) const; + MCSection *getDwarfTypesSection(uint64_t Hash) const { + return getDwarfComdatSection(".debug_types", Hash); + } MCSection *getDwarfTypesDWOSection() const { return DwarfTypesDWOSection; } MCSection *getDwarfAbbrevDWOSection() const { return DwarfAbbrevDWOSection; } MCSection *getDwarfStrDWOSection() const { return DwarfStrDWOSection; } @@ -390,6 +395,7 @@ void initELFMCObjectFileInfo(const Triple &T, bool Large); void initCOFFMCObjectFileInfo(const Triple &T); void initWasmMCObjectFileInfo(const Triple &T); + MCSection *getDwarfComdatSection(const char *Name, uint64_t Hash) const; public: const Triple &getTargetTriple() const { return TT; } Index: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -2610,9 +2610,14 @@ Ins.first->second = Signature; if (useSplitDwarf()) + // FIXME: v5 split type units belong in .debug_info.dwo. NewTU.setSection(Asm->getObjFileLowering().getDwarfTypesDWOSection()); else { - NewTU.setSection(Asm->getObjFileLowering().getDwarfTypesSection(Signature)); + MCSection *Section = + getDwarfVersion() <= 4 + ? Asm->getObjFileLowering().getDwarfTypesSection(Signature) + : Asm->getObjFileLowering().getDwarfInfoSection(Signature); + NewTU.setSection(Section); // Non-split type units reuse the compile unit's line table. CU.applyStmtList(UnitDie); } Index: llvm/trunk/lib/MC/MCObjectFileInfo.cpp =================================================================== --- llvm/trunk/lib/MC/MCObjectFileInfo.cpp +++ llvm/trunk/lib/MC/MCObjectFileInfo.cpp @@ -812,16 +812,17 @@ } } -MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash) const { +MCSection *MCObjectFileInfo::getDwarfComdatSection(const char *Name, + uint64_t Hash) const { switch (TT.getObjectFormat()) { case Triple::ELF: - return Ctx->getELFSection(".debug_types", ELF::SHT_PROGBITS, ELF::SHF_GROUP, - 0, utostr(Hash)); + return Ctx->getELFSection(Name, ELF::SHT_PROGBITS, ELF::SHF_GROUP, 0, + utostr(Hash)); case Triple::MachO: case Triple::COFF: case Triple::Wasm: case Triple::UnknownObjectFormat: - report_fatal_error("Cannot get DWARF types section for this object file " + report_fatal_error("Cannot get DWARF comdat section for this object file " "format: not implemented."); break; } Index: llvm/trunk/test/CodeGen/X86/dwarf-headers.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/dwarf-headers.ll +++ llvm/trunk/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/trunk/test/DebugInfo/X86/string-offsets-multiple-cus.ll =================================================================== --- llvm/trunk/test/DebugInfo/X86/string-offsets-multiple-cus.ll +++ llvm/trunk/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.