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 | |
20 | using namespace llvm; |
21 | |
22 | namespace 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. |
26 | class LLVMPassBuilderOptions { |
27 | public: |
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 | |
39 | static TargetMachine *unwrap(LLVMTargetMachineRef P) { |
40 | return reinterpret_cast<TargetMachine *>(P); |
41 | } |
42 | |
43 | DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMPassBuilderOptions, |
44 | LLVMPassBuilderOptionsRef) |
45 | |
46 | LLVMErrorRef 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 | |
82 | LLVMPassBuilderOptionsRef LLVMCreatePassBuilderOptions() { |
83 | return wrap(P: new LLVMPassBuilderOptions()); |
84 | } |
85 | |
86 | void LLVMPassBuilderOptionsSetVerifyEach(LLVMPassBuilderOptionsRef Options, |
87 | LLVMBool VerifyEach) { |
88 | unwrap(P: Options)->VerifyEach = VerifyEach; |
89 | } |
90 | |
91 | void LLVMPassBuilderOptionsSetDebugLogging(LLVMPassBuilderOptionsRef Options, |
92 | LLVMBool DebugLogging) { |
93 | unwrap(P: Options)->DebugLogging = DebugLogging; |
94 | } |
95 | |
96 | void LLVMPassBuilderOptionsSetLoopInterleaving( |
97 | LLVMPassBuilderOptionsRef Options, LLVMBool LoopInterleaving) { |
98 | unwrap(P: Options)->PTO.LoopInterleaving = LoopInterleaving; |
99 | } |
100 | |
101 | void LLVMPassBuilderOptionsSetLoopVectorization( |
102 | LLVMPassBuilderOptionsRef Options, LLVMBool LoopVectorization) { |
103 | unwrap(P: Options)->PTO.LoopVectorization = LoopVectorization; |
104 | } |
105 | |
106 | void LLVMPassBuilderOptionsSetSLPVectorization( |
107 | LLVMPassBuilderOptionsRef Options, LLVMBool SLPVectorization) { |
108 | unwrap(P: Options)->PTO.SLPVectorization = SLPVectorization; |
109 | } |
110 | |
111 | void LLVMPassBuilderOptionsSetLoopUnrolling(LLVMPassBuilderOptionsRef Options, |
112 | LLVMBool LoopUnrolling) { |
113 | unwrap(P: Options)->PTO.LoopUnrolling = LoopUnrolling; |
114 | } |
115 | |
116 | void LLVMPassBuilderOptionsSetForgetAllSCEVInLoopUnroll( |
117 | LLVMPassBuilderOptionsRef Options, LLVMBool ForgetAllSCEVInLoopUnroll) { |
118 | unwrap(P: Options)->PTO.ForgetAllSCEVInLoopUnroll = ForgetAllSCEVInLoopUnroll; |
119 | } |
120 | |
121 | void LLVMPassBuilderOptionsSetLicmMssaOptCap(LLVMPassBuilderOptionsRef Options, |
122 | unsigned LicmMssaOptCap) { |
123 | unwrap(P: Options)->PTO.LicmMssaOptCap = LicmMssaOptCap; |
124 | } |
125 | |
126 | void LLVMPassBuilderOptionsSetLicmMssaNoAccForPromotionCap( |
127 | LLVMPassBuilderOptionsRef Options, unsigned LicmMssaNoAccForPromotionCap) { |
128 | unwrap(P: Options)->PTO.LicmMssaNoAccForPromotionCap = |
129 | LicmMssaNoAccForPromotionCap; |
130 | } |
131 | |
132 | void LLVMPassBuilderOptionsSetCallGraphProfile( |
133 | LLVMPassBuilderOptionsRef Options, LLVMBool CallGraphProfile) { |
134 | unwrap(P: Options)->PTO.CallGraphProfile = CallGraphProfile; |
135 | } |
136 | |
137 | void LLVMPassBuilderOptionsSetMergeFunctions(LLVMPassBuilderOptionsRef Options, |
138 | LLVMBool MergeFunctions) { |
139 | unwrap(P: Options)->PTO.MergeFunctions = MergeFunctions; |
140 | } |
141 | |
142 | void LLVMPassBuilderOptionsSetInlinerThreshold( |
143 | LLVMPassBuilderOptionsRef Options, int Threshold) { |
144 | unwrap(P: Options)->PTO.InlinerThreshold = Threshold; |
145 | } |
146 | |
147 | void LLVMDisposePassBuilderOptions(LLVMPassBuilderOptionsRef Options) { |
148 | delete unwrap(P: Options); |
149 | } |
150 | |