diff --git a/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h b/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h index 9e80c78dfa0..ac1673de5f3 100644 --- a/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h +++ b/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h @@ -208,10 +208,6 @@ public: const MDNode *Variable, const MDNode *Expr); - /// Build and insert a DBG_LABEL instructions specifying that \p Label is - /// given. Convert "llvm.dbg.label Label" to "DBG_LABEL Label". - MachineInstrBuilder buildDbgLabel(const MDNode *Label); - /// Build and insert \p Res = G_FRAME_INDEX \p Idx /// /// G_FRAME_INDEX materializes the address of an alloca value or other diff --git a/lib/CodeGen/AsmPrinter/CMakeLists.txt b/lib/CodeGen/AsmPrinter/CMakeLists.txt index 6cba4a0d4b8..0f8c24158ee 100644 --- a/lib/CodeGen/AsmPrinter/CMakeLists.txt +++ b/lib/CodeGen/AsmPrinter/CMakeLists.txt @@ -5,7 +5,7 @@ add_llvm_library(LLVMAsmPrinter AsmPrinter.cpp AsmPrinterDwarf.cpp AsmPrinterInlineAsm.cpp - DbgEntityHistoryCalculator.cpp + DbgValueHistoryCalculator.cpp DebugHandlerBase.cpp DebugLocStream.cpp DIE.cpp diff --git a/lib/CodeGen/AsmPrinter/CodeViewDebug.h b/lib/CodeGen/AsmPrinter/CodeViewDebug.h index 7f9a427f813..6a0da5f993d 100644 --- a/lib/CodeGen/AsmPrinter/CodeViewDebug.h +++ b/lib/CodeGen/AsmPrinter/CodeViewDebug.h @@ -14,7 +14,7 @@ #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_CODEVIEWDEBUG_H #define LLVM_LIB_CODEGEN_ASMPRINTER_CODEVIEWDEBUG_H -#include "DbgEntityHistoryCalculator.h" +#include "DbgValueHistoryCalculator.h" #include "DebugHandlerBase.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" diff --git a/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp b/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp similarity index 81% rename from lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp rename to lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp index 8fb4382efd3..25518a339c6 100644 --- a/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp +++ b/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp @@ -1,4 +1,4 @@ -//===- llvm/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp -------------===// +//===- llvm/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp --------------===// // // The LLVM Compiler Infrastructure // @@ -7,7 +7,7 @@ // //===----------------------------------------------------------------------===// -#include "DbgEntityHistoryCalculator.h" +#include "DbgValueHistoryCalculator.h" #include "llvm/ADT/BitVector.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" @@ -78,17 +78,11 @@ unsigned DbgValueHistoryMap::getRegisterForVar(InlinedVariable Var) const { return isDescribedByReg(*Ranges.back().first); } -void DbgLabelInstrMap::addInstr(InlinedLabel Label, const MachineInstr &MI) { - assert(MI.isDebugLabel() && "not a DBG_LABEL"); - LabelInstr[Label] = &MI; -} - namespace { // Maps physreg numbers to the variables they describe. using InlinedVariable = DbgValueHistoryMap::InlinedVariable; using RegDescribedVarsMap = std::map>; -using InlinedLabel = DbgLabelInstrMap::InlinedLabel; } // end anonymous namespace @@ -193,10 +187,9 @@ static void collectChangingRegs(const MachineFunction *MF, } } -void llvm::calculateDbgEntityHistory(const MachineFunction *MF, - const TargetRegisterInfo *TRI, - DbgValueHistoryMap &DbgValues, - DbgLabelInstrMap &DbgLabels) { +void llvm::calculateDbgValueHistory(const MachineFunction *MF, + const TargetRegisterInfo *TRI, + DbgValueHistoryMap &Result) { BitVector ChangingRegs(TRI->getNumRegs()); collectChangingRegs(MF, TRI, ChangingRegs); @@ -217,14 +210,14 @@ void llvm::calculateDbgEntityHistory(const MachineFunction *MF, // If this is a virtual register, only clobber it since it doesn't // have aliases. if (TRI->isVirtualRegister(MO.getReg())) - clobberRegisterUses(RegVars, MO.getReg(), DbgValues, MI); + clobberRegisterUses(RegVars, MO.getReg(), Result, MI); // If this is a register def operand, it may end a debug value // range. else { for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid(); ++AI) if (ChangingRegs.test(*AI)) - clobberRegisterUses(RegVars, *AI, DbgValues, MI); + clobberRegisterUses(RegVars, *AI, Result, MI); } } else if (MO.isRegMask()) { // If this is a register mask operand, clobber all debug values in @@ -233,7 +226,7 @@ void llvm::calculateDbgEntityHistory(const MachineFunction *MF, // Don't consider SP to be clobbered by register masks. if (unsigned(I) != SP && TRI->isPhysicalRegister(I) && MO.clobbersPhysReg(I)) { - clobberRegisterUses(RegVars, I, DbgValues, MI); + clobberRegisterUses(RegVars, I, Result, MI); } } } @@ -241,34 +234,26 @@ void llvm::calculateDbgEntityHistory(const MachineFunction *MF, continue; } - if (MI.isDebugValue()) { - assert(MI.getNumOperands() > 1 && "Invalid DBG_VALUE instruction!"); - // Use the base variable (without any DW_OP_piece expressions) - // as index into History. The full variables including the - // piece expressions are attached to the MI. - const DILocalVariable *RawVar = MI.getDebugVariable(); - assert(RawVar->isValidLocationForIntrinsic(MI.getDebugLoc()) && - "Expected inlined-at fields to agree"); - InlinedVariable Var(RawVar, MI.getDebugLoc()->getInlinedAt()); + // Skip DBG_LABEL instructions. + if (MI.isDebugLabel()) + continue; - if (unsigned PrevReg = DbgValues.getRegisterForVar(Var)) - dropRegDescribedVar(RegVars, PrevReg, Var); + assert(MI.getNumOperands() > 1 && "Invalid DBG_VALUE instruction!"); + // Use the base variable (without any DW_OP_piece expressions) + // as index into History. The full variables including the + // piece expressions are attached to the MI. + const DILocalVariable *RawVar = MI.getDebugVariable(); + assert(RawVar->isValidLocationForIntrinsic(MI.getDebugLoc()) && + "Expected inlined-at fields to agree"); + InlinedVariable Var(RawVar, MI.getDebugLoc()->getInlinedAt()); - DbgValues.startInstrRange(Var, MI); + if (unsigned PrevReg = Result.getRegisterForVar(Var)) + dropRegDescribedVar(RegVars, PrevReg, Var); - if (unsigned NewReg = isDescribedByReg(MI)) - addRegDescribedVar(RegVars, NewReg, Var); - } else if (MI.isDebugLabel()) { - assert(MI.getNumOperands() == 1 && "Invalid DBG_LABEL instruction!"); - const DILabel *RawLabel = MI.getDebugLabel(); - assert(RawLabel->isValidLocationForIntrinsic(MI.getDebugLoc()) && - "Expected inlined-at fields to agree"); - // When collecting debug information for labels, there is no MCSymbol - // generated for it. So, we keep MachineInstr in DbgLabels in order - // to query MCSymbol afterward. - InlinedLabel L(RawLabel, MI.getDebugLoc()->getInlinedAt()); - DbgLabels.addInstr(L, MI); - } + Result.startInstrRange(Var, MI); + + if (unsigned NewReg = isDescribedByReg(MI)) + addRegDescribedVar(RegVars, NewReg, Var); } // Make sure locations for register-described variables are valid only @@ -279,7 +264,7 @@ void llvm::calculateDbgEntityHistory(const MachineFunction *MF, auto CurElem = I++; // CurElem can be erased below. if (TRI->isVirtualRegister(CurElem->first) || ChangingRegs.test(CurElem->first)) - clobberRegisterUses(RegVars, CurElem, DbgValues, MBB.back()); + clobberRegisterUses(RegVars, CurElem, Result, MBB.back()); } } } diff --git a/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h b/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h similarity index 68% rename from lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h rename to lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h index 589bcce1295..a262cb38b17 100644 --- a/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h +++ b/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h @@ -1,4 +1,4 @@ -//===- llvm/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h -----*- C++ -*-===// +//===- llvm/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h ------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -58,30 +58,9 @@ public: #endif }; -/// For each inlined instance of a source-level label, keep the corresponding -/// DBG_LABEL instruction. The DBG_LABEL instruction could be used to generate -/// a temporary (assembler) label before it. -class DbgLabelInstrMap { -public: - using InlinedLabel = std::pair; - using InstrMap = MapVector; - -private: - InstrMap LabelInstr; - -public: - void addInstr(InlinedLabel Label, const MachineInstr &MI); - - bool empty() const { return LabelInstr.empty(); } - void clear() { LabelInstr.clear(); } - InstrMap::const_iterator begin() const { return LabelInstr.begin(); } - InstrMap::const_iterator end() const { return LabelInstr.end(); } -}; - -void calculateDbgEntityHistory(const MachineFunction *MF, - const TargetRegisterInfo *TRI, - DbgValueHistoryMap &DbgValues, - DbgLabelInstrMap &DbgLabels); +void calculateDbgValueHistory(const MachineFunction *MF, + const TargetRegisterInfo *TRI, + DbgValueHistoryMap &Result); } // end namespace llvm diff --git a/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp b/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp index 580f682b9a6..82e14dc13cb 100644 --- a/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp +++ b/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp @@ -190,9 +190,8 @@ void DebugHandlerBase::beginFunction(const MachineFunction *MF) { // Calculate history for local variables. assert(DbgValues.empty() && "DbgValues map wasn't cleaned!"); - assert(DbgLabels.empty() && "DbgLabels map wasn't cleaned!"); - calculateDbgEntityHistory(MF, Asm->MF->getSubtarget().getRegisterInfo(), - DbgValues, DbgLabels); + calculateDbgValueHistory(MF, Asm->MF->getSubtarget().getRegisterInfo(), + DbgValues); LLVM_DEBUG(DbgValues.dump()); // Request labels for the full history. @@ -230,12 +229,6 @@ void DebugHandlerBase::beginFunction(const MachineFunction *MF) { } } - // Ensure there is a symbol before DBG_LABEL. - for (const auto &I : DbgLabels) { - const MachineInstr *MI = I.second; - requestLabelBeforeInsn(MI); - } - PrevInstLoc = DebugLoc(); PrevLabel = Asm->getFunctionBegin(); beginFunctionImpl(MF); @@ -303,7 +296,6 @@ void DebugHandlerBase::endFunction(const MachineFunction *MF) { if (hasDebugInfo(MMI, MF)) endFunctionImpl(MF); DbgValues.clear(); - DbgLabels.clear(); LabelsBeforeInsn.clear(); LabelsAfterInsn.clear(); } diff --git a/lib/CodeGen/AsmPrinter/DebugHandlerBase.h b/lib/CodeGen/AsmPrinter/DebugHandlerBase.h index 4b0ce0e3f03..1ccefe32be7 100644 --- a/lib/CodeGen/AsmPrinter/DebugHandlerBase.h +++ b/lib/CodeGen/AsmPrinter/DebugHandlerBase.h @@ -16,7 +16,7 @@ #define LLVM_LIB_CODEGEN_ASMPRINTER_DEBUGHANDLERBASE_H #include "AsmPrinterHandler.h" -#include "DbgEntityHistoryCalculator.h" +#include "DbgValueHistoryCalculator.h" #include "llvm/ADT/Optional.h" #include "llvm/CodeGen/LexicalScopes.h" #include "llvm/CodeGen/MachineInstr.h" @@ -82,9 +82,6 @@ protected: /// variable. Variables are listed in order of appearance. DbgValueHistoryMap DbgValues; - /// Mapping of inlined labels and DBG_LABEL machine instruction. - DbgLabelInstrMap DbgLabels; - /// Maps instruction with label emitted before instruction. /// FIXME: Make this private from DwarfDebug, we have the necessary accessors /// for it. diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index 532eb9e9325..322555a2e7d 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -513,18 +513,6 @@ DIE *DwarfCompileUnit::constructVariableDIE(DbgVariable &DV, bool Abstract) { return D; } -DIE *DwarfCompileUnit::constructLabelDIE(DbgLabel &DL, - const LexicalScope &Scope) { - auto LabelDie = DIE::get(DIEValueAllocator, DL.getTag()); - insertDIE(DL.getLabel(), LabelDie); - DL.setDIE(*LabelDie); - - if (Scope.isAbstractScope()) - applyLabelAttributes(DL, *LabelDie); - - return LabelDie; -} - DIE *DwarfCompileUnit::constructVariableDIEImpl(const DbgVariable &DV, bool Abstract) { // Define variable debug information entry. @@ -718,9 +706,6 @@ DIE *DwarfCompileUnit::createScopeChildrenDIE(LexicalScope *Scope, if (HasNonScopeChildren) *HasNonScopeChildren = !Children.empty(); - for (DbgLabel *DL : DU->getScopeLabels().lookup(Scope)) - Children.push_back(constructLabelDIE(*DL, *Scope)); - for (LexicalScope *LS : Scope->getChildren()) constructScopeDIE(LS, Children); @@ -846,52 +831,40 @@ void DwarfCompileUnit::finishSubprogramDefinition(const DISubprogram *SP) { } } -void DwarfCompileUnit::finishEntityDefinition(const DbgEntity *Entity) { - DbgEntity *AbsEntity = getExistingAbstractEntity(Entity->getEntity()); - - auto *Die = Entity->getDIE(); - /// Label may be used to generate DW_AT_low_pc, so put it outside - /// if/else block. - const DbgLabel *Label = nullptr; - if (AbsEntity && AbsEntity->getDIE()) { - addDIEEntry(*Die, dwarf::DW_AT_abstract_origin, *AbsEntity->getDIE()); - Label = dyn_cast(Entity); - } else { - if (const DbgVariable *Var = dyn_cast(Entity)) - applyVariableAttributes(*Var, *Die); - else if ((Label = dyn_cast(Entity))) - applyLabelAttributes(*Label, *Die); - else - llvm_unreachable("DbgEntity must be DbgVariable or DbgLabel."); - } - - if (Label) { - const MCSymbol *Sym = Label->getSymbol(); - addLabelAddress(*Die, dwarf::DW_AT_low_pc, Sym); - } +void DwarfCompileUnit::finishVariableDefinition(const DbgVariable &Var) { + DbgVariable *AbsVar = getExistingAbstractVariable( + InlinedVariable(Var.getVariable(), Var.getInlinedAt())); + auto *VariableDie = Var.getDIE(); + if (AbsVar && AbsVar->getDIE()) { + addDIEEntry(*VariableDie, dwarf::DW_AT_abstract_origin, + *AbsVar->getDIE()); + } else + applyVariableAttributes(Var, *VariableDie); } -DbgEntity *DwarfCompileUnit::getExistingAbstractEntity(const DINode *Node) { - auto &AbstractEntities = getAbstractEntities(); - auto I = AbstractEntities.find(Node); - if (I != AbstractEntities.end()) +DbgVariable *DwarfCompileUnit::getExistingAbstractVariable(InlinedVariable IV) { + const DILocalVariable *Cleansed; + return getExistingAbstractVariable(IV, Cleansed); +} + +// Find abstract variable, if any, associated with Var. +DbgVariable *DwarfCompileUnit::getExistingAbstractVariable( + InlinedVariable IV, const DILocalVariable *&Cleansed) { + // More then one inlined variable corresponds to one abstract variable. + Cleansed = IV.first; + auto &AbstractVariables = getAbstractVariables(); + auto I = AbstractVariables.find(Cleansed); + if (I != AbstractVariables.end()) return I->second.get(); return nullptr; } -void DwarfCompileUnit::createAbstractEntity(const DINode *Node, - LexicalScope *Scope) { +void DwarfCompileUnit::createAbstractVariable(const DILocalVariable *Var, + LexicalScope *Scope) { assert(Scope && Scope->isAbstractScope()); - auto &Entity = getAbstractEntities()[Node]; - if (isa(Node)) { - Entity = llvm::make_unique( - cast(Node), nullptr /* IA */);; - DU->addScopeVariable(Scope, cast(Entity.get())); - } else if (isa(Node)) { - Entity = llvm::make_unique( - cast(Node), nullptr /* IA */); - DU->addScopeLabel(Scope, cast(Entity.get())); - } + auto AbsDbgVariable = llvm::make_unique(Var, /* IA */ nullptr); + DU->addScopeVariable(Scope, AbsDbgVariable.get()); + getAbstractVariables()[Var] = std::move(AbsDbgVariable); } void DwarfCompileUnit::emitHeader(bool UseOffsets) { @@ -1046,15 +1019,6 @@ void DwarfCompileUnit::applyVariableAttributes(const DbgVariable &Var, addFlag(VariableDie, dwarf::DW_AT_artificial); } -void DwarfCompileUnit::applyLabelAttributes(const DbgLabel &Label, - DIE &LabelDie) { - StringRef Name = Label.getName(); - if (!Name.empty()) - addString(LabelDie, dwarf::DW_AT_name, Name); - const auto *DILabel = Label.getLabel(); - addSourceLine(LabelDie, DILabel); -} - /// Add a Dwarf expression attribute data and value. void DwarfCompileUnit::addExpr(DIELoc &Die, dwarf::Form Form, const MCExpr *Expr) { diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h index ab67c43f6f2..51e1558fe4a 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h @@ -14,7 +14,7 @@ #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H #define LLVM_LIB_CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H -#include "DbgEntityHistoryCalculator.h" +#include "DbgValueHistoryCalculator.h" #include "DwarfDebug.h" #include "DwarfUnit.h" #include "llvm/ADT/ArrayRef.h" @@ -81,7 +81,7 @@ class DwarfCompileUnit final : public DwarfUnit { const MCSymbol *BaseAddress = nullptr; DenseMap AbstractSPDies; - DenseMap> AbstractEntities; + DenseMap> AbstractVariables; /// DWO ID for correlating skeleton and split units. uint64_t DWOId = 0; @@ -98,10 +98,10 @@ class DwarfCompileUnit final : public DwarfUnit { return DU->getAbstractSPDies(); } - DenseMap> &getAbstractEntities() { + DenseMap> &getAbstractVariables() { if (isDwoUnit() && !DD->shareAcrossDWOCUs()) - return AbstractEntities; - return DU->getAbstractEntities(); + return AbstractVariables; + return DU->getAbstractVariables(); } public: @@ -194,9 +194,6 @@ public: DIE *constructVariableDIE(DbgVariable &DV, const LexicalScope &Scope, DIE *&ObjectPointer); - /// Construct a DIE for the given DbgLabel. - DIE *constructLabelDIE(DbgLabel &DL, const LexicalScope &Scope); - /// A helper function to create children of a Scope DIE. DIE *createScopeChildrenDIE(LexicalScope *Scope, SmallVectorImpl &Children, @@ -213,12 +210,14 @@ public: DIE *constructImportedEntityDIE(const DIImportedEntity *Module); void finishSubprogramDefinition(const DISubprogram *SP); - void finishEntityDefinition(const DbgEntity *Entity); + void finishVariableDefinition(const DbgVariable &Var); /// Find abstract variable associated with Var. using InlinedVariable = DbgValueHistoryMap::InlinedVariable; - DbgEntity *getExistingAbstractEntity(const DINode *Node); - void createAbstractEntity(const DINode *Node, LexicalScope *Scope); + DbgVariable *getExistingAbstractVariable(InlinedVariable IV, + const DILocalVariable *&Cleansed); + DbgVariable *getExistingAbstractVariable(InlinedVariable IV); + void createAbstractVariable(const DILocalVariable *Var, LexicalScope *Scope); /// Set the skeleton unit associated with this unit. void setSkeleton(DwarfCompileUnit &Skel) { Skeleton = &Skel; } @@ -289,8 +288,6 @@ public: void applySubprogramAttributesToDefinition(const DISubprogram *SP, DIE &SPDie); - void applyLabelAttributes(const DbgLabel &Label, DIE &LabelDie); - /// getRangeLists - Get the vector of range lists. const SmallVectorImpl &getRangeLists() const { return (Skeleton ? Skeleton : this)->CURangeLists; diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 86baf73a096..6ee1de0dba3 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -188,12 +188,12 @@ bool DebugLocDwarfExpression::isFrameRegister(const TargetRegisterInfo &TRI, } bool DbgVariable::isBlockByrefVariable() const { - assert(getVariable() && "Invalid complex DbgVariable!"); - return getVariable()->getType().resolve()->isBlockByrefStruct(); + assert(Var && "Invalid complex DbgVariable!"); + return Var->getType().resolve()->isBlockByrefStruct(); } const DIType *DbgVariable::getType() const { - DIType *Ty = getVariable()->getType().resolve(); + DIType *Ty = Var->getType().resolve(); // FIXME: isBlockByrefVariable should be reformulated in terms of complex // addresses instead. if (Ty->isBlockByrefStruct()) { @@ -258,8 +258,8 @@ ArrayRef DbgVariable::getFrameIndexExprs() const { void DbgVariable::addMMIEntry(const DbgVariable &V) { assert(DebugLocListIndex == ~0U && !MInsn && "not an MMI entry"); assert(V.DebugLocListIndex == ~0U && !V.MInsn && "not an MMI entry"); - assert(V.getVariable() == getVariable() && "conflicting variable"); - assert(V.getInlinedAt() == getInlinedAt() && "conflicting inlined-at location"); + assert(V.Var == Var && "conflicting variable"); + assert(V.IA == IA && "conflicting inlined-at location"); assert(!FrameIndexExprs.empty() && "Expected an MMI entry"); assert(!V.FrameIndexExprs.empty() && "Expected an MMI entry"); @@ -728,16 +728,16 @@ void DwarfDebug::beginModule() { } } -void DwarfDebug::finishEntityDefinitions() { - for (const auto &Entity : ConcreteEntities) { - DIE *Die = Entity->getDIE(); - assert(Die); +void DwarfDebug::finishVariableDefinitions() { + for (const auto &Var : ConcreteVariables) { + DIE *VariableDie = Var->getDIE(); + assert(VariableDie); // FIXME: Consider the time-space tradeoff of just storing the unit pointer - // in the ConcreteEntities list, rather than looking it up again here. + // in the ConcreteVariables list, rather than looking it up again here. // DIE::getUnit isn't simple - it walks parent pointers, etc. - DwarfCompileUnit *Unit = CUDieMap.lookup(Die->getUnitDie()); + DwarfCompileUnit *Unit = CUDieMap.lookup(VariableDie->getUnitDie()); assert(Unit); - Unit->finishEntityDefinition(Entity.get()); + Unit->finishVariableDefinition(*Var); } } @@ -755,7 +755,7 @@ void DwarfDebug::finalizeModuleInfo() { finishSubprogramDefinitions(); - finishEntityDefinitions(); + finishVariableDefinitions(); // Include the DWO file name in the hash if there's more than one CU. // This handles ThinLTO's situation where imported CUs may very easily be @@ -917,24 +917,25 @@ void DwarfDebug::endModule() { // FIXME: AbstractVariables.clear(); } -void DwarfDebug::ensureAbstractEntityIsCreated(DwarfCompileUnit &CU, - const DINode *Node, - const MDNode *ScopeNode) { - if (CU.getExistingAbstractEntity(Node)) +void DwarfDebug::ensureAbstractVariableIsCreated(DwarfCompileUnit &CU, InlinedVariable IV, + const MDNode *ScopeNode) { + const DILocalVariable *Cleansed = nullptr; + if (CU.getExistingAbstractVariable(IV, Cleansed)) return; - CU.createAbstractEntity(Node, LScopes.getOrCreateAbstractScope( + CU.createAbstractVariable(Cleansed, LScopes.getOrCreateAbstractScope( cast(ScopeNode))); } -void DwarfDebug::ensureAbstractEntityIsCreatedIfScoped(DwarfCompileUnit &CU, - const DINode *Node, const MDNode *ScopeNode) { - if (CU.getExistingAbstractEntity(Node)) +void DwarfDebug::ensureAbstractVariableIsCreatedIfScoped(DwarfCompileUnit &CU, + InlinedVariable IV, const MDNode *ScopeNode) { + const DILocalVariable *Cleansed = nullptr; + if (CU.getExistingAbstractVariable(IV, Cleansed)) return; if (LexicalScope *Scope = LScopes.findAbstractScope(cast_or_null(ScopeNode))) - CU.createAbstractEntity(Node, Scope); + CU.createAbstractVariable(Cleansed, Scope); } // Collect variable information from side table maintained by MF. @@ -955,14 +956,14 @@ void DwarfDebug::collectVariableInfoFromMFTable( if (!Scope) continue; - ensureAbstractEntityIsCreatedIfScoped(TheCU, Var.first, Scope->getScopeNode()); + ensureAbstractVariableIsCreatedIfScoped(TheCU, Var, Scope->getScopeNode()); auto RegVar = llvm::make_unique(Var.first, Var.second); RegVar->initializeMMI(VI.Expr, VI.Slot); if (DbgVariable *DbgVar = MFVars.lookup(Var)) DbgVar->addMMIEntry(*RegVar); else if (InfoHolder.addScopeVariable(Scope, RegVar.get())) { MFVars.insert({Var, RegVar.get()}); - ConcreteEntities.push_back(std::move(RegVar)); + ConcreteVariables.push_back(std::move(RegVar)); } } } @@ -1127,26 +1128,14 @@ DwarfDebug::buildLocationList(SmallVectorImpl &DebugLoc, } } -DbgEntity *DwarfDebug::createConcreteEntity(DwarfCompileUnit &TheCU, - LexicalScope &Scope, - const DINode *Node, - const DILocation *Location, - const MCSymbol *Sym) { - ensureAbstractEntityIsCreatedIfScoped(TheCU, Node, Scope.getScopeNode()); - if (isa(Node)) { - ConcreteEntities.push_back( - llvm::make_unique(cast(Node), - Location)); - InfoHolder.addScopeVariable(&Scope, - cast(ConcreteEntities.back().get())); - } else if (isa(Node)) { - ConcreteEntities.push_back( - llvm::make_unique(cast(Node), - Location, Sym)); - InfoHolder.addScopeLabel(&Scope, - cast(ConcreteEntities.back().get())); - } - return ConcreteEntities.back().get(); +DbgVariable *DwarfDebug::createConcreteVariable(DwarfCompileUnit &TheCU, + LexicalScope &Scope, + InlinedVariable IV) { + ensureAbstractVariableIsCreatedIfScoped(TheCU, IV, Scope.getScopeNode()); + ConcreteVariables.push_back( + llvm::make_unique(IV.first, IV.second)); + InfoHolder.addScopeVariable(&Scope, ConcreteVariables.back().get()); + return ConcreteVariables.back().get(); } /// Determine whether a *singular* DBG_VALUE is valid for the entirety of its @@ -1208,9 +1197,9 @@ static bool validThroughout(LexicalScopes &LScopes, } // Find variables for each lexical scope. -void DwarfDebug::collectEntityInfo(DwarfCompileUnit &TheCU, - const DISubprogram *SP, - DenseSet &Processed) { +void DwarfDebug::collectVariableInfo(DwarfCompileUnit &TheCU, + const DISubprogram *SP, + DenseSet &Processed) { // Grab the variable info that was squirreled away in the MMI side-table. collectVariableInfoFromMFTable(TheCU, Processed); @@ -1234,8 +1223,7 @@ void DwarfDebug::collectEntityInfo(DwarfCompileUnit &TheCU, continue; Processed.insert(IV); - DbgVariable *RegVar = cast(createConcreteEntity(TheCU, - *Scope, IV.first, IV.second)); + DbgVariable *RegVar = createConcreteVariable(TheCU, *Scope, IV); const MachineInstr *MInsn = Ranges.front().first; assert(MInsn->isDebugValue() && "History must begin with debug value"); @@ -1268,44 +1256,13 @@ void DwarfDebug::collectEntityInfo(DwarfCompileUnit &TheCU, Entry.finalize(*Asm, List, BT); } - // For each InlinedLabel collected from DBG_LABEL instructions, convert to - // DWARF-related DbgLabel. - for (const auto &I : DbgLabels) { - InlinedLabel IL = I.first; - const MachineInstr *MI = I.second; - if (MI == nullptr) - continue; - - LexicalScope *Scope = nullptr; - // Get inlined DILocation if it is inlined label. - if (const DILocation *IA = IL.second) - Scope = LScopes.findInlinedScope(IL.first->getScope(), IA); - else - Scope = LScopes.findLexicalScope(IL.first->getScope()); - // If label scope is not found then skip this label. - if (!Scope) - continue; - - /// At this point, the temporary label is created. - /// Save the temporary label to DbgLabel entity to get the - /// actually address when generating Dwarf DIE. - MCSymbol *Sym = getLabelBeforeInsn(MI); - createConcreteEntity(TheCU, *Scope, IL.first, IL.second, Sym); - } - - // Collect info for variables/labels that were optimized out. + // Collect info for variables that were optimized out. for (const DINode *DN : SP->getRetainedNodes()) { - LexicalScope *Scope = nullptr; if (auto *DV = dyn_cast(DN)) { - if (!Processed.insert(InlinedVariable(DV, nullptr)).second) - continue; - Scope = LScopes.findLexicalScope(DV->getScope()); - } else if (auto *DL = dyn_cast(DN)) { - Scope = LScopes.findLexicalScope(DL->getScope()); + if (Processed.insert(InlinedVariable(DV, nullptr)).second) + if (LexicalScope *Scope = LScopes.findLexicalScope(DV->getScope())) + createConcreteVariable(TheCU, *Scope, InlinedVariable(DV, nullptr)); } - - if (Scope) - createConcreteEntity(TheCU, *Scope, DN, nullptr); } } @@ -1468,7 +1425,7 @@ void DwarfDebug::endFunctionImpl(const MachineFunction *MF) { } DenseSet ProcessedVars; - collectEntityInfo(TheCU, SP, ProcessedVars); + collectVariableInfo(TheCU, SP, ProcessedVars); // Add the range of this function to the list of ranges for the CU. TheCU.addRange(RangeSpan(Asm->getFunctionBegin(), Asm->getFunctionEnd())); @@ -1496,11 +1453,10 @@ void DwarfDebug::endFunctionImpl(const MachineFunction *MF) { // Collect info for variables that were optimized out. if (!ProcessedVars.insert(InlinedVariable(DV, nullptr)).second) continue; - ensureAbstractEntityIsCreated(TheCU, DV, DV->getScope()); + ensureAbstractVariableIsCreated(TheCU, InlinedVariable(DV, nullptr), + DV->getScope()); assert(LScopes.getAbstractScopesList().size() == NumAbstractScopes - && "ensureAbstractEntityIsCreated inserted abstract scopes"); - } else if (auto *DL = dyn_cast(DN)) { - ensureAbstractEntityIsCreated(TheCU, DL, DL->getScope()); + && "ensureAbstractVariableIsCreated inserted abstract scopes"); } } constructAbstractSubprogramScopeDIE(TheCU, AScope); @@ -1518,7 +1474,6 @@ void DwarfDebug::endFunctionImpl(const MachineFunction *MF) { // DbgVariables except those that are also in AbstractVariables (since they // can be used cross-function) InfoHolder.getScopeVariables().clear(); - InfoHolder.getScopeLabels().clear(); PrevLabel = nullptr; CurFn = nullptr; } diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index e314f8e17d6..abf2e43b131 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -15,7 +15,7 @@ #define LLVM_LIB_CODEGEN_ASMPRINTER_DWARFDEBUG_H #include "AddressPool.h" -#include "DbgEntityHistoryCalculator.h" +#include "DbgValueHistoryCalculator.h" #include "DebugHandlerBase.h" #include "DebugLocStream.h" #include "DwarfFile.h" @@ -61,47 +61,6 @@ class MCSymbol; class MDNode; class Module; -//===----------------------------------------------------------------------===// -/// This class is defined as the common parent of DbgVariable and DbgLabel -/// such that it could levarage polymorphism to extract common code for -/// DbgVariable and DbgLabel. -class DbgEntity { - const DINode *Entity; - const DILocation *InlinedAt; - DIE *TheDIE = nullptr; - unsigned SubclassID; - -public: - enum DbgEntityKind { - DbgVariableKind, - DbgLabelKind - }; - - DbgEntity(const DINode *N, const DILocation *IA, unsigned ID) - : Entity(N), InlinedAt(IA), SubclassID(ID) {} - virtual ~DbgEntity() {} - - /// Accessors. - /// @{ - const DINode *getEntity() const { return Entity; } - const DILocation *getInlinedAt() const { return InlinedAt; } - DIE *getDIE() const { return TheDIE; } - unsigned getDbgEntityID() const { return SubclassID; } - /// @} - - void setDIE(DIE &D) { TheDIE = &D; } - - static bool classof(const DbgEntity *N) { - switch (N->getDbgEntityID()) { - default: - return false; - case DbgVariableKind: - case DbgLabelKind: - return true; - } - } -}; - //===----------------------------------------------------------------------===// /// This class is used to track local variable information. /// @@ -114,7 +73,10 @@ public: /// single instruction use \a MInsn and (optionally) a single entry of \a Expr. /// /// Variables that have been optimized out use none of these fields. -class DbgVariable : public DbgEntity { +class DbgVariable { + const DILocalVariable *Var; /// Variable Descriptor. + const DILocation *IA; /// Inlined at location. + DIE *TheDIE = nullptr; /// Variable DIE. unsigned DebugLocListIndex = ~0u; /// Offset in DebugLocs. const MachineInstr *MInsn = nullptr; /// DBG_VALUE instruction. @@ -131,7 +93,7 @@ public: /// Creates a variable without any DW_AT_location. Call \a initializeMMI() /// for MMI entries, or \a initializeDbgValue() for DBG_VALUE instructions. DbgVariable(const DILocalVariable *V, const DILocation *IA) - : DbgEntity(V, IA, DbgVariableKind) {} + : Var(V), IA(IA) {} /// Initialize from the MMI table. void initializeMMI(const DIExpression *E, int FI) { @@ -149,9 +111,8 @@ public: assert(FrameIndexExprs.empty() && "Already initialized?"); assert(!MInsn && "Already initialized?"); - assert(getVariable() == DbgValue->getDebugVariable() && "Wrong variable"); - assert(getInlinedAt() == DbgValue->getDebugLoc()->getInlinedAt() && - "Wrong inlined-at"); + assert(Var == DbgValue->getDebugVariable() && "Wrong variable"); + assert(IA == DbgValue->getDebugLoc()->getInlinedAt() && "Wrong inlined-at"); MInsn = DbgValue; if (auto *E = DbgValue->getDebugExpression()) @@ -160,18 +121,19 @@ public: } // Accessors. - const DILocalVariable *getVariable() const { - return cast(getEntity()); - } + const DILocalVariable *getVariable() const { return Var; } + const DILocation *getInlinedAt() const { return IA; } const DIExpression *getSingleExpression() const { assert(MInsn && FrameIndexExprs.size() <= 1); return FrameIndexExprs.size() ? FrameIndexExprs[0].Expr : nullptr; } + void setDIE(DIE &D) { TheDIE = &D; } + DIE *getDIE() const { return TheDIE; } void setDebugLocListIndex(unsigned O) { DebugLocListIndex = O; } unsigned getDebugLocListIndex() const { return DebugLocListIndex; } - StringRef getName() const { return getVariable()->getName(); } + StringRef getName() const { return Var->getName(); } const MachineInstr *getMInsn() const { return MInsn; } /// Get the FI entries, sorted by fragment offset. ArrayRef getFrameIndexExprs() const; @@ -181,7 +143,7 @@ public: // Translate tag to proper Dwarf tag. dwarf::Tag getTag() const { // FIXME: Why don't we just infer this tag and store it all along? - if (getVariable()->isParameter()) + if (Var->isParameter()) return dwarf::DW_TAG_formal_parameter; return dwarf::DW_TAG_variable; @@ -189,7 +151,7 @@ public: /// Return true if DbgVariable is artificial. bool isArtificial() const { - if (getVariable()->isArtificial()) + if (Var->isArtificial()) return true; if (getType()->isArtificial()) return true; @@ -197,7 +159,7 @@ public: } bool isObjectPointer() const { - if (getVariable()->isObjectPointer()) + if (Var->isObjectPointer()) return true; if (getType()->isObjectPointer()) return true; @@ -216,45 +178,6 @@ public: bool isBlockByrefVariable() const; const DIType *getType() const; - static bool classof(const DbgEntity *N) { - return N->getDbgEntityID() == DbgVariableKind; - } - -private: - template T *resolve(TypedDINodeRef Ref) const { - return Ref.resolve(); - } -}; - -//===----------------------------------------------------------------------===// -/// This class is used to track label information. -/// -/// Labels are collected from \c DBG_LABEL instructions. -class DbgLabel : public DbgEntity { - const MCSymbol *Sym; /// Symbol before DBG_LABEL instruction. - -public: - /// We need MCSymbol information to generate DW_AT_low_pc. - DbgLabel(const DILabel *L, const DILocation *IA, const MCSymbol *Sym = nullptr) - : DbgEntity(L, IA, DbgLabelKind), Sym(Sym) {} - - /// Accessors. - /// @{ - const DILabel *getLabel() const { return cast(getEntity()); } - const MCSymbol *getSymbol() const { return Sym; } - - StringRef getName() const { return getLabel()->getName(); } - /// @} - - /// Translate tag to proper Dwarf tag. - dwarf::Tag getTag() const { - return dwarf::DW_TAG_label; - } - - static bool classof(const DbgEntity *N) { - return N->getDbgEntityID() == DbgLabelKind; - } - private: template T *resolve(TypedDINodeRef Ref) const { return Ref.resolve(); @@ -294,8 +217,8 @@ class DwarfDebug : public DebugHandlerBase { /// Size of each symbol emitted (for those symbols that have a specific size). DenseMap SymSize; - /// Collection of abstract variables/labels. - SmallVector, 64> ConcreteEntities; + /// Collection of abstract variables. + SmallVector, 64> ConcreteVariables; /// Collection of DebugLocEntry. Stored in a linked list so that DIELocLists /// can refer to them in spite of insertions into this list. @@ -410,20 +333,14 @@ class DwarfDebug : public DebugHandlerBase { } using InlinedVariable = DbgValueHistoryMap::InlinedVariable; - using InlinedLabel = DbgLabelInstrMap::InlinedLabel; - void ensureAbstractEntityIsCreated(DwarfCompileUnit &CU, - const DINode *Node, - const MDNode *Scope); - void ensureAbstractEntityIsCreatedIfScoped(DwarfCompileUnit &CU, - const DINode *Node, - const MDNode *Scope); + void ensureAbstractVariableIsCreated(DwarfCompileUnit &CU, InlinedVariable IV, + const MDNode *Scope); + void ensureAbstractVariableIsCreatedIfScoped(DwarfCompileUnit &CU, InlinedVariable IV, + const MDNode *Scope); - DbgEntity *createConcreteEntity(DwarfCompileUnit &TheCU, - LexicalScope &Scope, - const DINode *Node, - const DILocation *Location, - const MCSymbol *Sym = nullptr); + DbgVariable *createConcreteVariable(DwarfCompileUnit &TheCU, + LexicalScope &Scope, InlinedVariable IV); /// Construct a DIE for this abstract scope. void constructAbstractSubprogramScopeDIE(DwarfCompileUnit &SrcCU, LexicalScope *Scope); @@ -432,7 +349,7 @@ class DwarfDebug : public DebugHandlerBase { void addAccelNameImpl(AccelTable &AppleAccel, StringRef Name, const DIE &Die); - void finishEntityDefinitions(); + void finishVariableDefinitions(); void finishSubprogramDefinitions(); @@ -552,8 +469,8 @@ class DwarfDebug : public DebugHandlerBase { unsigned Flags); /// Populate LexicalScope entries with variables' info. - void collectEntityInfo(DwarfCompileUnit &TheCU, const DISubprogram *SP, - DenseSet &ProcessedVars); + void collectVariableInfo(DwarfCompileUnit &TheCU, const DISubprogram *SP, + DenseSet &ProcessedVars); /// Build the location list for all DBG_VALUEs in the /// function that describe the same variable. diff --git a/lib/CodeGen/AsmPrinter/DwarfFile.cpp b/lib/CodeGen/AsmPrinter/DwarfFile.cpp index 0ab9ea87c23..96149fd63f1 100644 --- a/lib/CodeGen/AsmPrinter/DwarfFile.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfFile.cpp @@ -104,8 +104,3 @@ bool DwarfFile::addScopeVariable(LexicalScope *LS, DbgVariable *Var) { } return true; } - -void DwarfFile::addScopeLabel(LexicalScope *LS, DbgLabel *Label) { - SmallVectorImpl &Labels = ScopeLabels[LS]; - Labels.push_back(Label); -} diff --git a/lib/CodeGen/AsmPrinter/DwarfFile.h b/lib/CodeGen/AsmPrinter/DwarfFile.h index c315f44a8d8..8dfbc4e1c43 100644 --- a/lib/CodeGen/AsmPrinter/DwarfFile.h +++ b/lib/CodeGen/AsmPrinter/DwarfFile.h @@ -24,9 +24,7 @@ namespace llvm { class AsmPrinter; -class DbgEntity; class DbgVariable; -class DbgLabel; class DwarfCompileUnit; class DwarfUnit; class LexicalScope; @@ -64,13 +62,9 @@ class DwarfFile { /// Collection of DbgVariables of each lexical scope. DenseMap ScopeVariables; - /// Collection of DbgLabels of each lexical scope. - using LabelList = SmallVector; - DenseMap ScopeLabels; - // Collection of abstract subprogram DIEs. DenseMap AbstractSPDies; - DenseMap> AbstractEntities; + DenseMap> AbstractVariables; /// Maps MDNodes for type system with the corresponding DIEs. These DIEs can /// be shared across CUs, that is why we keep the map here instead @@ -128,22 +122,16 @@ public: /// \returns false if the variable was merged with a previous one. bool addScopeVariable(LexicalScope *LS, DbgVariable *Var); - void addScopeLabel(LexicalScope *LS, DbgLabel *Label); - DenseMap &getScopeVariables() { return ScopeVariables; } - DenseMap &getScopeLabels() { - return ScopeLabels; - } - DenseMap &getAbstractSPDies() { return AbstractSPDies; } - DenseMap> &getAbstractEntities() { - return AbstractEntities; + DenseMap> &getAbstractVariables() { + return AbstractVariables; } void insertDIE(const MDNode *TypeMD, DIE *Die) { diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 60f09f4abad..e38c854bc3d 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -409,12 +409,6 @@ void DwarfUnit::addSourceLine(DIE &Die, const DISubprogram *SP) { addSourceLine(Die, SP->getLine(), SP->getFile()); } -void DwarfUnit::addSourceLine(DIE &Die, const DILabel *L) { - assert(L); - - addSourceLine(Die, L->getLine(), L->getFile()); -} - void DwarfUnit::addSourceLine(DIE &Die, const DIType *Ty) { assert(Ty); diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.h b/lib/CodeGen/AsmPrinter/DwarfUnit.h index 225d9ae4061..69696f62653 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.h +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.h @@ -213,7 +213,6 @@ public: void addSourceLine(DIE &Die, const DILocalVariable *V); void addSourceLine(DIE &Die, const DIGlobalVariable *G); void addSourceLine(DIE &Die, const DISubprogram *SP); - void addSourceLine(DIE &Die, const DILabel *L); void addSourceLine(DIE &Die, const DIType *Ty); void addSourceLine(DIE &Die, const DIObjCProperty *Ty); diff --git a/lib/CodeGen/GlobalISel/IRTranslator.cpp b/lib/CodeGen/GlobalISel/IRTranslator.cpp index 5b511344581..8559d6055cc 100644 --- a/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -770,17 +770,6 @@ bool IRTranslator::translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID, DI.getVariable(), DI.getExpression()); return true; } - case Intrinsic::dbg_label: { - const DbgLabelInst &DI = cast(CI); - assert(DI.getLabel() && "Missing label"); - - assert(DI.getLabel()->isValidLocationForIntrinsic( - MIRBuilder.getDebugLoc()) && - "Expected inlined-at fields to agree"); - - MIRBuilder.buildDbgLabel(DI.getLabel()); - return true; - } case Intrinsic::vaend: // No target I know of cares about va_end. Certainly no in-tree target // does. Simplest intrinsic ever! diff --git a/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp index c7b98c6b859..3271b54aa83 100644 --- a/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ b/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -149,15 +149,6 @@ MachineInstrBuilder MachineIRBuilderBase::buildConstDbgValue( return MIB.addImm(0).addMetadata(Variable).addMetadata(Expr); } -MachineInstrBuilder MachineIRBuilderBase::buildDbgLabel(const MDNode *Label) { - assert(isa(Label) && "not a label"); - assert(cast(Label)->isValidLocationForIntrinsic(State.DL) && - "Expected inlined-at fields to agree"); - auto MIB = buildInstr(TargetOpcode::DBG_LABEL); - - return MIB.addMetadata(Label); -} - MachineInstrBuilder MachineIRBuilderBase::buildFrameIndex(unsigned Res, int Idx) { assert(getMRI()->getType(Res).isPointer() && "invalid operand type"); diff --git a/test/DebugInfo/Generic/debug-label-inline.ll b/test/DebugInfo/Generic/debug-label-inline.ll deleted file mode 100644 index c121d676a5c..00000000000 --- a/test/DebugInfo/Generic/debug-label-inline.ll +++ /dev/null @@ -1,50 +0,0 @@ -; RUN: llc -O2 -filetype=obj -o - %s | llvm-dwarfdump -v - | FileCheck %s -; -; CHECK: .debug_info contents: -; CHECK: [[LABEL_ORIGIN:0x[0-9a-zA-Z]+]]:{{ *}}DW_TAG_label -; CHECK-NEXT: DW_AT_name [DW_FORM_strp] {{.*}}"top" -; CHECK-NEXT: DW_AT_decl_file [DW_FORM_data1] {{.*}}debug-label-inline.c -; CHECK-NEXT: DW_AT_decl_line [DW_FORM_data1] {{.*}}8 -; CHECK: DW_TAG_label -; CHECK-NEXT: DW_AT_abstract_origin [DW_FORM_ref4] {{.*}}{[[LABEL_ORIGIN]]} "top" -; CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] {{.*}}{{0x[0-9a-f]+}} - -source_filename = "debug-label-inline.c" - -@ga = external local_unnamed_addr global i32, align 4 -@gb = external local_unnamed_addr global i32, align 4 - -define i32 @f2() local_unnamed_addr #0 !dbg !4 { -entry: - %0 = load i32, i32* @ga, align 4, !dbg !1 - %1 = load i32, i32* @gb, align 4, !dbg !1 - call void @llvm.dbg.label(metadata !15), !dbg !17 - %add.i = add nsw i32 %1, %0, !dbg !18 - ret i32 %add.i, !dbg !1 -} - -declare void @llvm.dbg.label(metadata) -declare void @llvm.dbg.value(metadata, metadata, metadata) - -attributes #0 = { nounwind readonly } - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!3} - -!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !6, isOptimized: true, emissionKind: FullDebug, enums: !2) -!1 = !DILocation(line: 18, scope: !4) -!2 = !{} -!3 = !{i32 2, !"Debug Info Version", i32 3} -!4 = distinct !DISubprogram(name: "f2", scope: !6, file: !6, line: 15, type: !7, isLocal: false, isDefinition: true, scopeLine: 15, isOptimized: true, unit: !0, retainedNodes: !2) -!6 = !DIFile(filename: "debug-label-inline.c", directory: "./") -!7 = !DISubroutineType(types: !8) -!8 = !{!10} -!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) -!11 = distinct !DISubprogram(name: "f1", scope: !6, file: !6, line: 5, type: !12, isLocal: false, isDefinition: true, scopeLine: 5, isOptimized: true, unit: !0, retainedNodes: !14) -!12 = !DISubroutineType(types: !13) -!13 = !{!10, !10, !10} -!14 = !{!15} -!15 = !DILabel(scope: !11, name: "top", file: !6, line: 8) -!16 = distinct !DILocation(line: 18, scope: !4) -!17 = !DILocation(line: 8, scope: !11, inlinedAt: !16) -!18 = !DILocation(line: 9, scope: !11, inlinedAt: !16) diff --git a/test/DebugInfo/Generic/debug-label.ll b/test/DebugInfo/Generic/debug-label.ll deleted file mode 100644 index 01add599916..00000000000 --- a/test/DebugInfo/Generic/debug-label.ll +++ /dev/null @@ -1,76 +0,0 @@ -; RUN: llc -fast-isel=false -O0 -filetype=obj -o - %s | llvm-dwarfdump -v - | FileCheck %s -; -; CHECK: .debug_info contents: -; CHECK: DW_TAG_label -; CHECK-NEXT: DW_AT_name [DW_FORM_strp] {{.*}}"top" -; CHECK-NEXT: DW_AT_decl_file [DW_FORM_data1] {{.*}}debug-label.c -; CHECK-NEXT: DW_AT_decl_line [DW_FORM_data1] {{.*}}4 -; CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] {{.*}}{{0x[0-9a-f]+}} -; CHECK: DW_TAG_label -; CHECK-NEXT: DW_AT_name [DW_FORM_strp] {{.*}}"done" -; CHECK-NEXT: DW_AT_decl_file [DW_FORM_data1] {{.*}}debug-label.c -; CHECK-NEXT: DW_AT_decl_line [DW_FORM_data1] {{.*}}7 -; CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] {{.*}}{{0x[0-9a-f]+}} -; -; RUN: llc -fast-isel=false -O0 -o - %s | FileCheck %s -check-prefix=ASM -; -; ASM: [[TOP_LOW_PC:[.0-9a-zA-Z]+]]:{{[[:space:]].*}}DEBUG_LABEL: foo:top -; ASM: [[DONE_LOW_PC:[.0-9a-zA-Z]+]]:{{[[:space:]].*}}DEBUG_LABEL: foo:done -; ASM-LABEL: .debug_str -; ASM: [[TOP_LABEL:[.0-9a-zA-Z]+]]:{{[[:space:]].*}}"top" -; ASM: [[DONE_LABEL:[.0-9a-zA-Z]+]]:{{[[:space:]].*}}"done" -; ASM-LABEL: .debug_info -; ASM: DW_TAG_label -; ASM-NEXT: [[TOP_LABEL]] {{.*}} DW_AT_name -; ASM-NEXT: 1 {{.*}} DW_AT_decl_file -; ASM-NEXT: 4 {{.*}} DW_AT_decl_line -; ASM-NEXT: [[TOP_LOW_PC]] {{.*}} DW_AT_low_pc -; ASM: DW_TAG_label -; ASM-NEXT: [[DONE_LABEL]] {{.*}} DW_AT_name -; ASM-NEXT: 1 {{.*}} DW_AT_decl_file -; ASM-NEXT: 7 {{.*}} DW_AT_decl_line -; ASM-NEXT: [[DONE_LOW_PC]] {{.*}} DW_AT_low_pc - -source_filename = "debug-label.c" - -define dso_local i32 @foo(i32 %a, i32 %b) !dbg !6 { -entry: - %a.addr = alloca i32, align 4 - %b.addr = alloca i32, align 4 - %sum = alloca i32, align 4 - store i32 %a, i32* %a.addr, align 4 - store i32 %b, i32* %b.addr, align 4 - br label %top - -top: - call void @llvm.dbg.label(metadata !10), !dbg !11 - %0 = load i32, i32* %a.addr, align 4 - %1 = load i32, i32* %b.addr, align 4 - %add = add nsw i32 %0, %1 - store i32 %add, i32* %sum, align 4 - br label %done - -done: - call void @llvm.dbg.label(metadata !12), !dbg !13 - %2 = load i32, i32* %sum, align 4 - ret i32 %2, !dbg !14 -} - -declare void @llvm.dbg.label(metadata) - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!4} - -!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: false, emissionKind: FullDebug, enums: !2) -!1 = !DIFile(filename: "debug-label.c", directory: "./") -!2 = !{} -!4 = !{i32 2, !"Debug Info Version", i32 3} -!6 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 2, isOptimized: false, unit: !0, retainedNodes: !2) -!7 = !DISubroutineType(types: !8) -!8 = !{!9, !9, !9} -!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) -!10 = !DILabel(scope: !6, name: "top", file: !1, line: 4) -!11 = !DILocation(line: 4, column: 1, scope: !6) -!12 = !DILabel(scope: !6, name: "done", file: !1, line: 7) -!13 = !DILocation(line: 7, column: 1, scope: !6) -!14 = !DILocation(line: 8, column: 3, scope: !6)