Правильный способ LLVM - создать все analysisManager
с, а затем связать их все вместе.Давайте начнем с их создания:
llvm::PassBuilder passBuilder;
llvm::LoopAnalysisManager loopAnalysisManager(true); // true is just to output debug info
llvm::FunctionAnalysisManager functionAnalysisManager(true);
llvm::CGSCCAnalysisManager cGSCCAnalysisManager(true);
llvm::ModuleAnalysisManager moduleAnalysisManager(true);
Затем мы регистрируем каждого менеджера индивидуально, а затем перекрестно регистрируем их.Это означает, что количество менеджеров здесь фиксировано, и если LLVM (7 в настоящее время) меняет количество менеджеров, его необходимо адаптировать:
passBuilder.registerModuleAnalyses(moduleAnalysisManager);
passBuilder.registerCGSCCAnalyses(cGSCCAnalysisManager);
passBuilder.registerFunctionAnalyses(functionAnalysisManager);
passBuilder.registerLoopAnalyses(loopAnalysisManager);
// This is the important line:
passBuilder.crossRegisterProxies(
loopAnalysisManager, functionAnalysisManager, cGSCCAnalysisManager, moduleAnalysisManager);
После создания passBuilder
наконец, мы можем выполнить этапы оптимизации для модуля с помощью вызова moduleAnalysisManager
.
llvm::ModulePassManager modulePassManager =
passBuilder.buildPerModuleDefaultPipeline(llvm::PassBuilder::OptimizationLevel::O3);
modulePassManager.run(*module, moduleAnalysisManager);
Это будет запускать проходы на уровне модуля, а также все внутренние проходы, которые LLVM может выполнять на элементах модуля.(уровень функции, уровень петли ...).