@@ -23,6 +23,21 @@ using LlvmOptLevel = llvm::PassBuilder::OptimizationLevel;
2323
2424enum 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+
2641namespace {
2742auto 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
5488extern " C" {
@@ -109,6 +143,7 @@ auto passBuilderAddFullLinkTimeOptimizationEarlyEPCallback(
109143}
110144#endif
111145
146+ #ifndef LLVM_HAS_THIN_OR_FULL_LTO_PHASE
112147auto 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
133182auto 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
155218auto 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)
0 commit comments