Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在一个文件中注册多个LLVM过程?_C++_Llvm_Llvm Ir_Llvm C++ Api - Fatal编程技术网

C++ 如何在一个文件中注册多个LLVM过程?

C++ 如何在一个文件中注册多个LLVM过程?,c++,llvm,llvm-ir,llvm-c++-api,C++,Llvm,Llvm Ir,Llvm C++ Api,我按照新的过程管理器要求,使用registerPipelineParsingCallback注册函数过程 然而,我发现我只能注册单个functionPass或ModulePass。如何在一个文件中同时注册它们 我的注册码是 extern "C" ::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK llvmGetPassPluginInfo() { return { LLVM_PLUGIN_API_VERSION, "

我按照新的过程管理器要求,使用registerPipelineParsingCallback注册函数过程

然而,我发现我只能注册单个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;
                        }
                );
            }
    };
}
我在一个文件中包含函数过程和模块过程,如下所示:

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;
      }
    };
}

我认为您可以使用PB.registerPipelineParsingCallback两次。 就像:

    return {LLVM_PLUGIN_API_VERSION, "HelloNewPMPass", "v0.1",
        [](PassBuilder &PB) {
            PB.registerPipelineParsingCallback([](StringRef PassName, FunctionPassManager &FPM,...){
                if(PassName = "hellonewpmpass"){FPM.addPass(HelloNewPMPass());return true;}
                return false;
            });
            PB.registerPipelineParsingCallback([](StringRef PassName, ModulePassManager &MPM,...){
                if(PassName = "secondpass"){MPM.addPass(SecondPass());return true;}
                return false;
            });
        }
    };
第一个registerPipelineParsingCallback接收函数PassManager,第二个接收模块PassManager

    return {LLVM_PLUGIN_API_VERSION, "HelloNewPMPass", "v0.1",
        [](PassBuilder &PB) {
            PB.registerPipelineParsingCallback([](StringRef PassName, FunctionPassManager &FPM,...){
                if(PassName = "hellonewpmpass"){FPM.addPass(HelloNewPMPass());return true;}
                return false;
            });
            PB.registerPipelineParsingCallback([](StringRef PassName, ModulePassManager &MPM,...){
                if(PassName = "secondpass"){MPM.addPass(SecondPass());return true;}
                return false;
            });
        }
    };