diff options
| author | Bill Wendling <isanbard@gmail.com> | 2009-05-18 23:08:55 +0000 |
|---|---|---|
| committer | Bill Wendling <isanbard@gmail.com> | 2009-05-18 23:08:55 +0000 |
| commit | ec78f1516da51e2e7dcade608a99b5e59d8f4397 (patch) | |
| tree | 9d6e2f0162f98366fa29299c94cff7ac82f1525c /llvm/lib/CodeGen | |
| parent | 351fa4b1b2de1587effa0da6968c7d0434eda837 (diff) | |
| download | bcm5719-llvm-ec78f1516da51e2e7dcade608a99b5e59d8f4397.tar.gz bcm5719-llvm-ec78f1516da51e2e7dcade608a99b5e59d8f4397.zip | |
Don't set the "location" information for inlined functions' variables.
llvm-svn: 72064
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 5ffe1fdf160..086a8a5f60e 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -129,12 +129,15 @@ public: class VISIBILITY_HIDDEN DbgVariable { DIVariable Var; // Variable Descriptor. unsigned FrameIndex; // Variable frame index. + bool InlinedFnVar; // Variable for an inlined function. public: - DbgVariable(DIVariable V, unsigned I) : Var(V), FrameIndex(I) {} + DbgVariable(DIVariable V, unsigned I, bool IFV) + : Var(V), FrameIndex(I), InlinedFnVar(IFV) {} // Accessors. - DIVariable getVariable() const { return Var; } + DIVariable getVariable() const { return Var; } unsigned getFrameIndex() const { return FrameIndex; } + bool isInlinedFnVar() const { return InlinedFnVar; } }; //===----------------------------------------------------------------------===// @@ -956,10 +959,14 @@ DIE *DwarfDebug::NewDbgScopeVariable(DbgVariable *DV, CompileUnit *Unit) { AddType(Unit, VariableDie, VD.getType()); // Add variable address. - MachineLocation Location; - Location.set(RI->getFrameRegister(*MF), - RI->getFrameIndexOffset(*MF, DV->getFrameIndex())); - AddAddress(VariableDie, dwarf::DW_AT_location, Location); + if (!DV->isInlinedFnVar()) { + // Variables for abstract instances of inlined functions don't get a + // location. + MachineLocation Location; + Location.set(RI->getFrameRegister(*MF), + RI->getFrameIndexOffset(*MF, DV->getFrameIndex())); + AddAddress(VariableDie, dwarf::DW_AT_location, Location); + } return VariableDie; } @@ -2434,6 +2441,7 @@ void DwarfDebug::RecordVariable(GlobalVariable *GV, unsigned FrameIndex, DIDescriptor Desc(GV); DbgScope *Scope = NULL; + bool InlinedFnVar = false; if (Desc.getTag() == dwarf::DW_TAG_variable) { // GV is a global variable. @@ -2472,6 +2480,7 @@ void DwarfDebug::RecordVariable(GlobalVariable *GV, unsigned FrameIndex, // or GV is an inlined local variable. Scope = AI->second; InlinedParamMap[V].insert(GV); + InlinedFnVar = true; } else { // or GV is a local variable. Scope = getOrCreateScope(V); @@ -2480,7 +2489,7 @@ void DwarfDebug::RecordVariable(GlobalVariable *GV, unsigned FrameIndex, } assert(Scope && "Unable to find the variable's scope"); - DbgVariable *DV = new DbgVariable(DIVariable(GV), FrameIndex); + DbgVariable *DV = new DbgVariable(DIVariable(GV), FrameIndex, InlinedFnVar); Scope->AddVariable(DV); if (TimePassesIsEnabled) |

