Store an optional section start label in MCSection.

This makes code that uses section relative expressions (debug info) simpler and
less brittle.

This is still a bit awkward as the symbol is created late and has to be
stored in a mutable field.

I will move the symbol creation earlier in the next patch.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231802 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2015-03-10 16:58:10 +00:00
parent f681b3f13f
commit 0f4df6dc6f
14 changed files with 105 additions and 143 deletions

View File

@ -427,11 +427,7 @@ public:
/// Emit the 4-byte offset of Label from the start of its section. This can
/// be done with a special directive if the target supports it (e.g. cygwin)
/// or by emitting it as an offset from a label at the start of the section.
///
/// SectionLabel is a temporary label emitted at the start of the section
/// that Label lives in.
void EmitSectionOffset(const MCSymbol *Label,
const MCSymbol *SectionLabel) const;
void emitSectionOffset(const MCSymbol *Label) const;
/// Get the value for DW_AT_APPLE_isa. Zero if no isa encoding specified.
virtual unsigned getISAEncoding(const Function *) { return 0; }

View File

@ -21,6 +21,7 @@
namespace llvm {
class MCAsmInfo;
class MCExpr;
class MCSymbol;
class raw_ostream;
/// Instances of this class represent a uniqued identifier for a section in the
@ -33,8 +34,11 @@ private:
MCSection(const MCSection &) = delete;
void operator=(const MCSection &) = delete;
mutable const MCSymbol *Begin;
protected:
MCSection(SectionVariant V, SectionKind K) : Variant(V), Kind(K) {}
MCSection(SectionVariant V, SectionKind K)
: Begin(nullptr), Variant(V), Kind(K) {}
SectionVariant Variant;
SectionKind Kind;
@ -45,6 +49,13 @@ public:
SectionVariant getVariant() const { return Variant; }
const MCSymbol *getBeginSymbol() const { return Begin; }
void setBeginSymbol(const MCSymbol &L) const {
assert(!Begin);
Begin = &L;
}
virtual void PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS,
const MCExpr *Subsection) const = 0;

View File

@ -163,20 +163,13 @@ void AsmPrinter::EmitTTypeReference(const GlobalValue *GV,
///
/// SectionLabel is a temporary label emitted at the start of the section that
/// Label lives in.
void AsmPrinter::EmitSectionOffset(const MCSymbol *Label,
const MCSymbol *SectionLabel) const {
void AsmPrinter::emitSectionOffset(const MCSymbol *Label) const {
// On COFF targets, we have to emit the special .secrel32 directive.
if (MAI->needsDwarfSectionOffsetDirective()) {
OutStreamer.EmitCOFFSecRel32(Label);
return;
}
// If Label has already been emitted, verify that it is in the same section as
// section label for sanity.
assert((!Label->isInSection() ||
&Label->getSection() == &SectionLabel->getSection()) &&
"Section offset using wrong section base for label");
// If the format uses relocations with dwarf, refer to the symbol directly.
if (MAI->doesDwarfUseRelocationsAcrossSections()) {
OutStreamer.EmitSymbolValue(Label, 4);
@ -184,7 +177,7 @@ void AsmPrinter::EmitSectionOffset(const MCSymbol *Label,
}
// Otherwise, emit it as a label difference from the start of the section.
EmitLabelDifference(Label, SectionLabel, 4);
EmitLabelDifference(Label, Label->getSection().getBeginSymbol(), 4);
}
/// EmitDwarfRegOp - Emit dwarf register operation.

View File

@ -588,9 +588,9 @@ void DIELocList::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
MCSymbol *Label = DD->getDebugLocEntries()[Index].Label;
if (AP->MAI->doesDwarfUseRelocationsAcrossSections() && !DD->useSplitDwarf())
AP->EmitSectionOffset(Label, DD->getDebugLocSym());
AP->emitSectionOffset(Label);
else
AP->EmitLabelDifference(Label, DD->getDebugLocSym(), 4);
AP->EmitLabelDifference(Label, Label->getSection().getBeginSymbol(), 4);
}
#ifndef NDEBUG

View File

@ -180,7 +180,7 @@ void DwarfAccelTable::EmitHashes(AsmPrinter *Asm) {
// element in each bucket. This is done via a symbol subtraction from the
// beginning of the section. The non-section symbol will be output later
// when we emit the actual data.
void DwarfAccelTable::EmitOffsets(AsmPrinter *Asm, MCSymbol *SecBegin) {
void DwarfAccelTable::emitOffsets(AsmPrinter *Asm, const MCSymbol *SecBegin) {
uint64_t PrevHash = UINT64_MAX;
for (size_t i = 0, e = Buckets.size(); i < e; ++i) {
for (HashList::const_iterator HI = Buckets[i].begin(),
@ -203,8 +203,7 @@ void DwarfAccelTable::EmitOffsets(AsmPrinter *Asm, MCSymbol *SecBegin) {
// Walk through the buckets and emit the full data for each element in
// the bucket. For the string case emit the dies and the various offsets.
// Terminate each HashData bucket with 0.
void DwarfAccelTable::EmitData(AsmPrinter *Asm, DwarfDebug *D,
MCSymbol *StrSym) {
void DwarfAccelTable::EmitData(AsmPrinter *Asm, DwarfDebug *D) {
for (size_t i = 0, e = Buckets.size(); i < e; ++i) {
uint64_t PrevHash = UINT64_MAX;
for (HashList::const_iterator HI = Buckets[i].begin(),
@ -217,7 +216,7 @@ void DwarfAccelTable::EmitData(AsmPrinter *Asm, DwarfDebug *D,
// Remember to emit the label for our offset.
Asm->OutStreamer.EmitLabel((*HI)->Sym);
Asm->OutStreamer.AddComment((*HI)->Str);
Asm->EmitSectionOffset((*HI)->Data.StrSym, StrSym);
Asm->emitSectionOffset((*HI)->Data.StrSym);
Asm->OutStreamer.AddComment("Num DIEs");
Asm->EmitInt32((*HI)->Data.Values.size());
for (HashDataContents *HD : (*HI)->Data.Values) {
@ -241,8 +240,8 @@ void DwarfAccelTable::EmitData(AsmPrinter *Asm, DwarfDebug *D,
}
// Emit the entire data structure to the output file.
void DwarfAccelTable::Emit(AsmPrinter *Asm, MCSymbol *SecBegin, DwarfDebug *D,
MCSymbol *StrSym) {
void DwarfAccelTable::emit(AsmPrinter *Asm, const MCSymbol *SecBegin,
DwarfDebug *D) {
// Emit the header.
EmitHeader(Asm);
@ -253,10 +252,10 @@ void DwarfAccelTable::Emit(AsmPrinter *Asm, MCSymbol *SecBegin, DwarfDebug *D,
EmitHashes(Asm);
// Emit the offsets.
EmitOffsets(Asm, SecBegin);
emitOffsets(Asm, SecBegin);
// Emit the hash data.
EmitData(Asm, D, StrSym);
EmitData(Asm, D);
}
#ifndef NDEBUG

View File

@ -222,8 +222,8 @@ private:
void EmitHeader(AsmPrinter *);
void EmitBuckets(AsmPrinter *);
void EmitHashes(AsmPrinter *);
void EmitOffsets(AsmPrinter *, MCSymbol *);
void EmitData(AsmPrinter *, DwarfDebug *D, MCSymbol *StrSym);
void emitOffsets(AsmPrinter *, const MCSymbol *);
void EmitData(AsmPrinter *, DwarfDebug *D);
// Allocator for HashData and HashDataContents.
BumpPtrAllocator Allocator;
@ -248,7 +248,7 @@ public:
void AddName(StringRef Name, MCSymbol *StrSym, const DIE *Die,
char Flags = 0);
void FinalizeTable(AsmPrinter *, StringRef);
void Emit(AsmPrinter *, MCSymbol *, DwarfDebug *, MCSymbol *StrSym);
void emit(AsmPrinter *, const MCSymbol *, DwarfDebug *);
#ifndef NDEBUG
void print(raw_ostream &O);
void dump() { print(dbgs()); }

View File

@ -19,7 +19,7 @@ DwarfCompileUnit::DwarfCompileUnit(unsigned UID, DICompileUnit Node,
AsmPrinter *A, DwarfDebug *DW,
DwarfFile *DWU)
: DwarfUnit(UID, dwarf::DW_TAG_compile_unit, Node, A, DW, DWU),
Skeleton(nullptr), LabelBegin(nullptr), BaseAddress(nullptr) {
Skeleton(nullptr), BaseAddress(nullptr) {
insertDIE(Node, &getUnitDie());
}
@ -245,7 +245,7 @@ void DwarfCompileUnit::addSectionLabel(DIE &Die, dwarf::Attribute Attribute,
addSectionDelta(Die, Attribute, Label, Sec);
}
void DwarfCompileUnit::initStmtList(MCSymbol *DwarfLineSectionSym) {
void DwarfCompileUnit::initStmtList() {
// Define start line table label for each Compile Unit.
MCSymbol *LineTableStartSym =
Asm->OutStreamer.getDwarfLineTableSymbol(getUniqueID());
@ -257,8 +257,9 @@ void DwarfCompileUnit::initStmtList(MCSymbol *DwarfLineSectionSym) {
// left in the skeleton CU and so not included.
// The line table entries are not always emitted in assembly, so it
// is not okay to use line_table_start here.
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
addSectionLabel(UnitDie, dwarf::DW_AT_stmt_list, LineTableStartSym,
DwarfLineSectionSym);
TLOF.getDwarfLineSection()->getBeginSymbol());
}
void DwarfCompileUnit::applyStmtList(DIE &D) {
@ -380,9 +381,12 @@ void DwarfCompileUnit::addSectionDelta(DIE &Die, dwarf::Attribute Attribute,
void DwarfCompileUnit::addScopeRangeList(DIE &ScopeDIE,
SmallVector<RangeSpan, 2> Range) {
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
// Emit offset in .debug_range as a relocatable label. emitDIE will handle
// emitting it appropriately.
auto *RangeSectionSym = DD->getRangeSectionSym();
const MCSymbol *RangeSectionSym =
TLOF.getDwarfRangesSection()->getBeginSymbol();
RangeSpanList List(
Asm->GetTempSymbol("debug_ranges", DD->getNextRangeNumber()),
@ -711,14 +715,14 @@ void DwarfCompileUnit::collectDeadVariables(DISubprogram SP) {
}
}
void DwarfCompileUnit::emitHeader(const MCSymbol *ASectionSym) {
void DwarfCompileUnit::emitHeader(bool UseOffsets) {
// Don't bother labeling the .dwo unit, as its offset isn't used.
if (!Skeleton) {
LabelBegin = Asm->createTempSymbol("cu_begin", getUniqueID());
Asm->OutStreamer.EmitLabel(LabelBegin);
}
DwarfUnit::emitHeader(ASectionSym);
DwarfUnit::emitHeader(UseOffsets);
}
/// addGlobalName - Add a new global name to the compile unit.

View File

@ -36,9 +36,6 @@ class DwarfCompileUnit : public DwarfUnit {
/// Skeleton unit associated with this unit.
DwarfCompileUnit *Skeleton;
/// A label at the start of the non-dwo section related to this unit.
MCSymbol *SectionSym;
/// The start of the unit within its section.
MCSymbol *LabelBegin;
@ -76,7 +73,7 @@ public:
return Skeleton;
}
void initStmtList(MCSymbol *DwarfLineSectionSym);
void initStmtList();
/// Apply the DW_AT_stmt_list from this compile unit to the specified DIE.
void applyStmtList(DIE &D);
@ -168,17 +165,9 @@ public:
/// Set the skeleton unit associated with this unit.
void setSkeleton(DwarfCompileUnit &Skel) { Skeleton = &Skel; }
MCSymbol *getSectionSym() const {
const MCSymbol *getSectionSym() const {
assert(Section);
return SectionSym;
}
/// Pass in the SectionSym even though we could recreate it in every compile
/// unit (type units will have actually distinct symbols once they're in
/// comdat sections).
void initSection(const MCSection *Section, MCSymbol *SectionSym) {
DwarfUnit::initSection(Section);
this->SectionSym = SectionSym;
return Section->getBeginSymbol();
}
unsigned getLength() {
@ -186,7 +175,7 @@ public:
getHeaderSize() + UnitDie.getSize();
}
void emitHeader(const MCSymbol *ASectionSym) override;
void emitHeader(bool UseOffsets) override;
MCSymbol *getLabelBegin() const {
assert(Section);

View File

@ -202,11 +202,6 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
dwarf::DW_FORM_data4)),
AccelTypes(TypeAtoms) {
DwarfInfoSectionSym = DwarfAbbrevSectionSym = DwarfStrSectionSym = nullptr;
DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = nullptr;
DwarfLineSectionSym = nullptr;
DwarfAddrSectionSym = nullptr;
DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = nullptr;
CurFn = nullptr;
CurMI = nullptr;
@ -248,12 +243,12 @@ DwarfDebug::~DwarfDebug() { }
// Switch to the specified MCSection and emit an assembler
// temporary label to it if SymbolStem is specified.
static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
const char *SymbolStem) {
static void emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
StringRef SymbolStem) {
Asm->OutStreamer.SwitchSection(Section);
MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
Asm->OutStreamer.EmitLabel(TmpSym);
return TmpSym;
Section->setBeginSymbol(*TmpSym);
}
static bool isObjCClass(StringRef Name) {
@ -401,7 +396,7 @@ DwarfCompileUnit &DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
NewCU.addString(Die, dwarf::DW_AT_name, FN);
if (!useSplitDwarf()) {
NewCU.initStmtList(DwarfLineSectionSym);
NewCU.initStmtList();
// If we're using split dwarf the compilation dir is going to be in the
// skeleton CU and so we don't need to duplicate it here.
@ -423,11 +418,9 @@ DwarfCompileUnit &DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
dwarf::DW_FORM_data1, RVer);
if (useSplitDwarf())
NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection(),
DwarfInfoDWOSectionSym);
NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection());
else
NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
DwarfInfoSectionSym);
NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection());
CUMap.insert(std::make_pair(DIUnit, &NewCU));
CUDieMap.insert(std::make_pair(&Die, &NewCU));
@ -557,6 +550,8 @@ void DwarfDebug::collectDeadVariables() {
}
void DwarfDebug::finalizeModuleInfo() {
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
finishSubprogramDefinitions();
finishVariableDefinitions();
@ -586,13 +581,16 @@ void DwarfDebug::finalizeModuleInfo() {
// We don't keep track of which addresses are used in which CU so this
// is a bit pessimistic under LTO.
if (!AddrPool.isEmpty())
if (!AddrPool.isEmpty()) {
const MCSymbol *Sym = TLOF.getDwarfAddrSection()->getBeginSymbol();
SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_addr_base,
DwarfAddrSectionSym, DwarfAddrSectionSym);
if (!SkCU->getRangeLists().empty())
Sym, Sym);
}
if (!SkCU->getRangeLists().empty()) {
const MCSymbol *Sym = TLOF.getDwarfRangesSection()->getBeginSymbol();
SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_ranges_base,
DwarfDebugRangeSectionSym,
DwarfDebugRangeSectionSym);
Sym, Sym);
}
}
// If we have code split among multiple sections or non-contiguous
@ -623,13 +621,14 @@ void DwarfDebug::finalizeModuleInfo() {
// Emit all Dwarf sections that should come after the content.
void DwarfDebug::endModule() {
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
assert(CurFn == nullptr);
assert(CurMI == nullptr);
// If we aren't actually generating debug info (check beginModule -
// conditionalized on !DisableDebugInfoPrinting and the presence of the
// llvm.dbg.cu metadata node)
if (!DwarfInfoSectionSym)
if (!TLOF.getDwarfInfoSection()->getBeginSymbol())
return;
// Finalize the debug info for the module.
@ -637,6 +636,12 @@ void DwarfDebug::endModule() {
emitDebugStr();
if (useSplitDwarf())
emitDebugLocDWO();
else
// Emit info into a debug loc section.
emitDebugLoc();
// Emit all the DIEs into a debug info section.
emitDebugInfo();
@ -655,12 +660,9 @@ void DwarfDebug::endModule() {
emitDebugInfoDWO();
emitDebugAbbrevDWO();
emitDebugLineDWO();
emitDebugLocDWO();
// Emit DWO addresses.
AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
} else
// Emit info into a debug loc section.
emitDebugLoc();
}
// Emit info into the dwarf accelerator table sections.
if (useDwarfAccelTables()) {
@ -1304,43 +1306,30 @@ void DwarfDebug::emitSectionLabels() {
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
// Dwarf sections base addresses.
DwarfInfoSectionSym =
emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
if (useSplitDwarf()) {
DwarfInfoDWOSectionSym =
emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo");
DwarfTypesDWOSectionSym = emitSectionSym(
Asm, TLOF.getDwarfTypesDWOSection(), "section_types_dwo");
emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo");
emitSectionSym(Asm, TLOF.getDwarfTypesDWOSection(), "section_types_dwo");
}
DwarfAbbrevSectionSym =
emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
if (useSplitDwarf())
DwarfAbbrevDWOSectionSym = emitSectionSym(
Asm, TLOF.getDwarfAbbrevDWOSection(), "section_abbrev_dwo");
emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(), "section_abbrev_dwo");
DwarfLineSectionSym =
emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
DwarfStrSectionSym =
emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
if (useSplitDwarf()) {
DwarfStrDWOSectionSym =
emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
DwarfAddrSectionSym =
emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
DwarfDebugLocSectionSym =
emitSectionSym(Asm, TLOF.getDwarfLocDWOSection(), "skel_loc");
emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
emitSectionSym(Asm, TLOF.getDwarfLocDWOSection(), "skel_loc");
} else
DwarfDebugLocSectionSym =
emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc");
DwarfDebugRangeSectionSym =
emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range");
emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc");
emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range");
}
// Emit the debug info section.
void DwarfDebug::emitDebugInfo() {
DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Holder.emitUnits(DwarfAbbrevSectionSym);
Holder.emitUnits(/* UseOffsets */ false);
}
// Emit the abbreviation section.
@ -1377,12 +1366,10 @@ void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
void DwarfDebug::emitAccel(DwarfAccelTable &Accel, const MCSection *Section,
StringRef TableName, StringRef SymName) {
Accel.FinalizeTable(Asm, TableName);
Asm->OutStreamer.SwitchSection(Section);
auto *SectionBegin = Asm->GetTempSymbol(SymName);
Asm->OutStreamer.EmitLabel(SectionBegin);
emitSectionSym(Asm, Section, SymName);
// Emit the full data.
Accel.Emit(Asm, SectionBegin, this, DwarfStrSectionSym);
Accel.emit(Asm, Section->getBeginSymbol(), this);
}
// Emit visible names into a hashed accelerator table section.
@ -1508,7 +1495,7 @@ void DwarfDebug::emitDebugPubSection(
Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Asm->EmitSectionOffset(TheU->getLabelBegin(), TheU->getSectionSym());
Asm->emitSectionOffset(TheU->getLabelBegin());
Asm->OutStreamer.AddComment("Compilation Unit Length");
Asm->EmitInt32(TheU->getLength());
@ -1856,7 +1843,7 @@ void DwarfDebug::emitDebugARanges() {
Asm->OutStreamer.AddComment("DWARF Arange version number");
Asm->EmitInt16(dwarf::DW_ARANGES_VERSION);
Asm->OutStreamer.AddComment("Offset Into Debug Info Section");
Asm->EmitSectionOffset(CU->getLabelBegin(), CU->getSectionSym());
Asm->emitSectionOffset(CU->getLabelBegin());
Asm->OutStreamer.AddComment("Address Size (in bytes)");
Asm->EmitInt8(PtrSize);
Asm->OutStreamer.AddComment("Segment Size (in bytes)");
@ -1952,10 +1939,9 @@ DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
auto OwnedUnit = make_unique<DwarfCompileUnit>(
CU.getUniqueID(), CU.getCUNode(), Asm, this, &SkeletonHolder);
DwarfCompileUnit &NewCU = *OwnedUnit;
NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
DwarfInfoSectionSym);
NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection());
NewCU.initStmtList(DwarfLineSectionSym);
NewCU.initStmtList();
initSkeletonUnit(CU, NewCU.getUnitDie(), std::move(OwnedUnit));
@ -1966,9 +1952,8 @@ DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
// compile units that would normally be in debug_info.
void DwarfDebug::emitDebugInfoDWO() {
assert(useSplitDwarf() && "No split dwarf debug info?");
// Don't pass an abbrev symbol, using a constant zero instead so as not to
// emit relocations into the dwo file.
InfoHolder.emitUnits(/* AbbrevSymbol */ nullptr);
// Don't emit relocations into the dwo file.
InfoHolder.emitUnits(/* UseOffsets */ true);
}
// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the

View File

@ -243,16 +243,6 @@ class DwarfDebug : public AsmPrinterHandler {
// If nonnull, stores the CU in which the previous subprogram was contained.
const DwarfCompileUnit *PrevCU;
// Section Symbols: these are assembler temporary labels that are emitted at
// the beginning of each supported dwarf section. These are used to form
// section offsets and are created by EmitSectionLabels.
MCSymbol *DwarfInfoSectionSym, *DwarfAbbrevSectionSym;
MCSymbol *DwarfStrSectionSym, *TextSectionSym, *DwarfDebugRangeSectionSym;
MCSymbol *DwarfDebugLocSectionSym, *DwarfLineSectionSym, *DwarfAddrSectionSym;
MCSymbol *DwarfInfoDWOSectionSym, *DwarfAbbrevDWOSectionSym;
MCSymbol *DwarfTypesDWOSectionSym;
MCSymbol *DwarfStrDWOSectionSym;
// As an optimization, there is no need to emit an entry in the directory
// table for the same directory as DW_AT_comp_dir.
StringRef CompilationDir;
@ -559,15 +549,6 @@ public:
/// Returns the Dwarf Version.
unsigned getDwarfVersion() const { return DwarfVersion; }
/// Returns the section symbol for the .debug_loc section.
MCSymbol *getDebugLocSym() const { return DwarfDebugLocSectionSym; }
/// Returns the section symbol for the .debug_str section.
MCSymbol *getDebugStrSym() const { return DwarfStrSectionSym; }
/// Returns the section symbol for the .debug_ranges section.
MCSymbol *getRangeSectionSym() const { return DwarfDebugRangeSectionSym; }
/// Returns the previous CU that was being updated
const DwarfCompileUnit *getPrevCU() const { return PrevCU; }
void setPrevCU(const DwarfCompileUnit *PrevCU) { this->PrevCU = PrevCU; }

View File

@ -47,13 +47,13 @@ void DwarfFile::addUnit(std::unique_ptr<DwarfUnit> U) {
// Emit the various dwarf units to the unit section USection with
// the abbreviations going into ASection.
void DwarfFile::emitUnits(const MCSymbol *ASectionSym) {
void DwarfFile::emitUnits(bool UseOffsets) {
for (const auto &TheU : CUs) {
DIE &Die = TheU->getUnitDie();
const MCSection *USection = TheU->getSection();
Asm->OutStreamer.SwitchSection(USection);
TheU->emitHeader(ASectionSym);
TheU->emitHeader(UseOffsets);
Asm->emitDwarfDIE(Die);
}

View File

@ -80,7 +80,7 @@ public:
/// \brief Emit all of the units to the section listed with the given
/// abbreviation section.
void emitUnits(const MCSymbol *ASectionSym);
void emitUnits(bool UseOffsets);
/// \brief Emit a set of abbreviations to the specific section.
void emitAbbrevs(const MCSection *);

View File

@ -264,12 +264,14 @@ void DwarfUnit::addIndexedString(DIE &Die, dwarf::Attribute Attribute,
/// to be in the local string pool instead of indirected.
void DwarfUnit::addLocalString(DIE &Die, dwarf::Attribute Attribute,
StringRef String) {
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
MCSymbol *Symb = DU->getStringPool().getSymbol(*Asm, String);
DIEValue *Value;
if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Value = new (DIEValueAllocator) DIELabel(Symb);
else
Value = new (DIEValueAllocator) DIEDelta(Symb, DD->getDebugStrSym());
Value = new (DIEValueAllocator)
DIEDelta(Symb, TLOF.getDwarfStrSection()->getBeginSymbol());
DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
Die.addValue(Attribute, dwarf::DW_FORM_strp, Str);
}
@ -1604,7 +1606,7 @@ DIE *DwarfUnit::getOrCreateStaticMemberDIE(DIDerivedType DT) {
return &StaticMemberDIE;
}
void DwarfUnit::emitHeader(const MCSymbol *ASectionSym) {
void DwarfUnit::emitHeader(bool UseOffsets) {
// Emit size of content not including length itself
Asm->OutStreamer.AddComment("Length of Unit");
Asm->EmitInt32(getHeaderSize() + UnitDie.getSize());
@ -1612,14 +1614,16 @@ void DwarfUnit::emitHeader(const MCSymbol *ASectionSym) {
Asm->OutStreamer.AddComment("DWARF version number");
Asm->EmitInt16(DD->getDwarfVersion());
Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
// We share one abbreviations table across all units so it's always at the
// start of the section. Use a relocatable offset where needed to ensure
// linking doesn't invalidate that offset.
if (ASectionSym)
Asm->EmitSectionOffset(ASectionSym, ASectionSym);
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
if (!UseOffsets)
Asm->emitSectionOffset(TLOF.getDwarfAbbrevSection()->getBeginSymbol());
else
// Use a constant value when no symbol is provided.
Asm->EmitInt32(0);
Asm->OutStreamer.AddComment("Address Size (in bytes)");
Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
}
@ -1629,8 +1633,8 @@ void DwarfUnit::initSection(const MCSection *Section) {
this->Section = Section;
}
void DwarfTypeUnit::emitHeader(const MCSymbol *ASectionSym) {
DwarfUnit::emitHeader(ASectionSym);
void DwarfTypeUnit::emitHeader(bool UseOffsets) {
DwarfUnit::emitHeader(UseOffsets);
Asm->OutStreamer.AddComment("Type Signature");
Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature));
Asm->OutStreamer.AddComment("Type DIE Offset");

View File

@ -120,7 +120,6 @@ protected:
DwarfUnit(unsigned UID, dwarf::Tag, DICompileUnit CU, AsmPrinter *A,
DwarfDebug *DW, DwarfFile *DWU);
void initSection(const MCSection *Section);
/// Add a string attribute data and value.
void addLocalString(DIE &Die, dwarf::Attribute Attribute, StringRef Str);
@ -132,6 +131,8 @@ protected:
public:
virtual ~DwarfUnit();
void initSection(const MCSection *Section);
const MCSection *getSection() const {
assert(Section);
return Section;
@ -321,7 +322,7 @@ public:
}
/// Emit the header for this unit, not including the initial length field.
virtual void emitHeader(const MCSymbol *ASectionSym);
virtual void emitHeader(bool UseOffsets);
virtual DwarfCompileUnit &getCU() = 0;
@ -423,12 +424,11 @@ public:
void setType(const DIE *Ty) { this->Ty = Ty; }
/// Emit the header for this unit, not including the initial length field.
void emitHeader(const MCSymbol *ASectionSym) override;
void emitHeader(bool UseOffsets) override;
unsigned getHeaderSize() const override {
return DwarfUnit::getHeaderSize() + sizeof(uint64_t) + // Type Signature
sizeof(uint32_t); // Type DIE Offset
}
using DwarfUnit::initSection;
DwarfCompileUnit &getCU() override { return CU; }
};
} // end llvm namespace