DebugInfo: Move type units into the debug_types section with appropriate comdat grouping and type unit headers

This commit does not complete the type units feature - there are issues
around fission support (skeletal type units, pubtypes/pubnames) and
hashing of some types including those containing references to types in
other type units.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197073 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Blaikie
2013-12-11 21:36:27 +00:00
parent bd71b0a161
commit 3d2670cc54
8 changed files with 93 additions and 29 deletions

View File

@@ -3056,19 +3056,17 @@ void DwarfDebug::addDwarfTypeUnitType(uint16_t Language, DIE *RefDie,
// referenced type, or possibly walk the precomputed hashes of related types
// at the end.
uint64_t Signature = DIEHash().computeTypeSignature(*Die);
NewTU->setTypeSignature(Signature);
NewTU->setType(Die);
// Remove the References vector and add the type hash.
I->second.first = Signature;
I->second.second = NULL;
NewTU->initSection(
useSplitDwarf() ? Asm->getObjFileLowering().getDwarfInfoDWOSection()
: Asm->getObjFileLowering().getDwarfInfoSection(),
// FIXME: This is subtle (using the info section even when
// this CU is in the dwo section) and necessary for the
// current arange code - ideally it should iterate
// skeleton units, not full units, if it's going to reference skeletons
useSplitDwarf() ? NULL : DwarfInfoSectionSym);
useSplitDwarf()
? Asm->getObjFileLowering().getDwarfTypesDWOSection(Signature)
: Asm->getObjFileLowering().getDwarfTypesSection(Signature));
}
// Populate all the signatures.

View File

@@ -1997,3 +1997,27 @@ void DwarfUnit::emitHeader(const MCSection *ASection,
Asm->OutStreamer.AddComment("Address Size (in bytes)");
Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
}
void DwarfTypeUnit::emitHeader(const MCSection *ASection,
const MCSymbol *ASectionSym) const {
DwarfUnit::emitHeader(ASection, ASectionSym);
Asm->OutStreamer.AddComment("Type Signature");
Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature));
Asm->OutStreamer.AddComment("Type DIE Offset");
Asm->OutStreamer.EmitIntValue(Ty->getOffset(), sizeof(Ty->getOffset()));
}
void DwarfTypeUnit::initSection(const MCSection *Section) {
assert(!this->Section);
this->Section = Section;
// Since each type unit is contained in its own COMDAT section, the begin
// label and the section label are the same. Using the begin label emission in
// DwarfDebug to emit the section label as well is slightly subtle/sneaky, but
// the only other alternative of lazily constructing start-of-section labels
// and storing a mapping in DwarfDebug (or AsmPrinter).
this->SectionSym = this->LabelBegin =
Asm->GetTempSymbol(Section->getLabelBeginName(), getUniqueID());
this->LabelEnd =
Asm->GetTempSymbol(Section->getLabelEndName(), getUniqueID());
this->LabelRange = Asm->GetTempSymbol("gnu_ranges", getUniqueID());
}

View File

@@ -413,14 +413,15 @@ public:
/// Compute the size of a header for this unit, not including the initial
/// length field.
unsigned getHeaderSize() const {
virtual unsigned getHeaderSize() const {
return sizeof(int16_t) + // DWARF version number
sizeof(int32_t) + // Offset Into Abbrev. Section
sizeof(int8_t); // Pointer Size (in bytes)
}
/// Emit the header for this unit, not including the initial length field.
void emitHeader(const MCSection *ASection, const MCSymbol *ASectionSym) const;
virtual void emitHeader(const MCSection *ASection,
const MCSymbol *ASectionSym) const;
protected:
/// getOrCreateStaticMemberDIE - Create new static data member DIE.
@@ -513,12 +514,25 @@ public:
class DwarfTypeUnit : public DwarfUnit {
private:
uint16_t Language;
uint64_t TypeSignature;
const DIE *Ty;
public:
DwarfTypeUnit(unsigned UID, DIE *D, uint16_t Language, AsmPrinter *A,
DwarfDebug *DW, DwarfFile *DWU);
void setTypeSignature(uint64_t Signature) { TypeSignature = Signature; }
void setType(const DIE *Ty) { this->Ty = Ty; }
uint16_t getLanguage() const LLVM_OVERRIDE { return Language; }
/// Emit the header for this unit, not including the initial length field.
void emitHeader(const MCSection *ASection, const MCSymbol *ASectionSym) const
LLVM_OVERRIDE;
unsigned getHeaderSize() const LLVM_OVERRIDE {
return DwarfUnit::getHeaderSize() + sizeof(uint64_t) + // Type Signature
sizeof(uint32_t); // Type DIE Offset
}
void initSection(const MCSection *Section);
};
} // end llvm namespace
#endif