Как автоматически зарегистрироваться и загрузить современный Pass in Clang? - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь написать простой "современный" проход 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 определить, запущен ли он.Я не вижу свой пропуск в журналах.Также я не вижу свои выходные данные отладки в окне консоли.

...