集成 LLVM passes
Integrating LLVM passes
这可能是一个菜鸟问题,但有没有办法集成我的 LLVM 模块通道,以便在转换阶段默认调用?
现在我正在使用这种语法来加载我的通行证并注册它
~/llvm/llvm/build/Debug+Asserts/bin/clang -Xclang -load -Xclang ~/llvm/llvm/build/Debug+Asserts/lib/SOMEPASSLIB.so
(问题是当我想用这个 pass 构建一些包时,编译器在我说时接受它,将加载部分作为 CFLAGS env 变量传递,但是一些 makefile 也使用 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/ 中添加它,你还需要在 Analysis.cpp 中添加一行,如下所示:
initializeFunctionInfoPass(Registry);
或者如果您要将其添加为新的 标量变换,您需要同样修改 Scalar.h 和 Scalar.cpp。
这可能是一个菜鸟问题,但有没有办法集成我的 LLVM 模块通道,以便在转换阶段默认调用?
现在我正在使用这种语法来加载我的通行证并注册它
~/llvm/llvm/build/Debug+Asserts/bin/clang -Xclang -load -Xclang ~/llvm/llvm/build/Debug+Asserts/lib/SOMEPASSLIB.so
(问题是当我想用这个 pass 构建一些包时,编译器在我说时接受它,将加载部分作为 CFLAGS env 变量传递,但是一些 makefile 也使用 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/ 中添加它,你还需要在 Analysis.cpp 中添加一行,如下所示:
initializeFunctionInfoPass(Registry);
或者如果您要将其添加为新的 标量变换,您需要同样修改 Scalar.h 和 Scalar.cpp。