diff options
author | David Blaikie <dblaikie@gmail.com> | 2013-12-11 21:36:27 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2013-12-11 21:36:27 +0000 |
commit | 3d2670cc54ede7f00b496e38fe05ef3ff35b7f6c (patch) | |
tree | 1c205b7fa6956f192ae7966a6cb283293a3c4ae3 /lib | |
parent | bd71b0a1617f77f61d23c38ebe079fff71289164 (diff) | |
download | llvm-3d2670cc54ede7f00b496e38fe05ef3ff35b7f6c.tar.gz llvm-3d2670cc54ede7f00b496e38fe05ef3ff35b7f6c.tar.bz2 llvm-3d2670cc54ede7f00b496e38fe05ef3ff35b7f6c.tar.xz |
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
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 12 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 24 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfUnit.h | 18 | ||||
-rw-r--r-- | lib/MC/MCObjectFileInfo.cpp | 12 |
4 files changed, 57 insertions, 9 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 27348a4b9b..7c61407e87 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -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. diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index f87480d290..709f5bec03 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -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()); +} diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.h b/lib/CodeGen/AsmPrinter/DwarfUnit.h index 26b5f09004..6242a058cf 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.h +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.h @@ -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 diff --git a/lib/MC/MCObjectFileInfo.cpp b/lib/MC/MCObjectFileInfo.cpp index 8ef4a0a6d7..da70728247 100644 --- a/lib/MC/MCObjectFileInfo.cpp +++ b/lib/MC/MCObjectFileInfo.cpp @@ -9,6 +9,7 @@ #include "llvm/MC/MCObjectFileInfo.h" #include "llvm/ADT/Triple.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCSection.h" #include "llvm/MC/MCSectionCOFF.h" @@ -718,6 +719,17 @@ void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm, } } +const MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash) const { + return Ctx->getELFSection(".debug_types", ELF::SHT_PROGBITS, ELF::SHF_GROUP, + SectionKind::getMetadata(), 0, utostr(Hash)); +} + +const MCSection * +MCObjectFileInfo::getDwarfTypesDWOSection(uint64_t Hash) const { + return Ctx->getELFSection(".debug_types.dwo", ELF::SHT_GROUP, 0, + SectionKind::getMetadata(), 0, utostr(Hash)); +} + void MCObjectFileInfo::InitEHFrameSection() { if (Env == IsMachO) EHFrameSection = |