@@ -295,16 +295,33 @@ where
295295
296296 // add some flags to sanitizers to make them work with Rust code
297297 let asan_options = env:: var ( "ASAN_OPTIONS" ) . unwrap_or_default ( ) ;
298- let asan_options = format ! ( "detect_odr_violation=0:abort_on_error=1:symbolize=0:{}" , asan_options) ;
298+ let asan_options = format ! (
299+ "detect_odr_violation=0:abort_on_error=1:symbolize=0:{}" ,
300+ asan_options
301+ ) ;
299302
300303 let tsan_options = env:: var ( "TSAN_OPTIONS" ) . unwrap_or_default ( ) ;
301304 let tsan_options = format ! ( "report_signal_unsafe=0:{}" , tsan_options) ;
302305
306+ let version_meta = rustc_version:: version_meta ( ) . unwrap ( ) ;
307+ let passes = if version_meta. semver . minor >= 57
308+ && version_meta. llvm_version . map_or ( true , |v| v. major >= 13 )
309+ {
310+ // New LLVM pass manager is enabled when Rust 1.57+ and LLVM 13+
311+ // https://github.com/rust-lang/rust/pull/88243
312+ "sancov-module"
313+ } else {
314+ "sancov"
315+ } ;
316+
317+ // `-C codegen-units=1` is needed to work around link errors
318+ // https://github.com/rust-fuzz/afl.rs/pull/193#issuecomment-933550430
303319 let mut rustflags = format ! (
304320 "--cfg fuzzing \
305321 -C debug-assertions \
306322 -C overflow_checks \
307- -C passes=sancov \
323+ -C passes={} \
324+ -C codegen-units=1 \
308325 -C llvm-args=-sanitizer-coverage-level=3 \
309326 -C llvm-args=-sanitizer-coverage-trace-pc-guard \
310327 -C llvm-args=-sanitizer-coverage-prune-blocks=0 \
@@ -313,6 +330,7 @@ where
313330 -C debuginfo=0 \
314331 -l afl-llvm-rt \
315332 -L {} ",
333+ passes,
316334 common:: afl_llvm_rt_dir( ) . display( )
317335 ) ;
318336
@@ -323,14 +341,16 @@ where
323341 "--cfg fuzzing \
324342 -C debug-assertions \
325343 -C overflow_checks \
326- -C passes=sancov \
344+ -C passes={} \
345+ -C codegen-units=1 \
327346 -C llvm-args=-sanitizer-coverage-level=3 \
328347 -C llvm-args=-sanitizer-coverage-trace-pc-guard \
329348 -C llvm-args=-sanitizer-coverage-prune-blocks=0 \
330349 -C opt-level=3 \
331350 -C target-cpu=native \
332351 -C debuginfo=0 \
333352 -L {} ",
353+ passes,
334354 common:: afl_llvm_rt_dir( ) . display( )
335355 ) ;
336356
0 commit comments