summaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/AsmPrinter
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/AsmPrinter')
-rw-r--r--lib/CodeGen/AsmPrinter/AsmPrinter.cpp66
-rw-r--r--lib/CodeGen/AsmPrinter/DIE.cpp1
-rw-r--r--lib/CodeGen/AsmPrinter/DIE.h6
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfDebug.cpp120
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfDebug.h23
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfException.h11
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfWriter.cpp6
-rw-r--r--lib/CodeGen/AsmPrinter/Makefile2
8 files changed, 87 insertions, 148 deletions
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index e931904..bc3af9a 100644
--- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -45,8 +45,9 @@ AsmPrinter::AsmPrinter(raw_ostream &o, TargetMachine &tm,
const TargetAsmInfo *T, CodeGenOpt::Level OL, bool VDef)
: MachineFunctionPass(&ID), FunctionNumber(0), OptLevel(OL), O(o),
TM(tm), TAI(T), TRI(tm.getRegisterInfo()),
- IsInTextSection(false)
-{
+ IsInTextSection(false), LastMI(0), LastFn(0), Counter(~0U),
+ PrevDLT(0, ~0U, ~0U) {
+ DW = 0; MMI = 0;
switch (AsmVerbose) {
case cl::BOU_UNSET: VerboseAsm = VDef; break;
case cl::BOU_TRUE: VerboseAsm = true; break;
@@ -177,28 +178,44 @@ bool AsmPrinter::doInitialization(Module &M) {
SwitchToDataSection(""); // Reset back to no section.
- if (TAI->doesSupportDebugInformation()
- || TAI->doesSupportExceptionHandling()) {
- MachineModuleInfo *MMI = getAnalysisIfAvailable<MachineModuleInfo>();
- if (MMI) {
+ if (TAI->doesSupportDebugInformation() ||
+ TAI->doesSupportExceptionHandling()) {
+ MMI = getAnalysisIfAvailable<MachineModuleInfo>();
+ if (MMI)
MMI->AnalyzeModule(M);
- DW = getAnalysisIfAvailable<DwarfWriter>();
- if (DW)
- DW->BeginModule(&M, MMI, O, this, TAI);
- }
+ DW = getAnalysisIfAvailable<DwarfWriter>();
+ if (DW)
+ DW->BeginModule(&M, MMI, O, this, TAI);
}
return false;
}
bool AsmPrinter::doFinalization(Module &M) {
+ // Emit final debug information.
+ if (TAI->doesSupportDebugInformation() || TAI->doesSupportExceptionHandling())
+ DW->EndModule();
+
+ // If the target wants to know about weak references, print them all.
if (TAI->getWeakRefDirective()) {
- if (!ExtWeakSymbols.empty())
- SwitchToDataSection("");
-
- for (std::set<const GlobalValue*>::iterator i = ExtWeakSymbols.begin(),
- e = ExtWeakSymbols.end(); i != e; ++i)
- O << TAI->getWeakRefDirective() << Mang->getValueName(*i) << '\n';
+ // FIXME: This is not lazy, it would be nice to only print weak references
+ // to stuff that is actually used. Note that doing so would require targets
+ // to notice uses in operands (due to constant exprs etc). This should
+ // happen with the MC stuff eventually.
+ SwitchToDataSection("");
+
+ // Print out module-level global variables here.
+ for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
+ I != E; ++I) {
+ if (I->hasExternalWeakLinkage())
+ O << TAI->getWeakRefDirective() << Mang->getValueName(I) << '\n';
+ }
+
+ for (Module::const_iterator I = M.begin(), E = M.end();
+ I != E; ++I) {
+ if (I->hasExternalWeakLinkage())
+ O << TAI->getWeakRefDirective() << Mang->getValueName(I) << '\n';
+ }
}
if (TAI->getSetDirective()) {
@@ -207,7 +224,7 @@ bool AsmPrinter::doFinalization(Module &M) {
O << '\n';
for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end();
- I!=E; ++I) {
+ I != E; ++I) {
std::string Name = Mang->getValueName(I);
std::string Target;
@@ -235,12 +252,13 @@ bool AsmPrinter::doFinalization(Module &M) {
// If we don't have any trampolines, then we don't require stack memory
// to be executable. Some targets have a directive to declare this.
- Function* InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
+ Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty())
if (TAI->getNonexecutableStackDirective())
O << TAI->getNonexecutableStackDirective() << '\n';
delete Mang; Mang = 0;
+ DW = 0; MMI = 0;
return false;
}
@@ -1298,20 +1316,15 @@ void AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) const {
if (VerboseAsm)
O << TAI->getCommentString();
} else if (!strcmp(Code, "uid")) {
- // Assign a unique ID to this machine instruction.
- static const MachineInstr *LastMI = 0;
- static const Function *F = 0;
- static unsigned Counter = 0U-1;
-
// Comparing the address of MI isn't sufficient, because machineinstrs may
// be allocated to the same address across functions.
const Function *ThisF = MI->getParent()->getParent()->getFunction();
- // If this is a new machine instruction, bump the counter.
- if (LastMI != MI || F != ThisF) {
+ // If this is a new LastFn instruction, bump the counter.
+ if (LastMI != MI || LastFn != ThisF) {
++Counter;
LastMI = MI;
- F = ThisF;
+ LastFn = ThisF;
}
O << Counter;
} else {
@@ -1326,7 +1339,6 @@ void AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) const {
void AsmPrinter::processDebugLoc(DebugLoc DL) {
if (TAI->doesSupportDebugInformation() && DW->ShouldEmitDwarfDebug()) {
if (!DL.isUnknown()) {
- static DebugLocTuple PrevDLT(0, ~0U, ~0U);
DebugLocTuple CurDLT = MF->getDebugLocTuple(DL);
if (CurDLT.CompileUnit != 0 && PrevDLT != CurDLT)
diff --git a/lib/CodeGen/AsmPrinter/DIE.cpp b/lib/CodeGen/AsmPrinter/DIE.cpp
index dc149cf..01c431c 100644
--- a/lib/CodeGen/AsmPrinter/DIE.cpp
+++ b/lib/CodeGen/AsmPrinter/DIE.cpp
@@ -126,7 +126,6 @@ void DIE::Profile(FoldingSetNodeID &ID) {
#ifndef NDEBUG
void DIE::print(std::ostream &O, unsigned IncIndent) {
- static unsigned IndentCount = 0;
IndentCount += IncIndent;
const std::string Indent(IndentCount, ' ');
bool isBlock = Abbrev.getTag() == 0;
diff --git a/lib/CodeGen/AsmPrinter/DIE.h b/lib/CodeGen/AsmPrinter/DIE.h
index b14d91c..5b60327 100644
--- a/lib/CodeGen/AsmPrinter/DIE.h
+++ b/lib/CodeGen/AsmPrinter/DIE.h
@@ -141,9 +141,13 @@ namespace llvm {
/// Abstract compile unit.
CompileUnit *AbstractCU;
+
+ // Private data for print()
+ mutable unsigned IndentCount;
public:
explicit DIE(unsigned Tag)
- : Abbrev(Tag, dwarf::DW_CHILDREN_no), Offset(0), Size(0) {}
+ : Abbrev(Tag, dwarf::DW_CHILDREN_no), Offset(0),
+ Size(0), IndentCount(0) {}
virtual ~DIE();
// Accessors.
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 9d340e3..cbe542b 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -141,9 +141,12 @@ class VISIBILITY_HIDDEN DbgScope {
SmallVector<DbgScope *, 4> Scopes; // Scopes defined in scope.
SmallVector<DbgVariable *, 8> Variables;// Variables declared in scope.
SmallVector<DbgConcreteScope *, 8> ConcreteInsts;// Concrete insts of funcs.
+
+ // Private state for dump()
+ mutable unsigned IndentLevel;
public:
DbgScope(DbgScope *P, DIDescriptor D)
- : Parent(P), Desc(D), StartLabelID(0), EndLabelID(0) {}
+ : Parent(P), Desc(D), StartLabelID(0), EndLabelID(0), IndentLevel(0) {}
virtual ~DbgScope();
// Accessors.
@@ -176,7 +179,6 @@ public:
#ifndef NDEBUG
void DbgScope::dump() const {
- static unsigned IndentLevel = 0;
std::string Indent(IndentLevel, ' ');
cerr << Indent; Desc.dump();
@@ -1240,27 +1242,7 @@ void DwarfDebug::ConstructCompileUnit(GlobalVariable *GV) {
CompileUnits.push_back(Unit);
}
-/// ConstructCompileUnits - Create a compile unit DIEs.
-void DwarfDebug::ConstructCompileUnits() {
- GlobalVariable *Root = M->getGlobalVariable("llvm.dbg.compile_units");
- if (!Root)
- return;
- assert(Root->hasLinkOnceLinkage() && Root->hasOneUse() &&
- "Malformed compile unit descriptor anchor type");
- Constant *RootC = cast<Constant>(*Root->use_begin());
- assert(RootC->hasNUsesOrMore(1) &&
- "Malformed compile unit descriptor anchor type");
-
- for (Value::use_iterator UI = RootC->use_begin(), UE = Root->use_end();
- UI != UE; ++UI)
- for (Value::use_iterator UUI = UI->use_begin(), UUE = UI->use_end();
- UUI != UUE; ++UUI) {
- GlobalVariable *GV = cast<GlobalVariable>(*UUI);
- ConstructCompileUnit(GV);
- }
-}
-
-bool DwarfDebug::ConstructGlobalVariableDIE(GlobalVariable *GV) {
+void DwarfDebug::ConstructGlobalVariableDIE(GlobalVariable *GV) {
DIGlobalVariable DI_GV(GV);
CompileUnit *DW_Unit = MainCU;
if (!DW_Unit)
@@ -1269,7 +1251,7 @@ bool DwarfDebug::ConstructGlobalVariableDIE(GlobalVariable *GV) {
// Check for pre-existence.
DIE *&Slot = DW_Unit->getDieMapSlotFor(DI_GV.getGV());
if (Slot)
- return false;
+ return;
DIE *VariableDie = CreateGlobalVariableDIE(DW_Unit, DI_GV);
@@ -1290,33 +1272,10 @@ bool DwarfDebug::ConstructGlobalVariableDIE(GlobalVariable *GV) {
// Expose as global. FIXME - need to check external flag.
std::string Name;
DW_Unit->AddGlobal(DI_GV.getName(Name), VariableDie);
- return true;
+ return;
}
-/// ConstructGlobalVariableDIEs - Create DIEs for each of the externally visible
-/// global variables. Return true if at least one global DIE is created.
-bool DwarfDebug::ConstructGlobalVariableDIEs() {
- GlobalVariable *Root = M->getGlobalVariable("llvm.dbg.global_variables");
- if (!Root)
- return false;
-
- assert(Root->hasLinkOnceLinkage() && Root->hasOneUse() &&
- "Malformed global variable descriptor anchor type");
- Constant *RootC = cast<Constant>(*Root->use_begin());
- assert(RootC->hasNUsesOrMore(1) &&
- "Malformed global variable descriptor anchor type");
-
- bool Result = false;
- for (Value::use_iterator UI = RootC->use_begin(), UE = Root->use_end();
- UI != UE; ++UI)
- for (Value::use_iterator UUI = UI->use_begin(), UUE = UI->use_end();
- UUI != UUE; ++UUI)
- Result |= ConstructGlobalVariableDIE(cast<GlobalVariable>(*UUI));
-
- return Result;
-}
-
-bool DwarfDebug::ConstructSubprogram(GlobalVariable *GV) {
+void DwarfDebug::ConstructSubprogram(GlobalVariable *GV) {
DISubprogram SP(GV);
CompileUnit *Unit = MainCU;
if (!Unit)
@@ -1325,12 +1284,12 @@ bool DwarfDebug::ConstructSubprogram(GlobalVariable *GV) {
// Check for pre-existence.
DIE *&Slot = Unit->getDieMapSlotFor(GV);
if (Slot)
- return false;
+ return;
if (!SP.isDefinition())
// This is a method declaration which will be handled while constructing
// class type.
- return false;
+ return;
DIE *SubprogramDie = CreateSubprogramDIE(Unit, SP);
@@ -1343,40 +1302,27 @@ bool DwarfDebug::ConstructSubprogram(GlobalVariable *GV) {
// Expose as global.
std::string Name;
Unit->AddGlobal(SP.getName(Name), SubprogramDie);
- return true;
+ return;
}
-/// ConstructSubprograms - Create DIEs for each of the externally visible
-/// subprograms. Return true if at least one subprogram DIE is created.
-bool DwarfDebug::ConstructSubprograms() {
- GlobalVariable *Root = M->getGlobalVariable("llvm.dbg.subprograms");
- if (!Root)
- return false;
-
- assert(Root->hasLinkOnceLinkage() && Root->hasOneUse() &&
- "Malformed subprogram descriptor anchor type");
- Constant *RootC = cast<Constant>(*Root->use_begin());
- assert(RootC->hasNUsesOrMore(1) &&
- "Malformed subprogram descriptor anchor type");
+ /// BeginModule - Emit all Dwarf sections that should come prior to the
+ /// content. Create global DIEs and emit initial debug info sections.
+ /// This is inovked by the target AsmPrinter.
+void DwarfDebug::BeginModule(Module *M, MachineModuleInfo *mmi) {
+ this->M = M;
- bool Result = false;
- for (Value::use_iterator UI = RootC->use_begin(), UE = Root->use_end();
- UI != UE; ++UI)
- for (Value::use_iterator UUI = UI->use_begin(), UUE = UI->use_end();
- UUI != UUE; ++UUI)
- Result |= ConstructSubprogram(cast<GlobalVariable>(*UUI));
-
- return Result;
-}
-
-/// SetDebugInfo - Create global DIEs and emit initial debug info sections.
-/// This is inovked by the target AsmPrinter.
-void DwarfDebug::SetDebugInfo(MachineModuleInfo *mmi) {
if (TimePassesIsEnabled)
DebugTimer->startTimer();
+ SmallVector<GlobalVariable *, 2> CUs;
+ SmallVector<GlobalVariable *, 4> GVs;
+ SmallVector<GlobalVariable *, 4> SPs;
+ CollectDebugInfoAnchors(*M, CUs, GVs, SPs);
+
// Create all the compile unit DIEs.
- ConstructCompileUnits();
+ for (SmallVector<GlobalVariable *, 2>::iterator I = CUs.begin(),
+ E = CUs.end(); I != E; ++I)
+ ConstructCompileUnit(*I);
if (CompileUnits.empty()) {
if (TimePassesIsEnabled)
@@ -1385,21 +1331,25 @@ void DwarfDebug::SetDebugInfo(MachineModuleInfo *mmi) {
return;
}
- // Create DIEs for each of the externally visible global variables.
- bool globalDIEs = ConstructGlobalVariableDIEs();
-
- // Create DIEs for each of the externally visible subprograms.
- bool subprogramDIEs = ConstructSubprograms();
-
// If there is not any debug info available for any global variables and any
// subprograms then there is not any debug info to emit.
- if (!globalDIEs && !subprogramDIEs) {
+ if (GVs.empty() && SPs.empty()) {
if (TimePassesIsEnabled)
DebugTimer->stopTimer();
return;
}
+ // Create DIEs for each of the externally visible global variables.
+ for (SmallVector<GlobalVariable *, 4>::iterator I = GVs.begin(),
+ E = GVs.end(); I != E; ++I)
+ ConstructGlobalVariableDIE(*I);
+
+ // Create DIEs for each of the externally visible subprograms.
+ for (SmallVector<GlobalVariable *, 4>::iterator I = SPs.begin(),
+ E = SPs.end(); I != E; ++I)
+ ConstructSubprogram(*I);
+
MMI = mmi;
shouldEmit = true;
MMI->setDebugInfoAvailability(true);
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h
index 9824566..111ec33 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.h
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h
@@ -460,21 +460,10 @@ class VISIBILITY_HIDDEN DwarfDebug : public Dwarf {
void ConstructCompileUnit(GlobalVariable *GV);
- /// ConstructCompileUnits - Create a compile unit DIEs.
- void ConstructCompileUnits();
+ void ConstructGlobalVariableDIE(GlobalVariable *GV);
- bool ConstructGlobalVariableDIE(GlobalVariable *GV);
+ void ConstructSubprogram(GlobalVariable *GV);
- /// ConstructGlobalVariableDIEs - Create DIEs for each of the externally
- /// visible global variables. Return true if at least one global DIE is
- /// created.
- bool ConstructGlobalVariableDIEs();
-
- bool ConstructSubprogram(GlobalVariable *GV);
-
- /// ConstructSubprograms - Create DIEs for each of the externally visible
- /// subprograms. Return true if at least one subprogram DIE is created.
- bool ConstructSubprograms();
public:
//===--------------------------------------------------------------------===//
// Main entry points.
@@ -486,15 +475,9 @@ public:
/// be emitted.
bool ShouldEmitDwarfDebug() const { return shouldEmit; }
- /// SetDebugInfo - Create global DIEs and emit initial debug info sections.
- /// This is inovked by the target AsmPrinter.
- void SetDebugInfo(MachineModuleInfo *mmi);
-
/// BeginModule - Emit all Dwarf sections that should come prior to the
/// content.
- void BeginModule(Module *M) {
- this->M = M;
- }
+ void BeginModule(Module *M, MachineModuleInfo *MMI);
/// EndModule - Emit all Dwarf sections that should come after the content.
///
diff --git a/lib/CodeGen/AsmPrinter/DwarfException.h b/lib/CodeGen/AsmPrinter/DwarfException.h
index 4479af2..f1c3e56 100644
--- a/lib/CodeGen/AsmPrinter/DwarfException.h
+++ b/lib/CodeGen/AsmPrinter/DwarfException.h
@@ -149,16 +149,11 @@ public:
DwarfException(raw_ostream &OS, AsmPrinter *A, const TargetAsmInfo *T);
virtual ~DwarfException();
- /// SetModuleInfo - Set machine module information when it's known that pass
- /// manager has created it. Set by the target AsmPrinter.
- void SetModuleInfo(MachineModuleInfo *mmi) {
- MMI = mmi;
- }
-
/// BeginModule - Emit all exception information that should come prior to the
/// content.
- void BeginModule(Module *M) {
- this->M = M;
+ void BeginModule(Module *m, MachineModuleInfo *mmi) {
+ this->M = m;
+ this->MMI = mmi;
}
/// EndModule - Emit all exception information that should come after the
diff --git a/lib/CodeGen/AsmPrinter/DwarfWriter.cpp b/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
index 483ee559..89084989 100644
--- a/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
@@ -42,10 +42,8 @@ void DwarfWriter::BeginModule(Module *M,
const TargetAsmInfo *T) {
DE = new DwarfException(OS, A, T);
DD = new DwarfDebug(OS, A, T);
- DE->BeginModule(M);
- DD->BeginModule(M);
- DD->SetDebugInfo(MMI);
- DE->SetModuleInfo(MMI);
+ DE->BeginModule(M, MMI);
+ DD->BeginModule(M, MMI);
}
/// EndModule - Emit all Dwarf sections that should come after the content.
diff --git a/lib/CodeGen/AsmPrinter/Makefile b/lib/CodeGen/AsmPrinter/Makefile
index cb5b3f6..8f65d8d 100644
--- a/lib/CodeGen/AsmPrinter/Makefile
+++ b/lib/CodeGen/AsmPrinter/Makefile
@@ -9,7 +9,5 @@
LEVEL = ../../..
LIBRARYNAME = LLVMAsmPrinter
PARALLEL_DIRS =
-BUILD_ARCHIVE = 1
-DONT_BUILD_RELINKED = 1
include $(LEVEL)/Makefile.common
OpenPOWER on IntegriCloud