summaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/AsmPrinter
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2010-05-22 00:04:14 +0000
committerDevang Patel <dpatel@apple.com>2010-05-22 00:04:14 +0000
commit65eb482e8fcd6084d83793aeb767ef0bddefc92a (patch)
tree5c20a5ad791f672cca789b703691c0c6ea28a5a5 /lib/CodeGen/AsmPrinter
parent46099f14dca0f72c53984f1562c1fc5f5082e748 (diff)
downloadexternal_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.cpp24
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()));