【问题标题】:Run LLVM pass with opt使用 opt 运行 LLVM pass
【发布时间】:2013-01-21 13:27:18
【问题描述】:

我刚刚开始使用 LLVM。我已经编写了自己的 Hello pass,效果很好。

现在我想使用 StackProtector.cpp 中的堆栈保护程序通行证运行 opt,但我遇到了麻烦。当我查看源代码时,看起来我应该使用标志 -stack-protector:

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

显示pass在那里,我只需要运行

llc -print-before=stack-protector <input>

【问题讨论】:

    标签: llvm


    【解决方案1】:

    首先你添加你的通行证:

    static RegisterPass<StackProtector> X("StackProtector", "Insert stack protectors", false, false);
    

    其次,在终端中,当你在目标文件上运行 pass 时,运行 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

    另外,请注意传入是否尚未注册(如果是,您将收到段错误错误)

    【讨论】:

    • 嗯,这个pass不是自定义pass,是一个内置的pass,可以在lib/CodeGen中找到。所以我想知道是否可以在不修改源代码的情况下使用 opt 运行此 pass。
    • 这更简单。使用我提供的相同命令并使用 -THEIR_OPTIONAL_NAME。它适用于您创建的任何 .so。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多