diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-05-16 19:46:52 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-05-16 19:46:52 +0000 | 
| commit | 6b3f41ed88e8e440e11a4fbf20b6600529f80049 (patch) | |
| tree | 928b056f24a634d628c80238dbbf10d41b1a71d5 /lib/Transforms/Utils/CloneFunction.cpp | |
| parent | c46e6a5940c50058e00c0c5f9123fd82e338d29a (diff) | |
Notes
Diffstat (limited to 'lib/Transforms/Utils/CloneFunction.cpp')
| -rw-r--r-- | lib/Transforms/Utils/CloneFunction.cpp | 32 | 
1 files changed, 26 insertions, 6 deletions
diff --git a/lib/Transforms/Utils/CloneFunction.cpp b/lib/Transforms/Utils/CloneFunction.cpp index d5124ac89016..4aa26fd14fee 100644 --- a/lib/Transforms/Utils/CloneFunction.cpp +++ b/lib/Transforms/Utils/CloneFunction.cpp @@ -41,6 +41,7 @@ BasicBlock *llvm::CloneBasicBlock(const BasicBlock *BB,                                    ValueToValueMapTy &VMap,                                    const Twine &NameSuffix, Function *F,                                    ClonedCodeInfo *CodeInfo) { +  DenseMap<const MDNode *, MDNode *> Cache;    BasicBlock *NewBB = BasicBlock::Create(BB->getContext(), "", F);    if (BB->hasName()) NewBB->setName(BB->getName()+NameSuffix); @@ -50,6 +51,9 @@ BasicBlock *llvm::CloneBasicBlock(const BasicBlock *BB,    for (BasicBlock::const_iterator II = BB->begin(), IE = BB->end();         II != IE; ++II) {      Instruction *NewInst = II->clone(); +    if (F && F->getSubprogram()) +      DebugLoc::reparentDebugInfo(*NewInst, BB->getParent()->getSubprogram(), +                                  F->getSubprogram(), Cache);      if (II->hasName())        NewInst->setName(II->getName()+NameSuffix);      NewBB->getInstList().push_back(NewInst); @@ -120,12 +124,28 @@ void llvm::CloneFunctionInto(Function *NewFunc, const Function *OldFunc,    SmallVector<std::pair<unsigned, MDNode *>, 1> MDs;    OldFunc->getAllMetadata(MDs); -  for (auto MD : MDs) -    NewFunc->addMetadata( -        MD.first, -        *MapMetadata(MD.second, VMap, -                     ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges, -                     TypeMapper, Materializer)); +  for (auto MD : MDs) { +    MDNode *NewMD; +    bool MustCloneSP = +        (MD.first == LLVMContext::MD_dbg && OldFunc->getParent() && +         OldFunc->getParent() == NewFunc->getParent()); +    if (MustCloneSP) { +      auto *SP = cast<DISubprogram>(MD.second); +      NewMD = DISubprogram::getDistinct( +          NewFunc->getContext(), SP->getScope(), SP->getName(), +          NewFunc->getName(), SP->getFile(), SP->getLine(), SP->getType(), +          SP->isLocalToUnit(), SP->isDefinition(), SP->getScopeLine(), +          SP->getContainingType(), SP->getVirtuality(), SP->getVirtualIndex(), +          SP->getThisAdjustment(), SP->getFlags(), SP->isOptimized(), +          SP->getUnit(), SP->getTemplateParams(), SP->getDeclaration(), +          SP->getVariables(), SP->getThrownTypes()); +    } else +      NewMD = +          MapMetadata(MD.second, VMap, +                      ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges, +                      TypeMapper, Materializer); +    NewFunc->addMetadata(MD.first, *NewMD); +  }    // Loop over all of the basic blocks in the function, cloning them as    // appropriate.  Note that we save BE this way in order to handle cloning of  | 
