集成 LLVM 通行证

Integrating LLVM passes

本文关键字:通行证 LLVM 集成      更新时间:2023-10-16

这可能是一个新手问题,但是有没有办法集成我的LLVM模块通行证,以便在转换阶段默认调用?

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

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

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

您需要修改几个文件才能在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/中添加它,您还需要在分析中添加一行.cpp如下所示:

 initializeFunctionInfoPass(Registry);

或者,如果您要将其添加为新的标量变换,则需要同时修改Scalar.h和标量.cpp同样。