【问题标题】:Using CloneFunctionInto() by llvm使用 llvm 的 CloneFunctionInto()
【发布时间】:2013-05-28 12:41:01
【问题描述】:

我需要在 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

如果你给我一个例子来更好地理解

谢谢

【问题讨论】:

    标签: llvm llvm-3.0


    【解决方案1】:

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

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多