mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-11 16:37:42 +00:00
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:
parent
f681b3f13f
commit
0f4df6dc6f
@ -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; }
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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()); }
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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; }
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 *);
|
||||
|
@ -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");
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user