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