我正在尝试编写一个简单的“现代”LLVM pass 并将其与 Clang 一起使用。我希望它能够使用如下命令运行:
clang -Xclang -load -Xclang libMyPass.so file.cpp
有很多关于如何将遗留通行证集成到 Clang 中的手册。然而,关于新通行证管理器的信息并不多。我看到了一系列名为“2018 年编写 LLVM Pass”的文章。但它只提到了您的密码放置在 LLVM 代码树内的情况。我需要在树外构建模块。
class MyPass : public llvm::PassInfoMixin<MyPass> {
public:
llvm::PreservedAnalyses run(
llvm::Function &F,
llvm::FunctionAnalysisManager &FAM
) {
// Pass code here
}
};
extern "C" ::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK
llvmGetPassPluginInfo() {
return {
LLVM_PLUGIN_API_VERSION, "MyPass", "v0.1",
[](llvm::PassBuilder &PB) {
PB.registerPipelineParsingCallback(
[](
llvm::StringRef Name, llvm::FunctionPassManager &FPM,
llvm::ArrayRef <llvm::PassBuilder::PipelineElement>
) {
if (Name == "my-pass") {
FPM.addPass(MyPass());
return true;
}
return false;
}
);
}
};
} …Run Code Online (Sandbox Code Playgroud) 我有一个使用opt工具的ModulePass,但是我无法弄清楚如何在命令行中使用它.我目前使用my pass的工作流程是:
我希望将我的pass与clang命令行集成,以便可以作为现有软件(例如c ++标准库)构建的一部分调用它,而不必为我编译的每个东西重新构建整个构建系统.我已经看到了关于如何做到这一点的提示,但我无法将各个部分组合到一个正常工作的设置中.
使用Clang自动运行LLVM Pass会自动描述我想要的内容,但LLVM 3.4中似乎不推荐使用该方法(PassManagerBuilder已移至旧版命名空间).
LLVM - 使用clang自动运行自己的通行证似乎解决了基本问题,但我希望我能做到这一点,而不必修改clang(这似乎是那里的建议).
使用LLVM 3.4从clang获得新传递的最佳方法是什么?