File tree 4 files changed +57
-4
lines changed
4 files changed +57
-4
lines changed Original file line number Diff line number Diff line change @@ -868,15 +868,23 @@ LLVMRustOptimizeWithNewPassManager(
868
868
} else {
869
869
for (const auto &C : PipelineStartEPCallbacks)
870
870
PB.registerPipelineStartEPCallback (C);
871
- for (const auto &C : OptimizerLastEPCallbacks)
872
- PB.registerOptimizerLastEPCallback (C);
871
+ if (OptStage != LLVMRustOptStage::PreLinkThinLTO) {
872
+ for (const auto &C : OptimizerLastEPCallbacks)
873
+ PB.registerOptimizerLastEPCallback (C);
874
+ }
873
875
874
876
switch (OptStage) {
875
877
case LLVMRustOptStage::PreLinkNoLTO:
876
878
MPM = PB.buildPerModuleDefaultPipeline (OptLevel, DebugPassManager);
877
879
break ;
878
880
case LLVMRustOptStage::PreLinkThinLTO:
879
881
MPM = PB.buildThinLTOPreLinkDefaultPipeline (OptLevel, DebugPassManager);
882
+ if (!OptimizerLastEPCallbacks.empty ()) {
883
+ FunctionPassManager FPM (DebugPassManager);
884
+ for (const auto &C : OptimizerLastEPCallbacks)
885
+ C (FPM, OptLevel);
886
+ MPM.addPass (createModuleToFunctionPassAdaptor (std::move (FPM)));
887
+ }
880
888
break ;
881
889
case LLVMRustOptStage::PreLinkFatLTO:
882
890
MPM = PB.buildLTOPreLinkDefaultPipeline (OptLevel, DebugPassManager);
Original file line number Diff line number Diff line change 14
14
//[MSAN-RECOVER-LTO] compile-flags: -Zsanitizer=memory -Zsanitizer-recover=memory -C lto=fat
15
15
//
16
16
// MSAN-NOT: @__msan_keep_going
17
- // MSAN-RECOVER: @__msan_keep_going = weak_odr {{.*}} constant i32 1
18
- // MSAN-RECOVER-LTO: @__msan_keep_going = weak_odr {{.*}} constant i32 1
17
+ // MSAN-RECOVER: @__msan_keep_going = weak_odr {{.*}}constant i32 1
18
+ // MSAN-RECOVER-LTO: @__msan_keep_going = weak_odr {{.*}}constant i32 1
19
19
20
20
// ASAN-LABEL: define i32 @penguin(
21
21
// ASAN: call void @__asan_report_load4(i64 %0)
Original file line number Diff line number Diff line change
1
+ // Regression test for sanitizer function instrumentation passes not
2
+ // being run when compiling with new LLVM pass manager and ThinLTO.
3
+ // Note: The issue occured only on non-zero opt-level.
4
+ //
5
+ // min-llvm-version 9.0
6
+ // needs-sanitizer-support
7
+ // only-x86_64
8
+ //
9
+ // no-prefer-dynamic
10
+ // revisions: opt0 opt1
11
+ // compile-flags: -Znew-llvm-pass-manager=yes -Zsanitizer=address -Clto=thin
12
+ //[opt0]compile-flags: -Copt-level=0
13
+ //[opt1]compile-flags: -Copt-level=1
14
+ // run-fail
15
+ // error-pattern: ERROR: AddressSanitizer: stack-use-after-scope
16
+
17
+ static mut P : * mut usize = std:: ptr:: null_mut ( ) ;
18
+
19
+ fn main ( ) {
20
+ unsafe {
21
+ {
22
+ let mut x = 0 ;
23
+ P = & mut x;
24
+ }
25
+ std:: ptr:: write_volatile ( P , 123 ) ;
26
+ }
27
+ }
Original file line number Diff line number Diff line change @@ -109,6 +109,24 @@ fn no_system_llvm() {
109
109
assert ! ( parse_rs( & config, "// no-system-llvm" ) . ignore) ;
110
110
}
111
111
112
+ #[ test]
113
+ fn llvm_version ( ) {
114
+ let mut config = config ( ) ;
115
+
116
+ config. llvm_version = Some ( "8.1.2-rust" . to_owned ( ) ) ;
117
+ assert ! ( parse_rs( & config, "// min-llvm-version 9.0" ) . ignore) ;
118
+
119
+ config. llvm_version = Some ( "9.0.1-rust-1.43.0-dev" . to_owned ( ) ) ;
120
+ assert ! ( parse_rs( & config, "// min-llvm-version 9.2" ) . ignore) ;
121
+
122
+ config. llvm_version = Some ( "9.3.1-rust-1.43.0-dev" . to_owned ( ) ) ;
123
+ assert ! ( !parse_rs( & config, "// min-llvm-version 9.2" ) . ignore) ;
124
+
125
+ // FIXME.
126
+ // config.llvm_version = Some("10.0.0-rust".to_owned());
127
+ // assert!(!parse_rs(&config, "// min-llvm-version 9.0").ignore);
128
+ }
129
+
112
130
#[ test]
113
131
fn ignore_target ( ) {
114
132
let mut config = config ( ) ;
You can’t perform that action at this time.
0 commit comments