Skip to content

Commit 30dd9dc

Browse files
Ylarodjamesmth
authored andcommitted
fix: update api to support ThinOrFullLTOPhase (#31)
1 parent 23a495d commit 30dd9dc

File tree

6 files changed

+330
-86
lines changed

6 files changed

+330
-86
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
**/target
33
/.cache
44
**/Cargo.lock
5+
/.idea

llvm-plugin/cpp/ffi.cc

Lines changed: 91 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,21 @@ using LlvmOptLevel = llvm::PassBuilder::OptimizationLevel;
2323

2424
enum class OptimizationLevel { kO0, kO1, kO2, kO3, kOs, kOz };
2525

26+
#if defined(LLVM_VERSION_MAJOR) && \
27+
(LLVM_VERSION_MAJOR > 20 || \
28+
(LLVM_VERSION_MAJOR == 20 && defined(LLVM_VERSION_MINOR) && \
29+
LLVM_VERSION_MINOR >= 1))
30+
#define LLVM_HAS_THIN_OR_FULL_LTO_PHASE
31+
#endif
32+
33+
enum class ThinOrFullLTOPhaseFFI {
34+
kNone,
35+
kThinLTOPreLink,
36+
kThinLTOPostLink,
37+
kFullLTOPreLink,
38+
kFullLTOPostLink,
39+
};
40+
2641
namespace {
2742
auto getFFIOptimizationLevel(LlvmOptLevel Opt) -> OptimizationLevel {
2843
// Starting from LLVM-11, llvm::OptimizationLevel::Ox is no longer
@@ -49,6 +64,25 @@ auto getFFIOptimizationLevel(LlvmOptLevel Opt) -> OptimizationLevel {
4964
}
5065
return OptimizationLevel::kOz;
5166
}
67+
68+
#ifdef LLVM_HAS_THIN_OR_FULL_LTO_PHASE
69+
inline auto getFFIThinOrFullLTOPhase(llvm::ThinOrFullLTOPhase Phase)
70+
-> ThinOrFullLTOPhaseFFI {
71+
switch (Phase) {
72+
case llvm::ThinOrFullLTOPhase::None:
73+
return ThinOrFullLTOPhaseFFI::kNone;
74+
case llvm::ThinOrFullLTOPhase::ThinLTOPreLink:
75+
return ThinOrFullLTOPhaseFFI::kThinLTOPreLink;
76+
case llvm::ThinOrFullLTOPhase::ThinLTOPostLink:
77+
return ThinOrFullLTOPhaseFFI::kThinLTOPostLink;
78+
case llvm::ThinOrFullLTOPhase::FullLTOPreLink:
79+
return ThinOrFullLTOPhaseFFI::kFullLTOPreLink;
80+
case llvm::ThinOrFullLTOPhase::FullLTOPostLink:
81+
return ThinOrFullLTOPhaseFFI::kFullLTOPostLink;
82+
}
83+
return ThinOrFullLTOPhaseFFI::kNone;
84+
}
85+
#endif
5286
} // namespace
5387

5488
extern "C" {
@@ -109,6 +143,7 @@ auto passBuilderAddFullLinkTimeOptimizationEarlyEPCallback(
109143
}
110144
#endif
111145

146+
#ifndef LLVM_HAS_THIN_OR_FULL_LTO_PHASE
112147
auto passBuilderAddOptimizerLastEPCallback(
113148
llvm::PassBuilder &Builder, const void *DataPtr,
114149
void (*Deleter)(const void *),
@@ -118,18 +153,32 @@ auto passBuilderAddOptimizerLastEPCallback(
118153

119154
Builder.registerOptimizerLastEPCallback(
120155
[Data = std::move(Data), Callback](llvm::ModulePassManager &PassManager,
121-
#if (LLVM_VERSION_MAJOR >= 20)
122-
LlvmOptLevel Opt,
123-
llvm::ThinOrFullLTOPhase) {
124-
#else
125156
LlvmOptLevel Opt) {
126-
#endif
127157
const auto OptFFI = getFFIOptimizationLevel(Opt);
128158
Callback(Data.get(), PassManager, OptFFI);
129159
});
130160
}
161+
#else
162+
auto passBuilderAddOptimizerLastEPCallback(
163+
llvm::PassBuilder &Builder, const void *DataPtr,
164+
void (*Deleter)(const void *),
165+
void (*Callback)(const void *, llvm::ModulePassManager &, OptimizationLevel,
166+
ThinOrFullLTOPhaseFFI)) -> void {
167+
const auto Data = std::shared_ptr<const void>(DataPtr, Deleter);
168+
169+
Builder.registerOptimizerLastEPCallback(
170+
[Data = std::move(Data), Callback](llvm::ModulePassManager &PassManager,
171+
LlvmOptLevel Opt,
172+
llvm::ThinOrFullLTOPhase Phase) {
173+
const auto OptFFI = getFFIOptimizationLevel(Opt);
174+
const auto PhaseFFI = getFFIThinOrFullLTOPhase(Phase);
175+
Callback(Data.get(), PassManager, OptFFI, PhaseFFI);
176+
});
177+
}
178+
#endif
131179

132180
#if defined(LLVM_VERSION_MAJOR) && (LLVM_VERSION_MAJOR >= 15)
181+
#ifndef LLVM_HAS_THIN_OR_FULL_LTO_PHASE
133182
auto passBuilderAddOptimizerEarlyEPCallback(
134183
llvm::PassBuilder &Builder, const void *DataPtr,
135184
void (*Deleter)(const void *),
@@ -139,19 +188,33 @@ auto passBuilderAddOptimizerEarlyEPCallback(
139188

140189
Builder.registerOptimizerEarlyEPCallback(
141190
[Data = std::move(Data), Callback](llvm::ModulePassManager &PassManager,
142-
#if (LLVM_VERSION_MAJOR >= 20)
143-
LlvmOptLevel Opt,
144-
llvm::ThinOrFullLTOPhase) {
145-
#else
146191
LlvmOptLevel Opt) {
147-
#endif
148192
const auto OptFFI = getFFIOptimizationLevel(Opt);
149193
Callback(Data.get(), PassManager, OptFFI);
150194
});
151195
}
196+
#else
197+
auto passBuilderAddOptimizerEarlyEPCallback(
198+
llvm::PassBuilder &Builder, const void *DataPtr,
199+
void (*Deleter)(const void *),
200+
void (*Callback)(const void *, llvm::ModulePassManager &, OptimizationLevel,
201+
ThinOrFullLTOPhaseFFI)) -> void {
202+
const auto Data = std::shared_ptr<const void>(DataPtr, Deleter);
203+
204+
Builder.registerOptimizerEarlyEPCallback(
205+
[Data = std::move(Data), Callback](llvm::ModulePassManager &PassManager,
206+
LlvmOptLevel Opt,
207+
llvm::ThinOrFullLTOPhase Phase) {
208+
const auto OptFFI = getFFIOptimizationLevel(Opt);
209+
const auto PhaseFFI = getFFIThinOrFullLTOPhase(Phase);
210+
Callback(Data.get(), PassManager, OptFFI, PhaseFFI);
211+
});
212+
}
213+
#endif
152214
#endif
153215

154216
#if defined(LLVM_VERSION_MAJOR) && (LLVM_VERSION_MAJOR >= 12)
217+
#ifndef LLVM_HAS_THIN_OR_FULL_LTO_PHASE
155218
auto passBuilderAddPipelineEarlySimplificationEPCallback(
156219
llvm::PassBuilder &Builder, const void *DataPtr,
157220
void (*Deleter)(const void *),
@@ -161,16 +224,29 @@ auto passBuilderAddPipelineEarlySimplificationEPCallback(
161224

162225
Builder.registerPipelineEarlySimplificationEPCallback(
163226
[Data = std::move(Data), Callback](llvm::ModulePassManager &PassManager,
164-
#if (LLVM_VERSION_MAJOR >= 20)
165-
LlvmOptLevel Opt,
166-
llvm::ThinOrFullLTOPhase) {
167-
#else
168227
LlvmOptLevel Opt) {
169-
#endif
170228
const auto OptFFI = getFFIOptimizationLevel(Opt);
171229
Callback(Data.get(), PassManager, OptFFI);
172230
});
173231
}
232+
#else
233+
auto passBuilderAddPipelineEarlySimplificationEPCallback(
234+
llvm::PassBuilder &Builder, const void *DataPtr,
235+
void (*Deleter)(const void *),
236+
void (*Callback)(const void *, llvm::ModulePassManager &, OptimizationLevel,
237+
ThinOrFullLTOPhaseFFI)) -> void {
238+
const auto Data = std::shared_ptr<const void>(DataPtr, Deleter);
239+
240+
Builder.registerPipelineEarlySimplificationEPCallback(
241+
[Data = std::move(Data), Callback](llvm::ModulePassManager &PassManager,
242+
LlvmOptLevel Opt,
243+
llvm::ThinOrFullLTOPhase Phase) {
244+
const auto OptFFI = getFFIOptimizationLevel(Opt);
245+
const auto PhaseFFI = getFFIThinOrFullLTOPhase(Phase);
246+
Callback(Data.get(), PassManager, OptFFI, PhaseFFI);
247+
});
248+
}
249+
#endif
174250
#endif
175251

176252
#if defined(LLVM_VERSION_MAJOR) && (LLVM_VERSION_MAJOR >= 12)

llvm-plugin/src/ffi.rs

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,46 @@ extern "C" {
4646
builder: *mut c_void,
4747
cb: *const c_void,
4848
cb_deleter: extern "C" fn(*const c_void),
49-
cb_sys: extern "C" fn(*const c_void, *mut c_void, crate::OptimizationLevel),
49+
#[cfg(not(feature = "llvm20-1"))] cb_sys: extern "C" fn(
50+
*const c_void,
51+
*mut c_void,
52+
crate::OptimizationLevel,
53+
),
54+
#[cfg(feature = "llvm20-1")] cb_sys: extern "C" fn(
55+
*const c_void,
56+
*mut c_void,
57+
crate::OptimizationLevel,
58+
crate::ThinOrFullLTOPhase,
59+
),
5060
);
5161

62+
#[cfg(any(
63+
feature = "llvm11-0",
64+
feature = "llvm12-0",
65+
feature = "llvm13-0",
66+
feature = "llvm14-0",
67+
feature = "llvm15-0",
68+
feature = "llvm16-0",
69+
feature = "llvm17-0",
70+
feature = "llvm18-1",
71+
feature = "llvm19-1",
72+
feature = "llvm20-1",
73+
))]
5274
pub(crate) fn passBuilderAddOptimizerLastEPCallback(
5375
builder: *mut c_void,
5476
cb: *const c_void,
5577
cb_deleter: extern "C" fn(*const c_void),
56-
cb_sys: extern "C" fn(*const c_void, *mut c_void, crate::OptimizationLevel),
78+
#[cfg(not(feature = "llvm20-1"))] cb_sys: extern "C" fn(
79+
*const c_void,
80+
*mut c_void,
81+
crate::OptimizationLevel,
82+
),
83+
#[cfg(feature = "llvm20-1")] cb_sys: extern "C" fn(
84+
*const c_void,
85+
*mut c_void,
86+
crate::OptimizationLevel,
87+
crate::ThinOrFullLTOPhase,
88+
),
5789
);
5890

5991
#[cfg(any(
@@ -71,7 +103,17 @@ extern "C" {
71103
builder: *mut c_void,
72104
cb: *const c_void,
73105
cb_deleter: extern "C" fn(*const c_void),
74-
cb_sys: extern "C" fn(*const c_void, *mut c_void, crate::OptimizationLevel),
106+
#[cfg(not(feature = "llvm20-1"))] cb_sys: extern "C" fn(
107+
*const c_void,
108+
*mut c_void,
109+
crate::OptimizationLevel,
110+
),
111+
#[cfg(feature = "llvm20-1")] cb_sys: extern "C" fn(
112+
*const c_void,
113+
*mut c_void,
114+
crate::OptimizationLevel,
115+
crate::ThinOrFullLTOPhase,
116+
),
75117
);
76118

77119
#[cfg(any(

0 commit comments

Comments
 (0)