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

source code of llvm/lib/Passes/PassBuilderBindings.cpp