Как зарегистрировать mutli LLVM Pass в одном файле? - PullRequest
0 голосов
/ 19 февраля 2020

Я регистрирую функцию Pass, используя registerPipelineParsingCallback, следуя новым требованиям Pass Manager.

Однако я обнаружил, что могу зарегистрировать только один functionPass или ModulePass. Как я могу зарегистрировать их обоих в одном файле?

мой регистрационный код

extern "C" ::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK
llvmGetPassPluginInfo() {
    return {
            LLVM_PLUGIN_API_VERSION, "HelloNewPMPass", "v0.1",
            [](PassBuilder &PB) {
                PB.registerPipelineParsingCallback(
                        [](StringRef PassName, FunctionPassManager &FPM,...) {
                            if (PassName == "fiber") {
                                FPM.addPass(HelloNewPMPass());
                                return true;
                            }
                            return false;
                        }
                );
            }
    };
}

У меня есть функции Pass и Module pass в одном файле, как показано ниже:

namespace {
    struct HelloNewPMPass : public PassInfoMixin<HelloNewPMPass> {
        PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM) {
            PreservedAnalyses pa = PreservedAnalyses::all();
            return pa;
        }
    };
    struct SecondPass: public PassInfoMixin<StringEncryptionPass> {
      PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM) {
        errs() << M.getName() << "\n";
        PreservedAnalyses pa = PreservedAnalyses::all();
        return pa;
      }
    };
}

Погружаясь в интерфейс registerPipelineParsingCallback, я обнаружил, что параметр функции lamda, который нужен registerPipelineParsingCallback, может быть использован либо FunctionPassManager, либо ModulePassManager.

Интересно, как я могу одновременно зарегистрировать Module & Function PassManager? , Использование лямбда-функции, как показано ниже, не работает

PB.registerPipelineParsingCallback(
                        [](StringRef PassName, FunctionPassManager &FPM, ModulePassManager &MPM) {
...
                            return false;
                        }
                );
...