Я пытаюсь написать простой "современный" проход LLVM и использовать его с Clang.Я хочу, чтобы его можно было запустить с помощью такой команды: clang -Xclang -load -Xclang libMyPass.so file.cpp
Существует множество руководств по интеграции устаревшего прохода в Clang.Однако информации о новом менеджере пропусков не так много.Я наткнулся на серию статей под названием «Написание пропуска LLVM в 2018 году».Но в нем упоминается только тот случай, когда ваш код доступа находится внутри дерева кодов 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;
}
);
}
};
}
В данный момент передача не выполняется.Я попытался просмотреть вывод опции -print-after-all и с помощью std::cout
определить, запущен ли он.Я не вижу свой пропуск в журналах.Также я не вижу свои выходные данные отладки в окне консоли.