xref: /llvm-project/llvm/lib/Passes/PassBuilderBindings.cpp (revision c20a9bb001855da5d14721ce2894e3be77a999fe)
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