forked from OSchip/llvm-project
When not destroying the source, the linker is not remapping the types. Added support
to CloneFunctionInto to allow remapping for this case. llvm-svn: 147217
This commit is contained in:
parent
2644063ec9
commit
5d44a4332a
|
@ -134,8 +134,8 @@ inline Function *CloneFunction(const Function *F, ClonedCodeInfo *CodeInfo = 0){
|
|||
/// Clone OldFunc into NewFunc, transforming the old arguments into references
|
||||
/// to VMap values. Note that if NewFunc already has basic blocks, the ones
|
||||
/// cloned into it will be added to the end of the function. This function
|
||||
/// fills in a list of return instructions, and can optionally append the
|
||||
/// specified suffix to all values cloned.
|
||||
/// fills in a list of return instructions, and can optionally remap types
|
||||
/// and/or append the specified suffix to all values cloned.
|
||||
///
|
||||
/// If ModuleLevelChanges is false, VMap contains no non-identity GlobalValue
|
||||
/// mappings.
|
||||
|
@ -145,7 +145,8 @@ void CloneFunctionInto(Function *NewFunc, const Function *OldFunc,
|
|||
bool ModuleLevelChanges,
|
||||
SmallVectorImpl<ReturnInst*> &Returns,
|
||||
const char *NameSuffix = "",
|
||||
ClonedCodeInfo *CodeInfo = 0);
|
||||
ClonedCodeInfo *CodeInfo = 0,
|
||||
ValueMapTypeRemapper *TypeMapper = 0);
|
||||
|
||||
/// CloneAndPruneFunctionInto - This works exactly like CloneFunctionInto,
|
||||
/// except that it does some simple constant prop and DCE on the fly. The
|
||||
|
|
|
@ -890,7 +890,7 @@ void ModuleLinker::linkFunctionBody(Function *Dst, Function *Src) {
|
|||
} else {
|
||||
// Clone the body of the function into the dest function.
|
||||
SmallVector<ReturnInst*, 8> Returns; // Ignore returns.
|
||||
CloneFunctionInto(Dst, Src, ValueMap, false, Returns);
|
||||
CloneFunctionInto(Dst, Src, ValueMap, false, Returns, "", NULL, &TypeMap);
|
||||
}
|
||||
|
||||
// There is no need to map the arguments anymore.
|
||||
|
|
|
@ -75,7 +75,8 @@ void llvm::CloneFunctionInto(Function *NewFunc, const Function *OldFunc,
|
|||
ValueToValueMapTy &VMap,
|
||||
bool ModuleLevelChanges,
|
||||
SmallVectorImpl<ReturnInst*> &Returns,
|
||||
const char *NameSuffix, ClonedCodeInfo *CodeInfo) {
|
||||
const char *NameSuffix, ClonedCodeInfo *CodeInfo,
|
||||
ValueMapTypeRemapper *TypeMapper) {
|
||||
assert(NameSuffix && "NameSuffix cannot be null!");
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
@ -141,7 +142,8 @@ void llvm::CloneFunctionInto(Function *NewFunc, const Function *OldFunc,
|
|||
// Loop over all instructions, fixing each one as we find it...
|
||||
for (BasicBlock::iterator II = BB->begin(); II != BB->end(); ++II)
|
||||
RemapInstruction(II, VMap,
|
||||
ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges);
|
||||
ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges,
|
||||
TypeMapper);
|
||||
}
|
||||
|
||||
/// CloneFunction - Return a copy of the specified function, but without
|
||||
|
|
Loading…
Reference in New Issue