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" 150c557db6SMats Larsen #include "llvm/IR/Verifier.h" 160c557db6SMats Larsen #include "llvm/Passes/PassBuilder.h" 170c557db6SMats Larsen #include "llvm/Passes/StandardInstrumentations.h" 180c557db6SMats Larsen #include "llvm/Support/CBindingWrapping.h" 190c557db6SMats Larsen 200c557db6SMats Larsen using namespace llvm; 210c557db6SMats Larsen 220c557db6SMats Larsen namespace llvm { 230c557db6SMats Larsen /// Helper struct for holding a set of builder options for LLVMRunPasses. This 240c557db6SMats Larsen /// structure is used to keep LLVMRunPasses backwards compatible with future 250c557db6SMats Larsen /// versions in case we modify the options the new Pass Manager utilizes. 260c557db6SMats Larsen class LLVMPassBuilderOptions { 270c557db6SMats Larsen public: 280c557db6SMats Larsen explicit LLVMPassBuilderOptions( 290c557db6SMats Larsen bool DebugLogging = false, bool VerifyEach = false, 300c557db6SMats Larsen PipelineTuningOptions PTO = PipelineTuningOptions()) 310c557db6SMats Larsen : DebugLogging(DebugLogging), VerifyEach(VerifyEach), PTO(PTO) {} 320c557db6SMats Larsen 330c557db6SMats Larsen bool DebugLogging; 340c557db6SMats Larsen bool VerifyEach; 350c557db6SMats Larsen PipelineTuningOptions PTO; 360c557db6SMats Larsen }; 370c557db6SMats Larsen } // namespace llvm 380c557db6SMats Larsen 390c557db6SMats Larsen static TargetMachine *unwrap(LLVMTargetMachineRef P) { 400c557db6SMats Larsen return reinterpret_cast<TargetMachine *>(P); 410c557db6SMats Larsen } 420c557db6SMats Larsen 430c557db6SMats Larsen DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMPassBuilderOptions, 440c557db6SMats Larsen LLVMPassBuilderOptionsRef) 450c557db6SMats Larsen 460c557db6SMats Larsen LLVMErrorRef LLVMRunPasses(LLVMModuleRef M, const char *Passes, 470c557db6SMats Larsen LLVMTargetMachineRef TM, 480c557db6SMats Larsen LLVMPassBuilderOptionsRef Options) { 490c557db6SMats Larsen TargetMachine *Machine = unwrap(TM); 500c557db6SMats Larsen LLVMPassBuilderOptions *PassOpts = unwrap(Options); 510c557db6SMats Larsen bool Debug = PassOpts->DebugLogging; 520c557db6SMats Larsen bool VerifyEach = PassOpts->VerifyEach; 530c557db6SMats Larsen 540c557db6SMats Larsen Module *Mod = unwrap(M); 550c557db6SMats Larsen PassInstrumentationCallbacks PIC; 56aadaafacSKazu Hirata PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC); 570c557db6SMats Larsen 580c557db6SMats Larsen LoopAnalysisManager LAM; 590c557db6SMats Larsen FunctionAnalysisManager FAM; 600c557db6SMats Larsen CGSCCAnalysisManager CGAM; 610c557db6SMats Larsen ModuleAnalysisManager MAM; 620c557db6SMats Larsen PB.registerLoopAnalyses(LAM); 630c557db6SMats Larsen PB.registerFunctionAnalyses(FAM); 640c557db6SMats Larsen PB.registerCGSCCAnalyses(CGAM); 650c557db6SMats Larsen PB.registerModuleAnalyses(MAM); 660c557db6SMats Larsen PB.crossRegisterProxies(LAM, FAM, CGAM, MAM); 670c557db6SMats Larsen 68721f975dSEvgeniy Brevnov StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach); 696a6994ccSArthur Eubanks SI.registerCallbacks(PIC, &MAM); 700c557db6SMats Larsen ModulePassManager MPM; 710c557db6SMats Larsen if (VerifyEach) { 720c557db6SMats Larsen MPM.addPass(VerifierPass()); 730c557db6SMats Larsen } 740c557db6SMats Larsen if (auto Err = PB.parsePassPipeline(MPM, Passes)) { 750c557db6SMats Larsen return wrap(std::move(Err)); 760c557db6SMats Larsen } 770c557db6SMats Larsen 780c557db6SMats Larsen MPM.run(*Mod, MAM); 790c557db6SMats Larsen return LLVMErrorSuccess; 800c557db6SMats Larsen } 810c557db6SMats Larsen 820c557db6SMats Larsen LLVMPassBuilderOptionsRef LLVMCreatePassBuilderOptions() { 830c557db6SMats Larsen return wrap(new LLVMPassBuilderOptions()); 840c557db6SMats Larsen } 850c557db6SMats Larsen 860c557db6SMats Larsen void LLVMPassBuilderOptionsSetVerifyEach(LLVMPassBuilderOptionsRef Options, 870c557db6SMats Larsen LLVMBool VerifyEach) { 880c557db6SMats Larsen unwrap(Options)->VerifyEach = VerifyEach; 890c557db6SMats Larsen } 900c557db6SMats Larsen 910c557db6SMats Larsen void LLVMPassBuilderOptionsSetDebugLogging(LLVMPassBuilderOptionsRef Options, 920c557db6SMats Larsen LLVMBool DebugLogging) { 930c557db6SMats Larsen unwrap(Options)->DebugLogging = DebugLogging; 940c557db6SMats Larsen } 950c557db6SMats Larsen 960c557db6SMats Larsen void LLVMPassBuilderOptionsSetLoopInterleaving( 970c557db6SMats Larsen LLVMPassBuilderOptionsRef Options, LLVMBool LoopInterleaving) { 980c557db6SMats Larsen unwrap(Options)->PTO.LoopInterleaving = LoopInterleaving; 990c557db6SMats Larsen } 1000c557db6SMats Larsen 1010c557db6SMats Larsen void LLVMPassBuilderOptionsSetLoopVectorization( 1020c557db6SMats Larsen LLVMPassBuilderOptionsRef Options, LLVMBool LoopVectorization) { 1030c557db6SMats Larsen unwrap(Options)->PTO.LoopVectorization = LoopVectorization; 1040c557db6SMats Larsen } 1050c557db6SMats Larsen 1060c557db6SMats Larsen void LLVMPassBuilderOptionsSetSLPVectorization( 1070c557db6SMats Larsen LLVMPassBuilderOptionsRef Options, LLVMBool SLPVectorization) { 1080c557db6SMats Larsen unwrap(Options)->PTO.SLPVectorization = SLPVectorization; 1090c557db6SMats Larsen } 1100c557db6SMats Larsen 1110c557db6SMats Larsen void LLVMPassBuilderOptionsSetLoopUnrolling(LLVMPassBuilderOptionsRef Options, 1120c557db6SMats Larsen LLVMBool LoopUnrolling) { 1130c557db6SMats Larsen unwrap(Options)->PTO.LoopUnrolling = LoopUnrolling; 1140c557db6SMats Larsen } 1150c557db6SMats Larsen 1160c557db6SMats Larsen void LLVMPassBuilderOptionsSetForgetAllSCEVInLoopUnroll( 1170c557db6SMats Larsen LLVMPassBuilderOptionsRef Options, LLVMBool ForgetAllSCEVInLoopUnroll) { 1180c557db6SMats Larsen unwrap(Options)->PTO.ForgetAllSCEVInLoopUnroll = ForgetAllSCEVInLoopUnroll; 1190c557db6SMats Larsen } 1200c557db6SMats Larsen 1210c557db6SMats Larsen void LLVMPassBuilderOptionsSetLicmMssaOptCap(LLVMPassBuilderOptionsRef Options, 1220c557db6SMats Larsen unsigned LicmMssaOptCap) { 1230c557db6SMats Larsen unwrap(Options)->PTO.LicmMssaOptCap = LicmMssaOptCap; 1240c557db6SMats Larsen } 1250c557db6SMats Larsen 1260c557db6SMats Larsen void LLVMPassBuilderOptionsSetLicmMssaNoAccForPromotionCap( 1270c557db6SMats Larsen LLVMPassBuilderOptionsRef Options, unsigned LicmMssaNoAccForPromotionCap) { 1280c557db6SMats Larsen unwrap(Options)->PTO.LicmMssaNoAccForPromotionCap = 1290c557db6SMats Larsen LicmMssaNoAccForPromotionCap; 1300c557db6SMats Larsen } 1310c557db6SMats Larsen 1320c557db6SMats Larsen void LLVMPassBuilderOptionsSetCallGraphProfile( 1330c557db6SMats Larsen LLVMPassBuilderOptionsRef Options, LLVMBool CallGraphProfile) { 1340c557db6SMats Larsen unwrap(Options)->PTO.CallGraphProfile = CallGraphProfile; 1350c557db6SMats Larsen } 1360c557db6SMats Larsen 1370c557db6SMats Larsen void LLVMPassBuilderOptionsSetMergeFunctions(LLVMPassBuilderOptionsRef Options, 1380c557db6SMats Larsen LLVMBool MergeFunctions) { 1390c557db6SMats Larsen unwrap(Options)->PTO.MergeFunctions = MergeFunctions; 1400c557db6SMats Larsen } 1410c557db6SMats Larsen 142*c20a9bb0SDmitry Dolgov void LLVMPassBuilderOptionsSetInlinerThreshold( 143*c20a9bb0SDmitry Dolgov LLVMPassBuilderOptionsRef Options, int Threshold) { 144*c20a9bb0SDmitry Dolgov unwrap(Options)->PTO.InlinerThreshold = Threshold; 145*c20a9bb0SDmitry Dolgov } 146*c20a9bb0SDmitry Dolgov 1470c557db6SMats Larsen void LLVMDisposePassBuilderOptions(LLVMPassBuilderOptionsRef Options) { 1480c557db6SMats Larsen delete unwrap(Options); 1490c557db6SMats Larsen } 150