我有来自LLVM.org的示例代码:
#include "llvm/Pass.h" #include "llvm/IR/Function.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; namespace { struct Hello : public FunctionPass { static char ID; Hello() : FunctionPass(ID) {} bool runOnFunction(Function &F) override { errs() << "Hello: "; errs().write_escaped(F.getName()) << '\n'; return false; } }; // end of struct Hello } // end of anonymous namespace char Hello::ID = 0; static RegisterPass<Hello> X("hello", "Hello World Pass", false /* Only looks at CFG */, false /* Analysis Pass */);
该项目build立良好,并创build一个SkeletonPass.dll。
当我执行命令时:
C:\Users\nlykkei\Projects\llvm-pass-tutorial\build>opt -load skeleton\Debug\SkeletonPass.dll -hello foo.bc opt: Unknown command line argument '-hello'. Try: 'opt -help' opt: Did you mean '-help'?
opt
不承认-hello
选项,即使这样一切工作正常在Ubuntu 16.04。
另外,如果我执行:
clang -Xclang -load -Xclang skeleton\Debug\SkeletonPass.dll foo.bc
Visual Studioterminal上没有打印出任何内容(本地工具命令提示符x86)。 在Linux上,相同的位代码文件很好地打印了函数名称。
什么可以是我的经验的原因? 我在Windows 10上的操作与我在Ubuntu上完全一样,但结果却非常不同。
在Windows上插件是特殊的野兽,因为后者不支持正确的动态链接,所以你的通行证根本不会在PassRegistry中注册。 所以你需要将所有的LLVM编译成.dll,或者将你的pass静态地链接到opt / clang。