mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-11 21:56:15 +00:00
[DWARFv5] Emit normal type units in .debug_info comdats.
Differential Revision: https://reviews.llvm.org/D54282 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@346540 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9ce4cce931
commit
80691e1b43
@ -241,6 +241,9 @@ public:
|
||||
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 @@ public:
|
||||
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 @@ private:
|
||||
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; }
|
||||
|
@ -2610,9 +2610,14 @@ void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
|
||||
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);
|
||||
}
|
||||
|
@ -812,16 +812,17 @@ void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, bool PIC,
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
@ -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.
|
||||
;
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user