10c557db6SMats Larsen //===-------------- PassBuilder bindings for LLVM-C -----------------------===// 20c557db6SMats Larsen // 30c557db6SMats Larsen // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40c557db6SMats Larsen // See https://llvm.org/LICENSE.txt for license information. 50c557db6SMats Larsen // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60c557db6SMats Larsen // 70c557db6SMats Larsen //===----------------------------------------------------------------------===// 80c557db6SMats Larsen /// \file 90c557db6SMats Larsen /// 100c557db6SMats Larsen /// This file defines the C bindings to the new pass manager 110c557db6SMats Larsen /// 120c557db6SMats Larsen //===----------------------------------------------------------------------===// 130c557db6SMats Larsen 140c557db6SMats Larsen #include "llvm-c/Transforms/PassBuilder.h" 15241f9e74STim Besard #include "llvm/Analysis/AliasAnalysis.h" 1674deadf1SNikita Popov #include "llvm/IR/Module.h" 170c557db6SMats Larsen #include "llvm/IR/Verifier.h" 180c557db6SMats Larsen #include "llvm/Passes/PassBuilder.h" 190c557db6SMats Larsen #include "llvm/Passes/StandardInstrumentations.h" 200c557db6SMats Larsen #include "llvm/Support/CBindingWrapping.h" 210c557db6SMats Larsen 220c557db6SMats Larsen using namespace llvm; 230c557db6SMats Larsen 240c557db6SMats Larsen namespace llvm { 250c557db6SMats Larsen /// Helper struct for holding a set of builder options for LLVMRunPasses. This 260c557db6SMats Larsen /// structure is used to keep LLVMRunPasses backwards compatible with future 270c557db6SMats Larsen /// versions in case we modify the options the new Pass Manager utilizes. 280c557db6SMats Larsen class LLVMPassBuilderOptions { 290c557db6SMats Larsen public: 300c557db6SMats Larsen explicit LLVMPassBuilderOptions( 310c557db6SMats Larsen bool DebugLogging = false, bool VerifyEach = false, 32241f9e74STim Besard const char *AAPipeline = nullptr, 330c557db6SMats Larsen PipelineTuningOptions PTO = PipelineTuningOptions()) 34241f9e74STim Besard : DebugLogging(DebugLogging), VerifyEach(VerifyEach), 35241f9e74STim Besard AAPipeline(AAPipeline), PTO(PTO) {} 360c557db6SMats Larsen 370c557db6SMats Larsen bool DebugLogging; 380c557db6SMats Larsen bool VerifyEach; 39241f9e74STim Besard const char *AAPipeline; 400c557db6SMats Larsen PipelineTuningOptions PTO; 410c557db6SMats Larsen }; 420c557db6SMats Larsen } // namespace llvm 430c557db6SMats Larsen 440c557db6SMats Larsen static TargetMachine *unwrap(LLVMTargetMachineRef P) { 450c557db6SMats Larsen return reinterpret_cast<TargetMachine *>(P); 460c557db6SMats Larsen } 470c557db6SMats Larsen 480c557db6SMats Larsen DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMPassBuilderOptions, 490c557db6SMats Larsen LLVMPassBuilderOptionsRef) 500c557db6SMats Larsen 51*00def06cSTim Besard static LLVMErrorRef runPasses(Module *Mod, Function *Fun, const char *Passes, 52*00def06cSTim Besard TargetMachine *Machine, 53*00def06cSTim Besard LLVMPassBuilderOptions *PassOpts) { 540c557db6SMats Larsen bool Debug = PassOpts->DebugLogging; 550c557db6SMats Larsen bool VerifyEach = PassOpts->VerifyEach; 560c557db6SMats Larsen 570c557db6SMats Larsen PassInstrumentationCallbacks PIC; 58aadaafacSKazu Hirata PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC); 590c557db6SMats Larsen 600c557db6SMats Larsen LoopAnalysisManager LAM; 610c557db6SMats Larsen FunctionAnalysisManager FAM; 620c557db6SMats Larsen CGSCCAnalysisManager CGAM; 630c557db6SMats Larsen ModuleAnalysisManager MAM; 64241f9e74STim Besard if (PassOpts->AAPipeline) { 65241f9e74STim Besard // If we have a custom AA pipeline, we need to register it _before_ calling 66241f9e74STim Besard // registerFunctionAnalyses, or the default alias analysis pipeline is used. 67241f9e74STim Besard AAManager AA; 68241f9e74STim Besard if (auto Err = PB.parseAAPipeline(AA, PassOpts->AAPipeline)) 69241f9e74STim Besard return wrap(std::move(Err)); 70241f9e74STim Besard FAM.registerPass([&] { return std::move(AA); }); 71241f9e74STim Besard } 720c557db6SMats Larsen PB.registerLoopAnalyses(LAM); 730c557db6SMats Larsen PB.registerFunctionAnalyses(FAM); 740c557db6SMats Larsen PB.registerCGSCCAnalyses(CGAM); 750c557db6SMats Larsen PB.registerModuleAnalyses(MAM); 760c557db6SMats Larsen PB.crossRegisterProxies(LAM, FAM, CGAM, MAM); 770c557db6SMats Larsen 78721f975dSEvgeniy Brevnov StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach); 796a6994ccSArthur Eubanks SI.registerCallbacks(PIC, &MAM); 80*00def06cSTim Besard 81*00def06cSTim Besard // Run the pipeline. 82*00def06cSTim Besard if (Fun) { 83*00def06cSTim Besard FunctionPassManager FPM; 84*00def06cSTim Besard if (VerifyEach) 85*00def06cSTim Besard FPM.addPass(VerifierPass()); 86*00def06cSTim Besard if (auto Err = PB.parsePassPipeline(FPM, Passes)) 870c557db6SMats Larsen return wrap(std::move(Err)); 88*00def06cSTim Besard FPM.run(*Fun, FAM); 89*00def06cSTim Besard } else { 90*00def06cSTim Besard ModulePassManager MPM; 91*00def06cSTim Besard if (VerifyEach) 92*00def06cSTim Besard MPM.addPass(VerifierPass()); 93*00def06cSTim Besard if (auto Err = PB.parsePassPipeline(MPM, Passes)) 94*00def06cSTim Besard return wrap(std::move(Err)); 95*00def06cSTim Besard MPM.run(*Mod, MAM); 960c557db6SMats Larsen } 970c557db6SMats Larsen 980c557db6SMats Larsen return LLVMErrorSuccess; 990c557db6SMats Larsen } 1000c557db6SMats Larsen 101*00def06cSTim Besard LLVMErrorRef LLVMRunPasses(LLVMModuleRef M, const char *Passes, 102*00def06cSTim Besard LLVMTargetMachineRef TM, 103*00def06cSTim Besard LLVMPassBuilderOptionsRef Options) { 104*00def06cSTim Besard TargetMachine *Machine = unwrap(TM); 105*00def06cSTim Besard LLVMPassBuilderOptions *PassOpts = unwrap(Options); 106*00def06cSTim Besard Module *Mod = unwrap(M); 107*00def06cSTim Besard return runPasses(Mod, nullptr, Passes, Machine, PassOpts); 108*00def06cSTim Besard } 109*00def06cSTim Besard 110*00def06cSTim Besard LLVMErrorRef LLVMRunPassesOnFunction(LLVMValueRef F, const char *Passes, 111*00def06cSTim Besard LLVMTargetMachineRef TM, 112*00def06cSTim Besard LLVMPassBuilderOptionsRef Options) { 113*00def06cSTim Besard TargetMachine *Machine = unwrap(TM); 114*00def06cSTim Besard LLVMPassBuilderOptions *PassOpts = unwrap(Options); 115*00def06cSTim Besard Function *Fun = unwrap<Function>(F); 116*00def06cSTim Besard return runPasses(Fun->getParent(), Fun, Passes, Machine, PassOpts); 117*00def06cSTim Besard } 118*00def06cSTim Besard 1190c557db6SMats Larsen LLVMPassBuilderOptionsRef LLVMCreatePassBuilderOptions() { 1200c557db6SMats Larsen return wrap(new LLVMPassBuilderOptions()); 1210c557db6SMats Larsen } 1220c557db6SMats Larsen 1230c557db6SMats Larsen void LLVMPassBuilderOptionsSetVerifyEach(LLVMPassBuilderOptionsRef Options, 1240c557db6SMats Larsen LLVMBool VerifyEach) { 1250c557db6SMats Larsen unwrap(Options)->VerifyEach = VerifyEach; 1260c557db6SMats Larsen } 1270c557db6SMats Larsen 1280c557db6SMats Larsen void LLVMPassBuilderOptionsSetDebugLogging(LLVMPassBuilderOptionsRef Options, 1290c557db6SMats Larsen LLVMBool DebugLogging) { 1300c557db6SMats Larsen unwrap(Options)->DebugLogging = DebugLogging; 1310c557db6SMats Larsen } 1320c557db6SMats Larsen 133241f9e74STim Besard void LLVMPassBuilderOptionsSetAAPipeline(LLVMPassBuilderOptionsRef Options, 134241f9e74STim Besard const char *AAPipeline) { 135241f9e74STim Besard unwrap(Options)->AAPipeline = AAPipeline; 136241f9e74STim Besard } 137241f9e74STim Besard 1380c557db6SMats Larsen void LLVMPassBuilderOptionsSetLoopInterleaving( 1390c557db6SMats Larsen LLVMPassBuilderOptionsRef Options, LLVMBool LoopInterleaving) { 1400c557db6SMats Larsen unwrap(Options)->PTO.LoopInterleaving = LoopInterleaving; 1410c557db6SMats Larsen } 1420c557db6SMats Larsen 1430c557db6SMats Larsen void LLVMPassBuilderOptionsSetLoopVectorization( 1440c557db6SMats Larsen LLVMPassBuilderOptionsRef Options, LLVMBool LoopVectorization) { 1450c557db6SMats Larsen unwrap(Options)->PTO.LoopVectorization = LoopVectorization; 1460c557db6SMats Larsen } 1470c557db6SMats Larsen 1480c557db6SMats Larsen void LLVMPassBuilderOptionsSetSLPVectorization( 1490c557db6SMats Larsen LLVMPassBuilderOptionsRef Options, LLVMBool SLPVectorization) { 1500c557db6SMats Larsen unwrap(Options)->PTO.SLPVectorization = SLPVectorization; 1510c557db6SMats Larsen } 1520c557db6SMats Larsen 1530c557db6SMats Larsen void LLVMPassBuilderOptionsSetLoopUnrolling(LLVMPassBuilderOptionsRef Options, 1540c557db6SMats Larsen LLVMBool LoopUnrolling) { 1550c557db6SMats Larsen unwrap(Options)->PTO.LoopUnrolling = LoopUnrolling; 1560c557db6SMats Larsen } 1570c557db6SMats Larsen 1580c557db6SMats Larsen void LLVMPassBuilderOptionsSetForgetAllSCEVInLoopUnroll( 1590c557db6SMats Larsen LLVMPassBuilderOptionsRef Options, LLVMBool ForgetAllSCEVInLoopUnroll) { 1600c557db6SMats Larsen unwrap(Options)->PTO.ForgetAllSCEVInLoopUnroll = ForgetAllSCEVInLoopUnroll; 1610c557db6SMats Larsen } 1620c557db6SMats Larsen 1630c557db6SMats Larsen void LLVMPassBuilderOptionsSetLicmMssaOptCap(LLVMPassBuilderOptionsRef Options, 1640c557db6SMats Larsen unsigned LicmMssaOptCap) { 1650c557db6SMats Larsen unwrap(Options)->PTO.LicmMssaOptCap = LicmMssaOptCap; 1660c557db6SMats Larsen } 1670c557db6SMats Larsen 1680c557db6SMats Larsen void LLVMPassBuilderOptionsSetLicmMssaNoAccForPromotionCap( 1690c557db6SMats Larsen LLVMPassBuilderOptionsRef Options, unsigned LicmMssaNoAccForPromotionCap) { 1700c557db6SMats Larsen unwrap(Options)->PTO.LicmMssaNoAccForPromotionCap = 1710c557db6SMats Larsen LicmMssaNoAccForPromotionCap; 1720c557db6SMats Larsen } 1730c557db6SMats Larsen 1740c557db6SMats Larsen void LLVMPassBuilderOptionsSetCallGraphProfile( 1750c557db6SMats Larsen LLVMPassBuilderOptionsRef Options, LLVMBool CallGraphProfile) { 1760c557db6SMats Larsen unwrap(Options)->PTO.CallGraphProfile = CallGraphProfile; 1770c557db6SMats Larsen } 1780c557db6SMats Larsen 1790c557db6SMats Larsen void LLVMPassBuilderOptionsSetMergeFunctions(LLVMPassBuilderOptionsRef Options, 1800c557db6SMats Larsen LLVMBool MergeFunctions) { 1810c557db6SMats Larsen unwrap(Options)->PTO.MergeFunctions = MergeFunctions; 1820c557db6SMats Larsen } 1830c557db6SMats Larsen 184c20a9bb0SDmitry Dolgov void LLVMPassBuilderOptionsSetInlinerThreshold( 185c20a9bb0SDmitry Dolgov LLVMPassBuilderOptionsRef Options, int Threshold) { 186c20a9bb0SDmitry Dolgov unwrap(Options)->PTO.InlinerThreshold = Threshold; 187c20a9bb0SDmitry Dolgov } 188c20a9bb0SDmitry Dolgov 1890c557db6SMats Larsen void LLVMDisposePassBuilderOptions(LLVMPassBuilderOptionsRef Options) { 1900c557db6SMats Larsen delete unwrap(Options); 1910c557db6SMats Larsen } 192