运行LLVM pass与opt

3

我刚开始接触LLVM。我已经编写了自己的Hello pass,并且运行正常。

现在我想使用StackProtector.cpp中的堆栈保护者pass来运行opt,但是我遇到了问题。当我查看源代码时,看起来我应该使用标志-stack-protector:

INITIALIZE_PASS(StackProtector, "stack-protector", "Insert stack protectors", false, false)

但是opt不认识这个标志。

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

编辑:

我终于从LLVMDev得到了答案。实际上,我想运行的传递是由llc执行的,而不是opt。然而,我找不到选项-stack-protector,

llc --help

因为这个选项是隐藏的。如果我改成:
llc --help-hidden

显示通道已经存在,我只需要运行即可。

llc -print-before=stack-protector <input>
1个回答

2
首先,您需要添加密码:
static RegisterPass<StackProtector> X("StackProtector", "Insert stack protectors", false, false);

其次,在终端中运行目标文件时,经过 make 命令后,你会看到如下内容:

//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

其中Test.bc是目标代码。此外,请注意:在您的Makefile中,不要忘记添加LIBRARYNAME = StackProtector

还要注意,如果该传递尚未注册(如果已注册,则会收到segfault错误)


这个 pass 不是自定义的,而是内置的 pass,可以在 lib/CodeGen 中找到。所以我想知道是否可以在不修改源代码的情况下使用 opt 运行此 pass。 - Izabela
1
那就更简单了。使用我提供的相同命令,并使用-THEIR_OPTIONAL_NAME。它适用于您创建的任何.so文件。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接