5
5
6
6
#include " LLVMWrapper.h"
7
7
8
+ #include " llvm/Analysis/AliasAnalysis.h"
8
9
#include " llvm/Analysis/TargetLibraryInfo.h"
9
10
#include " llvm/Analysis/TargetTransformInfo.h"
10
11
#include " llvm/CodeGen/TargetSubtargetInfo.h"
@@ -683,6 +684,25 @@ void LLVMSelfProfileInitializeCallbacks(
683
684
PassInstrumentationCallbacks& PIC, void * LlvmSelfProfiler,
684
685
LLVMRustSelfProfileBeforePassCallback BeforePassCallback,
685
686
LLVMRustSelfProfileAfterPassCallback AfterPassCallback) {
687
+ #if LLVM_VERSION_GE(12, 0)
688
+ PIC.registerBeforeNonSkippedPassCallback ([LlvmSelfProfiler, BeforePassCallback](
689
+ StringRef Pass, llvm::Any Ir) {
690
+ std::string PassName = Pass.str ();
691
+ std::string IrName = LLVMRustwrappedIrGetName (Ir);
692
+ BeforePassCallback (LlvmSelfProfiler, PassName.c_str (), IrName.c_str ());
693
+ });
694
+
695
+ PIC.registerAfterPassCallback (
696
+ [LlvmSelfProfiler, AfterPassCallback](StringRef Pass, llvm::Any IR,
697
+ const PreservedAnalyses &Preserved) {
698
+ AfterPassCallback (LlvmSelfProfiler);
699
+ });
700
+
701
+ PIC.registerAfterPassInvalidatedCallback (
702
+ [LlvmSelfProfiler, AfterPassCallback](StringRef Pass, const PreservedAnalyses &Preserved) {
703
+ AfterPassCallback (LlvmSelfProfiler);
704
+ });
705
+ #else
686
706
PIC.registerBeforePassCallback ([LlvmSelfProfiler, BeforePassCallback](
687
707
StringRef Pass, llvm::Any Ir) {
688
708
std::string PassName = Pass.str ();
@@ -700,6 +720,7 @@ void LLVMSelfProfileInitializeCallbacks(
700
720
[LlvmSelfProfiler, AfterPassCallback](StringRef Pass) {
701
721
AfterPassCallback (LlvmSelfProfiler);
702
722
});
723
+ #endif
703
724
704
725
PIC.registerBeforeAnalysisCallback ([LlvmSelfProfiler, BeforePassCallback](
705
726
StringRef Pass, llvm::Any Ir) {
@@ -760,8 +781,15 @@ LLVMRustOptimizeWithNewPassManager(
760
781
PTO.LoopVectorization = LoopVectorize;
761
782
PTO.SLPVectorization = SLPVectorize;
762
783
784
+ // FIXME: We may want to expose this as an option.
785
+ bool DebugPassManager = false ;
786
+
763
787
PassInstrumentationCallbacks PIC;
788
+ #if LLVM_VERSION_GE(12, 0)
789
+ StandardInstrumentations SI (DebugPassManager);
790
+ #else
764
791
StandardInstrumentations SI;
792
+ #endif
765
793
SI.registerCallbacks (PIC);
766
794
767
795
if (LlvmSelfProfiler){
@@ -777,10 +805,12 @@ LLVMRustOptimizeWithNewPassManager(
777
805
PGOOpt = PGOOptions (PGOUsePath, " " , " " , PGOOptions::IRUse);
778
806
}
779
807
808
+ #if LLVM_VERSION_GE(12, 0)
809
+ PassBuilder PB (DebugPassManager, TM, PTO, PGOOpt, &PIC);
810
+ #else
780
811
PassBuilder PB (TM, PTO, PGOOpt, &PIC);
812
+ #endif
781
813
782
- // FIXME: We may want to expose this as an option.
783
- bool DebugPassManager = false ;
784
814
LoopAnalysisManager LAM (DebugPassManager);
785
815
FunctionAnalysisManager FAM (DebugPassManager);
786
816
CGSCCAnalysisManager CGAM (DebugPassManager);
@@ -802,7 +832,8 @@ LLVMRustOptimizeWithNewPassManager(
802
832
803
833
// We manually collect pipeline callbacks so we can apply them at O0, where the
804
834
// PassBuilder does not create a pipeline.
805
- std::vector<std::function<void (ModulePassManager &)>> PipelineStartEPCallbacks;
835
+ std::vector<std::function<void (ModulePassManager &, PassBuilder::OptimizationLevel)>>
836
+ PipelineStartEPCallbacks;
806
837
#if LLVM_VERSION_GE(11, 0)
807
838
std::vector<std::function<void (ModulePassManager &, PassBuilder::OptimizationLevel)>>
808
839
OptimizerLastEPCallbacks;
@@ -812,9 +843,11 @@ LLVMRustOptimizeWithNewPassManager(
812
843
#endif
813
844
814
845
if (VerifyIR) {
815
- PipelineStartEPCallbacks.push_back ([VerifyIR](ModulePassManager &MPM) {
846
+ PipelineStartEPCallbacks.push_back (
847
+ [VerifyIR](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
816
848
MPM.addPass (VerifierPass ());
817
- });
849
+ }
850
+ );
818
851
}
819
852
820
853
if (SanitizerOptions) {
@@ -832,9 +865,11 @@ LLVMRustOptimizeWithNewPassManager(
832
865
);
833
866
#else
834
867
#if LLVM_VERSION_GE(10, 0)
835
- PipelineStartEPCallbacks.push_back ([Options](ModulePassManager &MPM) {
836
- MPM.addPass (MemorySanitizerPass (Options));
837
- });
868
+ PipelineStartEPCallbacks.push_back (
869
+ [Options](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
870
+ MPM.addPass (MemorySanitizerPass (Options));
871
+ }
872
+ );
838
873
#endif
839
874
OptimizerLastEPCallbacks.push_back (
840
875
[Options](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
@@ -854,9 +889,11 @@ LLVMRustOptimizeWithNewPassManager(
854
889
);
855
890
#else
856
891
#if LLVM_VERSION_GE(10, 0)
857
- PipelineStartEPCallbacks.push_back ([](ModulePassManager &MPM) {
858
- MPM.addPass (ThreadSanitizerPass ());
859
- });
892
+ PipelineStartEPCallbacks.push_back (
893
+ [](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
894
+ MPM.addPass (ThreadSanitizerPass ());
895
+ }
896
+ );
860
897
#endif
861
898
OptimizerLastEPCallbacks.push_back (
862
899
[](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
@@ -879,9 +916,11 @@ LLVMRustOptimizeWithNewPassManager(
879
916
}
880
917
);
881
918
#else
882
- PipelineStartEPCallbacks.push_back ([&](ModulePassManager &MPM) {
883
- MPM.addPass (RequireAnalysisPass<ASanGlobalsMetadataAnalysis, Module>());
884
- });
919
+ PipelineStartEPCallbacks.push_back (
920
+ [&](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
921
+ MPM.addPass (RequireAnalysisPass<ASanGlobalsMetadataAnalysis, Module>());
922
+ }
923
+ );
885
924
OptimizerLastEPCallbacks.push_back (
886
925
[SanitizerOptions](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
887
926
FPM.addPass (AddressSanitizerPass (
@@ -890,7 +929,7 @@ LLVMRustOptimizeWithNewPassManager(
890
929
}
891
930
);
892
931
PipelineStartEPCallbacks.push_back (
893
- [SanitizerOptions](ModulePassManager &MPM) {
932
+ [SanitizerOptions](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level ) {
894
933
MPM.addPass (ModuleAddressSanitizerPass (
895
934
/* CompileKernel=*/ false , SanitizerOptions->SanitizeAddressRecover ));
896
935
}
@@ -907,7 +946,7 @@ LLVMRustOptimizeWithNewPassManager(
907
946
);
908
947
#else
909
948
PipelineStartEPCallbacks.push_back (
910
- [SanitizerOptions](ModulePassManager &MPM) {
949
+ [SanitizerOptions](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level ) {
911
950
MPM.addPass (HWAddressSanitizerPass (
912
951
/* CompileKernel=*/ false , SanitizerOptions->SanitizeHWAddressRecover ));
913
952
}
@@ -917,35 +956,53 @@ LLVMRustOptimizeWithNewPassManager(
917
956
}
918
957
919
958
ModulePassManager MPM (DebugPassManager);
959
+ bool NeedThinLTOBufferPasses = UseThinLTOBuffers;
920
960
if (!NoPrepopulatePasses) {
921
961
if (OptLevel == PassBuilder::OptimizationLevel::O0) {
962
+ #if LLVM_VERSION_GE(12, 0)
922
963
for (const auto &C : PipelineStartEPCallbacks)
923
- C (MPM);
964
+ PB.registerPipelineStartEPCallback (C);
965
+ for (const auto &C : OptimizerLastEPCallbacks)
966
+ PB.registerOptimizerLastEPCallback (C);
924
967
925
- #if LLVM_VERSION_GE(11, 0)
968
+ // Pass false as we manually schedule ThinLTOBufferPasses below.
969
+ MPM = PB.buildO0DefaultPipeline (OptLevel, /* PreLinkLTO */ false );
970
+ #else
971
+ for (const auto &C : PipelineStartEPCallbacks)
972
+ C (MPM, OptLevel);
973
+
974
+ # if LLVM_VERSION_GE(11, 0)
926
975
for (const auto &C : OptimizerLastEPCallbacks)
927
976
C (MPM, OptLevel);
928
- #else
977
+ # else
929
978
if (!OptimizerLastEPCallbacks.empty ()) {
930
979
FunctionPassManager FPM (DebugPassManager);
931
980
for (const auto &C : OptimizerLastEPCallbacks)
932
981
C (FPM, OptLevel);
933
982
MPM.addPass (createModuleToFunctionPassAdaptor (std::move (FPM)));
934
983
}
935
- #endif
984
+ # endif
936
985
937
986
MPM.addPass (AlwaysInlinerPass (EmitLifetimeMarkers));
938
987
939
- #if LLVM_VERSION_GE(10, 0)
988
+ # if LLVM_VERSION_GE(10, 0)
940
989
if (PGOOpt) {
941
990
PB.addPGOInstrPassesForO0 (
942
991
MPM, DebugPassManager, PGOOpt->Action == PGOOptions::IRInstr,
943
992
/* IsCS=*/ false , PGOOpt->ProfileFile , PGOOpt->ProfileRemappingFile );
944
993
}
994
+ # endif
945
995
#endif
946
996
} else {
997
+ #if LLVM_VERSION_GE(12, 0)
947
998
for (const auto &C : PipelineStartEPCallbacks)
948
999
PB.registerPipelineStartEPCallback (C);
1000
+ #else
1001
+ for (const auto &C : PipelineStartEPCallbacks)
1002
+ PB.registerPipelineStartEPCallback ([C, OptLevel](ModulePassManager &MPM) {
1003
+ C (MPM, OptLevel);
1004
+ });
1005
+ #endif
949
1006
if (OptStage != LLVMRustOptStage::PreLinkThinLTO) {
950
1007
for (const auto &C : OptimizerLastEPCallbacks)
951
1008
PB.registerOptimizerLastEPCallback (C);
@@ -956,7 +1013,12 @@ LLVMRustOptimizeWithNewPassManager(
956
1013
MPM = PB.buildPerModuleDefaultPipeline (OptLevel, DebugPassManager);
957
1014
break ;
958
1015
case LLVMRustOptStage::PreLinkThinLTO:
1016
+ #if LLVM_VERSION_GE(12, 0)
1017
+ MPM = PB.buildThinLTOPreLinkDefaultPipeline (OptLevel);
1018
+ NeedThinLTOBufferPasses = false ;
1019
+ #else
959
1020
MPM = PB.buildThinLTOPreLinkDefaultPipeline (OptLevel, DebugPassManager);
1021
+ #endif
960
1022
#if LLVM_VERSION_GE(11, 0)
961
1023
for (const auto &C : OptimizerLastEPCallbacks)
962
1024
C (MPM, OptLevel);
@@ -970,21 +1032,34 @@ LLVMRustOptimizeWithNewPassManager(
970
1032
#endif
971
1033
break ;
972
1034
case LLVMRustOptStage::PreLinkFatLTO:
1035
+ #if LLVM_VERSION_GE(12, 0)
1036
+ MPM = PB.buildLTOPreLinkDefaultPipeline (OptLevel);
1037
+ NeedThinLTOBufferPasses = false ;
1038
+ #else
973
1039
MPM = PB.buildLTOPreLinkDefaultPipeline (OptLevel, DebugPassManager);
1040
+ #endif
974
1041
break ;
975
1042
case LLVMRustOptStage::ThinLTO:
976
1043
// FIXME: Does it make sense to pass the ModuleSummaryIndex?
977
1044
// It only seems to be needed for C++ specific optimizations.
1045
+ #if LLVM_VERSION_GE(12, 0)
1046
+ MPM = PB.buildThinLTODefaultPipeline (OptLevel, nullptr );
1047
+ #else
978
1048
MPM = PB.buildThinLTODefaultPipeline (OptLevel, DebugPassManager, nullptr );
1049
+ #endif
979
1050
break ;
980
1051
case LLVMRustOptStage::FatLTO:
1052
+ #if LLVM_VERSION_GE(12, 0)
1053
+ MPM = PB.buildLTODefaultPipeline (OptLevel, nullptr );
1054
+ #else
981
1055
MPM = PB.buildLTODefaultPipeline (OptLevel, DebugPassManager, nullptr );
1056
+ #endif
982
1057
break ;
983
1058
}
984
1059
}
985
1060
}
986
1061
987
- if (UseThinLTOBuffers ) {
1062
+ if (NeedThinLTOBufferPasses ) {
988
1063
MPM.addPass (CanonicalizeAliasesPass ());
989
1064
MPM.addPass (NameAnonGlobalPass ());
990
1065
}
0 commit comments