diff --git a/llvm/include/llvm/CodeGen/MachineModuleInfo.h b/llvm/include/llvm/CodeGen/MachineModuleInfo.h index b7b90198b168..3544074d1f16 100644 --- a/llvm/include/llvm/CodeGen/MachineModuleInfo.h +++ b/llvm/include/llvm/CodeGen/MachineModuleInfo.h @@ -42,6 +42,7 @@ #include "llvm/CodeGen/MachineLocation.h" #include "llvm/GlobalValue.h" #include "llvm/Pass.h" +#include "llvm/Metadata.h" namespace llvm { @@ -147,7 +148,7 @@ class MachineModuleInfo : public ImmutablePass { public: static char ID; // Pass identification, replacement for typeid - typedef DenseMap > VariableDbgInfoMapTy; + typedef SmallVector< std::pair< WeakMetadataVH, unsigned>, 4 > VariableDbgInfoMapTy; VariableDbgInfoMapTy VariableDbgInfo; MachineModuleInfo(); @@ -332,9 +333,8 @@ public: /// setVariableDbgInfo - Collect information used to emit debugging information /// of a variable. - void setVariableDbgInfo(MDNode *N, MDNode *L, unsigned S) { - if (N && L) - VariableDbgInfo[N] = std::make_pair(L, S); + void setVariableDbgInfo(MDNode *N, unsigned S) { + VariableDbgInfo.push_back(std::make_pair(N, S)); } VariableDbgInfoMapTy &getVariableDbgInfo() { return VariableDbgInfo; } diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 86532e816d60..f0579fe588af 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1784,23 +1784,19 @@ void DwarfDebug::EndModule() { } /// CollectVariableInfo - Populate DbgScope entries with variables' info. -bool DwarfDebug::CollectVariableInfo() { - if (!MMI) return false; - bool ArgsCollected = false; +void DwarfDebug::CollectVariableInfo() { + if (!MMI) return; MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo(); for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(), VE = VMap.end(); VI != VE; ++VI) { - MDNode *Var = VI->first; + MetadataBase *MB = VI->first; + MDNode *Var = dyn_cast_or_null(MB); DIVariable DV (Var); if (DV.isNull()) continue; - if (DV.getTag() == dwarf::DW_TAG_arg_variable) - ArgsCollected = true; - DILocation VLoc(VI->second.first); - unsigned VSlot = VI->second.second; - DbgScope *Scope = getDbgScope(VLoc.getScope().getNode(), NULL); + unsigned VSlot = VI->second; + DbgScope *Scope = getDbgScope(DV.getContext().getNode(), NULL); Scope->AddVariable(new DbgVariable(DV, VSlot, false)); } - return ArgsCollected; } /// SetDbgScopeBeginLabels - Update DbgScope begin labels for the scopes that @@ -1911,7 +1907,7 @@ void DwarfDebug::BeginFunction(MachineFunction *MF) { #ifdef ATTACH_DEBUG_INFO_TO_AN_INSN if (!ExtractScopeInformation(MF)) return; - bool ArgsCollected = CollectVariableInfo(); + CollectVariableInfo(); #endif // Begin accumulating function debug information. @@ -1923,18 +1919,27 @@ void DwarfDebug::BeginFunction(MachineFunction *MF) { // Emit label for the implicitly defined dbg.stoppoint at the start of the // function. #ifdef ATTACH_DEBUG_INFO_TO_AN_INSN - if (!ArgsCollected) { -#else - if (1) { -#endif - DebugLoc FDL = MF->getDefaultDebugLoc(); - if (!FDL.isUnknown()) { - DebugLocTuple DLT = MF->getDebugLocTuple(FDL); - unsigned LabelID = RecordSourceLine(DLT.Line, DLT.Col, DLT.CompileUnit); - Asm->printLabel(LabelID); - O << '\n'; - } + DebugLoc FDL = MF->getDefaultDebugLoc(); + if (!FDL.isUnknown()) { + DebugLocTuple DLT = MF->getDebugLocTuple(FDL); + unsigned LabelID = 0; + DISubprogram SP(DLT.CompileUnit); + if (!SP.isNull()) + LabelID = RecordSourceLine(SP.getLineNumber(), 0, DLT.CompileUnit); + else + LabelID = RecordSourceLine(DLT.Line, DLT.Col, DLT.CompileUnit); + Asm->printLabel(LabelID); + O << '\n'; } +#else + DebugLoc FDL = MF->getDefaultDebugLoc(); + if (!FDL.isUnknown()) { + DebugLocTuple DLT = MF->getDebugLocTuple(FDL); + unsigned LabelID = RecordSourceLine(DLT.Line, DLT.Col, DLT.CompileUnit); + Asm->printLabel(LabelID); + O << '\n'; + } +#endif if (TimePassesIsEnabled) DebugTimer->stopTimer(); } @@ -1947,6 +1952,10 @@ void DwarfDebug::EndFunction(MachineFunction *MF) { if (TimePassesIsEnabled) DebugTimer->startTimer(); +#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN + if (DbgScopeMap.empty()) + return; +#endif // Define end label for subprogram. EmitLabel("func_end", SubprogramCount); diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index 7e2f6be837d3..bd377c5593cc 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -556,7 +556,7 @@ public: bool ExtractScopeInformation(MachineFunction *MF); /// CollectVariableInfo - Populate DbgScope entries with variables' info. - bool CollectVariableInfo(); + void CollectVariableInfo(); /// SetDbgScopeBeginLabels - Update DbgScope begin labels for the scopes that /// start with this machine instruction. diff --git a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp index bccff160ce9a..e4ccbce471c0 100644 --- a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -417,14 +417,8 @@ bool FastISel::SelectCall(User *I) { StaticAllocaMap.find(AI); if (SI == StaticAllocaMap.end()) break; // VLAs. int FI = SI->second; - if (MMI) { - MetadataContext &TheMetadata = AI->getContext().getMetadata(); - unsigned MDDbgKind = TheMetadata.getMDKind("dbg"); - MDNode *AllocaLocation = - dyn_cast_or_null(TheMetadata.getMD(MDDbgKind, AI)); - if (AllocaLocation) - MMI->setVariableDbgInfo(DI->getVariable(), AllocaLocation, FI); - } + if (MMI) + MMI->setVariableDbgInfo(DI->getVariable(), FI); #ifndef ATTACH_DEBUG_INFO_TO_AN_INSN DW->RecordVariable(DI->getVariable(), FI); #endif diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp index a27fbe68adc9..aa4ae733c25d 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp @@ -3970,7 +3970,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) { if (!isValidDebugInfoIntrinsic(DI, CodeGenOpt::None)) return 0; - Value *Variable = DI.getVariable(); + MDNode *Variable = DI.getVariable(); Value *Address = DI.getAddress(); if (BitCastInst *BCI = dyn_cast(Address)) Address = BCI->getOperand(0); @@ -3983,7 +3983,13 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) { if (SI == FuncInfo.StaticAllocaMap.end()) return 0; // VLAs. int FI = SI->second; - DW->RecordVariable(cast(Variable), FI); +#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN + MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); + if (MMI) + MMI->setVariableDbgInfo(Variable, FI); +#else + DW->RecordVariable(Variable, FI); +#endif return 0; } case Intrinsic::eh_exception: {