2013-05-28 29 views
2

我需要通過LLVM函數傳遞中的CloneFunctionInto將函數克隆到另一個函數中,以保持原始控制流圖不受我可能在第一個中做出的任何更改的影響。使用CloneFunctionInto()by llvm

http://llvm.org/docs/doxygen/html/Cloning_8h_source.html

void CloneFunctionInto(Function *NewFunc, const Function *OldFunc, ValueToValueMapTy &VMap, bool ModuleLevelChanges, SmallVectorImpl<ReturnInst*> &Returns, const char *NameSuffix = "", ClonedCodeInfo *CodeInfo = 0, ValueMapTypeRemapper *TypeMapper = 0); 

誰能幫我一下吧,因爲我有一些缺失的部分,如ClonedCodeInfoValueMapTypeRemapper

如果請你給我一個例子,以獲得更好的理解

感謝

回答

1

doxygen拽,ClonedCodeInfo類可用於獲取信息傳回有關您剛剛克隆,即不論是否功能該函數包含調用或動態分配指令。

再次documentationValueMapTypeRemapper告訴我們這是一個抽象的基類,要求任何子類實現其remapType()方法。顧名思義,這可以用來用其他類型替換函數中的某些類型。

下面是一些示例代碼:

class MessageUpdater: public ValueMapTypeRemapper 
{ 
public: 
    Type *remapType(Type *SrcTy) 
    { 
     std::map<Type *, Type *>::iterator i, e; 
     for (i = foo.begin(), e = foo.end(); i != e; ++i) { 
      if (SrcTy == i->first) { 
       return i->second; 
      } 
     } 

     assert(0 && "Type not found in map!"); 
     return 0; 
    } 
    std::map<Type *, Type *> foo; 
}; 

你可以這樣調用:

MessageUpdater foobar; 

foobar.foo.insert(std::make_pair(fromStruct, toStruct)); 
foobar.foo.insert(std::make_pair(fromStructPtr, toStructPtr)); 
foobar.foo.insert(std::make_pair(fromStructPtrPtr, toStructPtrPtr)); 

for (inst_iterator I = inst_begin(f), E = inst_end(f); I != E; ++I) { 
    foobar.foo.insert(std::make_pair(I->getType(), I->getType())); 
} 

std::map<Type *, Type *>::iterator i, e; 
for (i = foobar.foo.begin(), e = foobar.foo.end(); i != e; ++i) { 
    errs() << *i->first << " maps to " << *i->second << "\n"; 
} 

CloneFunctionInto(newFun, f, vmap, false, Returns, "", 0, &foobar); 

你會發現,你是不是需要一個ClonedCodeInfo對象傳遞到這個功能,所以我只通過0.

+0

我看不到'vmap'來自哪裏代碼。 – arrowd