Cloning: Reduce complexity of debug info cloning and fix correctness issue.
Commit r260791 contained an error in that it would introduce a cross-module reference in the old module. It also introduced O(N^2) complexity in the module cloner by requiring the entire module to be visited for each function. Fix both of these problems by avoiding use of the CloneDebugInfoMetadata function (which is only designed to do intra-module cloning) and cloning function-attached metadata in the same way that we clone all other metadata. Differential Revision: http://reviews.llvm.org/D18583 llvm-svn: 264935
This commit is contained in:
@@ -119,6 +119,15 @@ void llvm::CloneFunctionInto(Function *NewFunc, const Function *OldFunc,
|
||||
.addAttributes(NewFunc->getContext(), AttributeSet::FunctionIndex,
|
||||
OldAttrs.getFnAttributes()));
|
||||
|
||||
SmallVector<std::pair<unsigned, MDNode *>, 1> MDs;
|
||||
OldFunc->getAllMetadata(MDs);
|
||||
for (auto MD : MDs)
|
||||
NewFunc->setMetadata(
|
||||
MD.first,
|
||||
MapMetadata(MD.second, VMap,
|
||||
ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges,
|
||||
TypeMapper, Materializer));
|
||||
|
||||
// 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
|
||||
// recursive functions into themselves.
|
||||
@@ -187,8 +196,8 @@ static void AddOperand(DICompileUnit *CU, DISubprogramArray SPs,
|
||||
|
||||
// Clone the module-level debug info associated with OldFunc. The cloned data
|
||||
// will point to NewFunc instead.
|
||||
void llvm::CloneDebugInfoMetadata(Function *NewFunc, const Function *OldFunc,
|
||||
ValueToValueMapTy &VMap) {
|
||||
static void CloneDebugInfoMetadata(Function *NewFunc, const Function *OldFunc,
|
||||
ValueToValueMapTy &VMap) {
|
||||
DebugInfoFinder Finder;
|
||||
Finder.processModule(*OldFunc->getParent());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user