diff options
author | Devang Patel <dpatel@apple.com> | 2010-05-22 00:04:14 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2010-05-22 00:04:14 +0000 |
commit | 65eb482e8fcd6084d83793aeb767ef0bddefc92a (patch) | |
tree | 5c20a5ad791f672cca789b703691c0c6ea28a5a5 /lib/CodeGen/AsmPrinter | |
parent | 46099f14dca0f72c53984f1562c1fc5f5082e748 (diff) | |
download | external_llvm-65eb482e8fcd6084d83793aeb767ef0bddefc92a.zip external_llvm-65eb482e8fcd6084d83793aeb767ef0bddefc92a.tar.gz external_llvm-65eb482e8fcd6084d83793aeb767ef0bddefc92a.tar.bz2 |
Collect variable information during endFunction() instead of beginFunction().
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104412 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/AsmPrinter')
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 1788e0d..9af5256 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -2156,8 +2156,10 @@ void DwarfDebug::collectVariableInfo(const MachineFunction *MF) { DbgVariable *RegVar = new DbgVariable(DV); DbgVariableToDbgInstMap[RegVar] = MInsn; Scope->addVariable(RegVar); - if (DV.getTag() != dwarf::DW_TAG_arg_variable) + if (DV.getTag() != dwarf::DW_TAG_arg_variable) { DbgValueStartMap[MInsn] = RegVar; + DbgVariableLabelsMap[RegVar] = LabelsBeforeInsn.lookup(MInsn); + } if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) { DbgVariableToDbgInstMap[AbsVar] = MInsn; VarToAbstractVarMap[RegVar] = AbsVar; @@ -2186,12 +2188,13 @@ void DwarfDebug::beginScope(const MachineInstr *MI) { if (DL.isUnknown() && !UnknownLocations) return; - DbgVariable *LocalVar = NULL; + bool LocalVar = false; if (MI->isDebugValue()) { - DenseMap<const MachineInstr *, DbgVariable *>::iterator DI - = DbgValueStartMap.find(MI); - if (DI != DbgValueStartMap.end()) - LocalVar = DI->second; + assert (MI->getNumOperands() > 1 && "Invalid machine instruction!"); + DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata()); + if (!DV.Verify()) return; + if (DV.getTag() != dwarf::DW_TAG_arg_variable) + LocalVar = true; } MCSymbol *Label = NULL; @@ -2220,10 +2223,6 @@ void DwarfDebug::beginScope(const MachineInstr *MI) { // even if previous label is reused. if (InsnsBeginScopeSet.count(MI) != 0) LabelsBeforeInsn[MI] = Label; - - // If this is a DBG_VALUE instruction then record label to identify variable. - if (LocalVar) - DbgVariableLabelsMap[LocalVar] = Label; } /// endScope - Process end of a scope. @@ -2509,8 +2508,6 @@ static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) { void DwarfDebug::beginFunction(const MachineFunction *MF) { if (!MMI->hasDebugInfo()) return; if (!extractScopeInformation()) return; - - collectVariableInfo(MF); FunctionBeginSym = Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()); @@ -2543,6 +2540,9 @@ void DwarfDebug::endFunction(const MachineFunction *MF) { if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return; if (CurrentFnDbgScope) { + + collectVariableInfo(MF); + // Define end label for subprogram. Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_end", Asm->getFunctionNumber())); |