1 //===-------------- PassBuilder bindings for LLVM-C -----------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// \file 9 /// 10 /// This file defines the C bindings to the new pass manager 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm-c/Transforms/PassBuilder.h" 15 #include "llvm/IR/Module.h" 16 #include "llvm/IR/Verifier.h" 17 #include "llvm/Passes/PassBuilder.h" 18 #include "llvm/Passes/StandardInstrumentations.h" 19 #include "llvm/Support/CBindingWrapping.h" 20 21 using namespace llvm; 22 23 namespace llvm { 24 /// Helper struct for holding a set of builder options for LLVMRunPasses. This 25 /// structure is used to keep LLVMRunPasses backwards compatible with future 26 /// versions in case we modify the options the new Pass Manager utilizes. 27 class LLVMPassBuilderOptions { 28 public: 29 explicit LLVMPassBuilderOptions( 30 bool DebugLogging = false, bool VerifyEach = false, 31 PipelineTuningOptions PTO = PipelineTuningOptions()) 32 : DebugLogging(DebugLogging), VerifyEach(VerifyEach), PTO(PTO) {} 33 34 bool DebugLogging; 35 bool VerifyEach; 36 PipelineTuningOptions PTO; 37 }; 38 } // namespace llvm 39 40 static TargetMachine *unwrap(LLVMTargetMachineRef P) { 41 return reinterpret_cast<TargetMachine *>(P); 42 } 43 44 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMPassBuilderOptions, 45 LLVMPassBuilderOptionsRef) 46 47 LLVMErrorRef LLVMRunPasses(LLVMModuleRef M, const char *Passes, 48 LLVMTargetMachineRef TM, 49 LLVMPassBuilderOptionsRef Options) { 50 TargetMachine *Machine = unwrap(TM); 51 LLVMPassBuilderOptions *PassOpts = unwrap(Options); 52 bool Debug = PassOpts->DebugLogging; 53 bool VerifyEach = PassOpts->VerifyEach; 54 55 Module *Mod = unwrap(M); 56 PassInstrumentationCallbacks PIC; 57 PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC); 58 59 LoopAnalysisManager LAM; 60 FunctionAnalysisManager FAM; 61 CGSCCAnalysisManager CGAM; 62 ModuleAnalysisManager MAM; 63 PB.registerLoopAnalyses(LAM); 64 PB.registerFunctionAnalyses(FAM); 65 PB.registerCGSCCAnalyses(CGAM); 66 PB.registerModuleAnalyses(MAM); 67 PB.crossRegisterProxies(LAM, FAM, CGAM, MAM); 68 69 StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach); 70 SI.registerCallbacks(PIC, &MAM); 71 ModulePassManager MPM; 72 if (VerifyEach) { 73 MPM.addPass(VerifierPass()); 74 } 75 if (auto Err = PB.parsePassPipeline(MPM, Passes)) { 76 return wrap(std::move(Err)); 77 } 78 79 MPM.run(*Mod, MAM); 80 return LLVMErrorSuccess; 81 } 82 83 LLVMPassBuilderOptionsRef LLVMCreatePassBuilderOptions() { 84 return wrap(new LLVMPassBuilderOptions()); 85 } 86 87 void LLVMPassBuilderOptionsSetVerifyEach(LLVMPassBuilderOptionsRef Options, 88 LLVMBool VerifyEach) { 89 unwrap(Options)->VerifyEach = VerifyEach; 90 } 91 92 void LLVMPassBuilderOptionsSetDebugLogging(LLVMPassBuilderOptionsRef Options, 93 LLVMBool DebugLogging) { 94 unwrap(Options)->DebugLogging = DebugLogging; 95 } 96 97 void LLVMPassBuilderOptionsSetLoopInterleaving( 98 LLVMPassBuilderOptionsRef Options, LLVMBool LoopInterleaving) { 99 unwrap(Options)->PTO.LoopInterleaving = LoopInterleaving; 100 } 101 102 void LLVMPassBuilderOptionsSetLoopVectorization( 103 LLVMPassBuilderOptionsRef Options, LLVMBool LoopVectorization) { 104 unwrap(Options)->PTO.LoopVectorization = LoopVectorization; 105 } 106 107 void LLVMPassBuilderOptionsSetSLPVectorization( 108 LLVMPassBuilderOptionsRef Options, LLVMBool SLPVectorization) { 109 unwrap(Options)->PTO.SLPVectorization = SLPVectorization; 110 } 111 112 void LLVMPassBuilderOptionsSetLoopUnrolling(LLVMPassBuilderOptionsRef Options, 113 LLVMBool LoopUnrolling) { 114 unwrap(Options)->PTO.LoopUnrolling = LoopUnrolling; 115 } 116 117 void LLVMPassBuilderOptionsSetForgetAllSCEVInLoopUnroll( 118 LLVMPassBuilderOptionsRef Options, LLVMBool ForgetAllSCEVInLoopUnroll) { 119 unwrap(Options)->PTO.ForgetAllSCEVInLoopUnroll = ForgetAllSCEVInLoopUnroll; 120 } 121 122 void LLVMPassBuilderOptionsSetLicmMssaOptCap(LLVMPassBuilderOptionsRef Options, 123 unsigned LicmMssaOptCap) { 124 unwrap(Options)->PTO.LicmMssaOptCap = LicmMssaOptCap; 125 } 126 127 void LLVMPassBuilderOptionsSetLicmMssaNoAccForPromotionCap( 128 LLVMPassBuilderOptionsRef Options, unsigned LicmMssaNoAccForPromotionCap) { 129 unwrap(Options)->PTO.LicmMssaNoAccForPromotionCap = 130 LicmMssaNoAccForPromotionCap; 131 } 132 133 void LLVMPassBuilderOptionsSetCallGraphProfile( 134 LLVMPassBuilderOptionsRef Options, LLVMBool CallGraphProfile) { 135 unwrap(Options)->PTO.CallGraphProfile = CallGraphProfile; 136 } 137 138 void LLVMPassBuilderOptionsSetMergeFunctions(LLVMPassBuilderOptionsRef Options, 139 LLVMBool MergeFunctions) { 140 unwrap(Options)->PTO.MergeFunctions = MergeFunctions; 141 } 142 143 void LLVMPassBuilderOptionsSetInlinerThreshold( 144 LLVMPassBuilderOptionsRef Options, int Threshold) { 145 unwrap(Options)->PTO.InlinerThreshold = Threshold; 146 } 147 148 void LLVMDisposePassBuilderOptions(LLVMPassBuilderOptionsRef Options) { 149 delete unwrap(Options); 150 } 151