gpt4 book ai didi

llvm - 通过 llvm 使用 CloneFunctionInto()

转载 作者:行者123 更新时间:2023-12-05 01:09:42 26 4
gpt4 key购买 nike

我需要在 LLVM 函数传递中通过 CloneFunctionInto 将一个函数克隆到另一个函数中,以保持原始控制流图不受我在第一个过程中可能进行的任何更改的影响。

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

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

谢谢

最佳答案

doxygen 中提取, ClonedCodeInfo 类可用于获取有关您刚刚克隆的函数的信息,即该函数是否包含调用或动态分配指令。

再次 documentation 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;
};

你可以这样调用它:

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。

关于llvm - 通过 llvm 使用 CloneFunctionInto(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16792357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com