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