通过llvm使用CloneFunctionInto()

通过llvm使用CloneFunctionInto(),llvm,llvm-3.0,Llvm,Llvm 3.0,我需要在LLVM函数过程中通过CloneFunctionInto将一个函数克隆到另一个函数中,以防止在第一个过程中对原始控制流图进行任何更改 void CloneFunctionInto(Function*NewFunc,const Function*OldFunc,ValueToValueMapTy&VMap,bool ModuleLevelChanges,SmallVectorImpl&Returns,const char*NameSuffix=“”,ClonedCodeInfo*Code

我需要在LLVM函数过程中通过CloneFunctionInto将一个函数克隆到另一个函数中,以防止在第一个过程中对原始控制流图进行任何更改

void CloneFunctionInto(Function*NewFunc,const Function*OldFunc,ValueToValueMapTy&VMap,bool ModuleLevelChanges,SmallVectorImpl&Returns,const char*NameSuffix=“”,ClonedCodeInfo*CodeInfo=0,ValueMapTypeRemapper*TypeMapper=0);
谁能帮我一下吗,因为我缺少了一些部分,比如
ClonedCodeInfo
ValueMapTypeRemapper

如果你能给我举个例子让我更好的理解

多亏了

的使用,
ClonedCodeInfo
类可用于获取有关刚刚克隆的函数的信息,即该函数是否包含调用或动态alloca指令

同样,for
ValueMapTypeRemapper
告诉我们,它是一个抽象基类,需要任何子类实现它的
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;
};
class MessageUpdater:public ValueMapTypeRemapper
{
公众:
类型*remapType(类型*SrcTy)
{
std::map::迭代器i,e;
对于(i=foo.begin(),e=foo.end();i!=e;++i){
如果(SrcTy==i->first){
返回i->second;
}
}
断言(0&“在映射中找不到类型!”);
返回0;
}
std::mapfoo;
};
你可以这样称呼它:

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);
MessageUpdater-foobar;
foobar.foo.insert(std::make_pair(fromStruct,toStruct));
foobar.foo.insert(std::make_pair(fromStructPtr,toStructPtr));
foobar.foo.insert(std::make_pair(从structPtrPtr到structPtrPtr));
for(inst_迭代器I=inst_开始(f),E=inst_结束(f);I!=E;++I){
insert(std::make_pair(I->getType(),I->getType());
}
std::map::迭代器i,e;
对于(i=foobar.foo.begin(),e=foobar.foo.end();i!=e;++i){
首先是错误()
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);