| //===-------------- PassBuilder bindings for LLVM-C -----------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| /// \file |
| /// |
| /// This file defines the C bindings to the new pass manager |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm-c/Transforms/PassBuilder.h" |
| #include "llvm/IR/Verifier.h" |
| #include "llvm/Passes/PassBuilder.h" |
| #include "llvm/Passes/StandardInstrumentations.h" |
| #include "llvm/Support/CBindingWrapping.h" |
| |
| using namespace llvm; |
| |
| namespace llvm { |
| /// Helper struct for holding a set of builder options for LLVMRunPasses. This |
| /// structure is used to keep LLVMRunPasses backwards compatible with future |
| /// versions in case we modify the options the new Pass Manager utilizes. |
| class LLVMPassBuilderOptions { |
| public: |
| explicit LLVMPassBuilderOptions( |
| bool DebugLogging = false, bool VerifyEach = false, |
| PipelineTuningOptions PTO = PipelineTuningOptions()) |
| : DebugLogging(DebugLogging), VerifyEach(VerifyEach), PTO(PTO) {} |
| |
| bool DebugLogging; |
| bool VerifyEach; |
| PipelineTuningOptions PTO; |
| }; |
| } // namespace llvm |
| |
| static TargetMachine *unwrap(LLVMTargetMachineRef P) { |
| return reinterpret_cast<TargetMachine *>(P); |
| } |
| |
| DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMPassBuilderOptions, |
| LLVMPassBuilderOptionsRef) |
| |
| LLVMErrorRef LLVMRunPasses(LLVMModuleRef M, const char *Passes, |
| LLVMTargetMachineRef TM, |
| LLVMPassBuilderOptionsRef Options) { |
| TargetMachine *Machine = unwrap(TM); |
| LLVMPassBuilderOptions *PassOpts = unwrap(Options); |
| bool Debug = PassOpts->DebugLogging; |
| bool VerifyEach = PassOpts->VerifyEach; |
| |
| Module *Mod = unwrap(M); |
| PassInstrumentationCallbacks PIC; |
| PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC); |
| |
| LoopAnalysisManager LAM; |
| FunctionAnalysisManager FAM; |
| CGSCCAnalysisManager CGAM; |
| ModuleAnalysisManager MAM; |
| PB.registerLoopAnalyses(LAM); |
| PB.registerFunctionAnalyses(FAM); |
| PB.registerCGSCCAnalyses(CGAM); |
| PB.registerModuleAnalyses(MAM); |
| PB.crossRegisterProxies(LAM, FAM, CGAM, MAM); |
| |
| StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach); |
| SI.registerCallbacks(PIC, &FAM); |
| ModulePassManager MPM; |
| if (VerifyEach) { |
| MPM.addPass(VerifierPass()); |
| } |
| if (auto Err = PB.parsePassPipeline(MPM, Passes)) { |
| return wrap(std::move(Err)); |
| } |
| |
| MPM.run(*Mod, MAM); |
| return LLVMErrorSuccess; |
| } |
| |
| LLVMPassBuilderOptionsRef LLVMCreatePassBuilderOptions() { |
| return wrap(new LLVMPassBuilderOptions()); |
| } |
| |
| void LLVMPassBuilderOptionsSetVerifyEach(LLVMPassBuilderOptionsRef Options, |
| LLVMBool VerifyEach) { |
| unwrap(Options)->VerifyEach = VerifyEach; |
| } |
| |
| void LLVMPassBuilderOptionsSetDebugLogging(LLVMPassBuilderOptionsRef Options, |
| LLVMBool DebugLogging) { |
| unwrap(Options)->DebugLogging = DebugLogging; |
| } |
| |
| void LLVMPassBuilderOptionsSetLoopInterleaving( |
| LLVMPassBuilderOptionsRef Options, LLVMBool LoopInterleaving) { |
| unwrap(Options)->PTO.LoopInterleaving = LoopInterleaving; |
| } |
| |
| void LLVMPassBuilderOptionsSetLoopVectorization( |
| LLVMPassBuilderOptionsRef Options, LLVMBool LoopVectorization) { |
| unwrap(Options)->PTO.LoopVectorization = LoopVectorization; |
| } |
| |
| void LLVMPassBuilderOptionsSetSLPVectorization( |
| LLVMPassBuilderOptionsRef Options, LLVMBool SLPVectorization) { |
| unwrap(Options)->PTO.SLPVectorization = SLPVectorization; |
| } |
| |
| void LLVMPassBuilderOptionsSetLoopUnrolling(LLVMPassBuilderOptionsRef Options, |
| LLVMBool LoopUnrolling) { |
| unwrap(Options)->PTO.LoopUnrolling = LoopUnrolling; |
| } |
| |
| void LLVMPassBuilderOptionsSetForgetAllSCEVInLoopUnroll( |
| LLVMPassBuilderOptionsRef Options, LLVMBool ForgetAllSCEVInLoopUnroll) { |
| unwrap(Options)->PTO.ForgetAllSCEVInLoopUnroll = ForgetAllSCEVInLoopUnroll; |
| } |
| |
| void LLVMPassBuilderOptionsSetLicmMssaOptCap(LLVMPassBuilderOptionsRef Options, |
| unsigned LicmMssaOptCap) { |
| unwrap(Options)->PTO.LicmMssaOptCap = LicmMssaOptCap; |
| } |
| |
| void LLVMPassBuilderOptionsSetLicmMssaNoAccForPromotionCap( |
| LLVMPassBuilderOptionsRef Options, unsigned LicmMssaNoAccForPromotionCap) { |
| unwrap(Options)->PTO.LicmMssaNoAccForPromotionCap = |
| LicmMssaNoAccForPromotionCap; |
| } |
| |
| void LLVMPassBuilderOptionsSetCallGraphProfile( |
| LLVMPassBuilderOptionsRef Options, LLVMBool CallGraphProfile) { |
| unwrap(Options)->PTO.CallGraphProfile = CallGraphProfile; |
| } |
| |
| void LLVMPassBuilderOptionsSetMergeFunctions(LLVMPassBuilderOptionsRef Options, |
| LLVMBool MergeFunctions) { |
| unwrap(Options)->PTO.MergeFunctions = MergeFunctions; |
| } |
| |
| void LLVMDisposePassBuilderOptions(LLVMPassBuilderOptionsRef Options) { |
| delete unwrap(Options); |
| } |