diff options
| author | Devang Patel <dpatel@apple.com> | 2011-07-19 22:31:15 +0000 | 
|---|---|---|
| committer | Devang Patel <dpatel@apple.com> | 2011-07-19 22:31:15 +0000 | 
| commit | c8fcfc9cd9c0940e8afdaba8b815f8f489b457ba (patch) | |
| tree | 15388a01e5f814adf55d45af3d3fc596f87d361b | |
| parent | 80d01dd3d19a84621324ac444c6749602df7a513 (diff) | |
| download | external_llvm-c8fcfc9cd9c0940e8afdaba8b815f8f489b457ba.zip external_llvm-c8fcfc9cd9c0940e8afdaba8b815f8f489b457ba.tar.gz external_llvm-c8fcfc9cd9c0940e8afdaba8b815f8f489b457ba.tar.bz2  | |
Distinguish between two copies of one inlined variable.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135528 91177308-0d34-0410-b5e6-96231b3b80d8
| -rw-r--r-- | include/llvm/Analysis/DebugInfo.h | 3 | ||||
| -rw-r--r-- | lib/Analysis/DebugInfo.cpp | 11 | ||||
| -rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 8 | ||||
| -rw-r--r-- | lib/Transforms/Utils/InlineFunction.cpp | 9 | 
4 files changed, 28 insertions, 3 deletions
diff --git a/include/llvm/Analysis/DebugInfo.h b/include/llvm/Analysis/DebugInfo.h index 77b95db..152d11e 100644 --- a/include/llvm/Analysis/DebugInfo.h +++ b/include/llvm/Analysis/DebugInfo.h @@ -725,6 +725,9 @@ namespace llvm {    DIVariable createInlinedVariable(MDNode *DV, MDNode *InlinedScope,                                     LLVMContext &VMContext); +  /// cleanseInlinedVariable - Remove inlined scope from the variable. +  DIVariable cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext); +    class DebugInfoFinder {    public:      /// processModule - Process entire module and collect debug info diff --git a/lib/Analysis/DebugInfo.cpp b/lib/Analysis/DebugInfo.cpp index 8fac3fb..4dcf04e 100644 --- a/lib/Analysis/DebugInfo.cpp +++ b/lib/Analysis/DebugInfo.cpp @@ -776,6 +776,17 @@ DIVariable llvm::createInlinedVariable(MDNode *DV, MDNode *InlinedScope,    return DIVariable(MDNode::get(VMContext, Elts));  } +/// cleanseInlinedVariable - Remove inlined scope from the variable. +DIVariable llvm::cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext) { +  SmallVector<Value *, 16> Elts; +  // Insert inlined scope as 7th element. +  for (unsigned i = 0, e = DV->getNumOperands(); i != e; ++i) +    i == 7 ?  +      Elts.push_back(llvm::Constant::getNullValue(Type::getInt32Ty(VMContext))): +      Elts.push_back(DV->getOperand(i)); +  return DIVariable(MDNode::get(VMContext, Elts)); +} +  //===----------------------------------------------------------------------===//  // DebugInfoFinder implementations.  //===----------------------------------------------------------------------===// diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 125e1e8..d427e28 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1268,14 +1268,18 @@ void DwarfDebug::endModule() {  }  /// findAbstractVariable - Find abstract variable, if any, associated with Var. -DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var, +DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,                                                DebugLoc ScopeLoc) { +  LLVMContext &Ctx = DV->getContext(); + +  // More then one inlined variable corresponds to one abstract variable. +  DIVariable Var = cleanseInlinedVariable(DV, Ctx);    DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);    if (AbsDbgVariable)      return AbsDbgVariable; -  LLVMContext &Ctx = Var->getContext(); +    DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));    if (!Scope)      return NULL; diff --git a/lib/Transforms/Utils/InlineFunction.cpp b/lib/Transforms/Utils/InlineFunction.cpp index 6d8a319..714b12c 100644 --- a/lib/Transforms/Utils/InlineFunction.cpp +++ b/lib/Transforms/Utils/InlineFunction.cpp @@ -770,8 +770,15 @@ static void fixupLineNumbers(Function *Fn, Function::iterator FI,      for (BasicBlock::iterator BI = FI->begin(), BE = FI->end();           BI != BE; ++BI) {        DebugLoc DL = BI->getDebugLoc(); -      if (!DL.isUnknown()) +      if (!DL.isUnknown()) {          BI->setDebugLoc(updateInlinedAtInfo(DL, TheCallDL, BI->getContext())); +        if (DbgValueInst *DVI = dyn_cast<DbgValueInst>(BI)) { +          LLVMContext &Ctx = BI->getContext(); +          MDNode *InlinedAt = BI->getDebugLoc().getInlinedAt(Ctx); +          DVI->setOperand(2, createInlinedVariable(DVI->getVariable(),  +                                                   InlinedAt, Ctx)); +        } +      }      }    }  }  | 
