集成LLVM传递

时间:2015-04-28 03:58:31

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

这可能是一个新手问题但有没有办法在转换阶段将我的LLVM模块通道集成到默认情况下进行调用?

现在我正在使用这种语法来加载我的传递并注册它

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

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

1 个答案:

答案 0 :(得分:4)

为了在LLVM核心内部定义传递,您需要修改几个文件:

i)你的传递中:可加载的传递是这样注册的(假设你的传递名称是FunctionInfo):

await

您需要将其更改为:

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

ii)你需要在llvm中注册你的传递,至少在InitializePasses.h和LinkAllPasses.h中。 在LinkAllPasses.h中你应该添加:

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(); }

并在InitializePasses.h中添加:

(void)llvm::createFunctionInfoPass();

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

void initializeFunctionInfoPass(PassRegistry &);

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