【问题标题】:Integrating LLVM passes集成 LLVM 通行证
【发布时间】:2015-07-06 18:01:08
【问题描述】:

这可能是一个菜鸟问题,但有没有办法集成我的 LLVM 模块密码,以便在转换阶段默认调用?

现在我正在使用这个语法来加载我的通行证并注册它

 ~/llvm/llvm/build/Debug+Asserts/bin/clang -Xclang -load -Xclang ~/llvm/llvm/build/Debug+Asserts/lib/SOMEPASSLIB.so

(问题是当我想用这个 pass 构建一些包时,编译器接受它,当我说将加载部分作为 CFLAGS env 变量传递时,但是一些 makefile 也使用 CFLAGS 进行链接,链接器不知道它可以用这些信息做什么并使构建失败:\)

【问题讨论】:

    标签: c++ clang llvm llvm-clang llvm-ir


    【解决方案1】:

    您需要修改几个文件才能在 LLVM 核心中定义您的通行证:

    i) 在您的通行证内:可加载通行证是这样注册的(假设您的通行证名称是 FunctionInfo):

    char FunctionInfo::ID = 0;
    RegisterPass<FunctionInfo> X("function-info", "Functions Information"); 
    

    你需要把它改成这样:

    char FunctionInfo::ID = 0;
    INITIALIZE_PASS_BEGIN(FunctionInfo, "function-info", "Gathering Function info",  false, false)
    INITIALIZE_PASS_DEPENDENCY(DominatorTree)
    INITIALIZE_PASS_DEPENDENCY(LoopInfo)
    .... // initialize all passes which your pass needs
    INITIALIZE_PASS_END(FunctionInfo, "function-info", "gathering function info", false, false)
    
    ModulePass *llvm::createFunctionInfoPass() { return new FunctionInfo(); }
    

    ii) 您还需要在 llvm 中注册您的通行证,至少在 InitializePasses.h 和 LinkAllPasses.h 中。 在 LinkAllPasses.h 你应该添加:

    (void)llvm::createFunctionInfoPass();
    

    并在 InitializePasses.h 中添加:

    void initializeFunctionInfoPass(PassRegistry &);
    

    iii) 除了这些修改之外,您可能需要更改另一个文件,具体取决于您要添加通行证的位置。例如,如果您要将它添加到 lib/Analysis/ 中,您还需要在 Analysis.cpp 中添加一行,如下所示:

     initializeFunctionInfoPass(Registry);
    

    或者如果您要将其添加为新的Scalar Transform,您需要同样修改 Scalar.h 和 Scalar.cpp。

    【讨论】:

    • 谢谢!那非常有帮助。遗憾的是,官方 LLVM 文档在这方面确实缺乏,编写自己的 LLVM Pass 的唯一示例已经过时甚至是错误的(取决于您的操作系统)。看起来RegisterPass pass 已“弃用”(或至少不鼓励),但在任何地方都没有提及替代方案。不得不自己挖掘信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多