使用opt运行LLVM pass

使用opt运行LLVM pass,llvm,Llvm,我刚刚开始使用LLVM。我已经写了我自己的问候通行证,效果很好 现在,我想使用StackProtector.cpp中的StackProtector过程运行opt,但我遇到了一些问题。当我查看源代码时,似乎应该使用标志堆栈保护器: INITIALIZE_PASS(StackProtector, "stack-protector", "Insert stack protectors", false, false) 但opt无法识别此标志 我不确定要“加载”哪个文件,因为它不像加载我自己的LLVMH

我刚刚开始使用LLVM。我已经写了我自己的问候通行证,效果很好

现在,我想使用StackProtector.cpp中的StackProtector过程运行opt,但我遇到了一些问题。当我查看源代码时,似乎应该使用标志堆栈保护器:

INITIALIZE_PASS(StackProtector, "stack-protector", "Insert stack protectors", false, false)
但opt无法识别此标志

我不确定要“加载”哪个文件,因为它不像加载我自己的LLVMHello.so文件那么简单,而且我找不到StackProtector.so文件;我相信这可能就是问题所在

编辑:

我终于从LLVMDev那里得到了答案。实际上,我想运行的pass是由llc执行的,而不是opt。但是,我找不到选项-stack protector,因为

llc --help
因为这个选项是隐藏的。如果我这样做

llc --help-hidden
这表明通行证在那里,我只需要跑

llc -print-before=stack-protector <input>
llc-打印前=堆栈保护器

首先,您要在通行证中添加:

static RegisterPass<StackProtector> X("StackProtector", "Insert stack protectors", false, false);
其中Test.bc是您的目标代码。另外,请注意:在Makefile中,不要忘记添加
LIBRARYNAME=StackProtector


另外,请注意,如果传入尚未注册(如果注册,则会出现segfault错误)

那么,此传入不是自定义传入,而是可以在lib/CodeGen中找到的内置传入。所以我想知道我是否可以在不修改源代码的情况下使用opt运行这个过程,这更简单。使用我提供的相同命令,并使用-他们的\u可选\u名称。它适用于任何由您创建的。
//home/YOURNAME/llvm/Release+Asserts/bin/opt -load //home/YOURNAME/llvm/Release+Asserts/lib/StackProtector.so -StackProtector //home/YOURNAME/llvm/tools/clang/woRKSPACE/Test.bc