diff --git a/libafl_cc/Cargo.toml b/libafl_cc/Cargo.toml index 1db1078766..47cd4c496e 100644 --- a/libafl_cc/Cargo.toml +++ b/libafl_cc/Cargo.toml @@ -14,7 +14,18 @@ categories = ["development-tools::testing", "emulators", "embedded", "os", "no-s # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -default = [] +default = ["ddg-instr", "function-logging", "cmplog-routines", "autotokens", "coverage-accounting", "cmplog-instructions", "ctx", "dump-cfg", "profiling"] + +# llvm passes +ddg-instr = [] +function-logging = [] +cmplog-routines = [] +autotokens = [] +coverage-accounting = [] +cmplog-instructions = [] +ctx = [] +dump-cfg = [] +profiling = [] [build-dependencies] cc = { version = "1.0", features = ["parallel"] } diff --git a/libafl_cc/build.rs b/libafl_cc/build.rs index 5c70204bc1..9b7a3972b5 100644 --- a/libafl_cc/build.rs +++ b/libafl_cc/build.rs @@ -144,6 +144,7 @@ fn find_llvm_version() -> Option { } #[allow(clippy::too_many_arguments)] +#[allow(unused)] fn build_pass( bindir_path: &Path, out_dir: &Path, @@ -199,24 +200,26 @@ fn build_pass( }; match command_result { - Some(res) => match res { - Ok(s) => { - if !s.success() { + Some(res) => { + match res { + Ok(s) => { + if !s.success() { + if required { + panic!("Failed to compile required compiler pass src/{src_file} - Exit status: {s}"); + } else { + println!("cargo:warning=Skipping non-required compiler pass src/{src_file} - Reason: Exit status {s}"); + } + } + } + Err(err) => { if required { - panic!("Failed to compile required compiler pass src/{src_file} - Exit status: {s}"); + panic!("Failed to compile required compiler pass src/{src_file} - Error: {err}"); } else { - println!("cargo:warning=Skipping non-required compiler pass src/{src_file} - Reason: Exit status {s}"); + println!("cargo:warning=Skipping non-required compiler pass src/{src_file} - Error: {err}"); } } } - Err(err) => { - if required { - panic!("Failed to compile required compiler pass src/{src_file} - {err}"); - } else { - println!("cargo:warning=Skipping non-required compiler pass src/{src_file} - Reason: {err}"); - } - } - }, + } None => { println!("cargo:warning=Skipping compiler pass src/{src_file} - Only supported on Windows or *nix."); } @@ -416,6 +419,7 @@ pub const LIBAFL_CC_LLVM_VERSION: Option = None; ldflags.push(&sdk_path); }; + #[cfg(feature = "ddg-instr")] build_pass( bindir_path, out_dir, @@ -424,42 +428,104 @@ pub const LIBAFL_CC_LLVM_VERSION: Option = None; src_dir, "ddg-instr.cc", Some(&vec!["ddg-utils.cc"]), + true, + ); + + #[cfg(feature = "function-logging")] + build_pass( + bindir_path, + out_dir, + &cxxflags, + &ldflags, + src_dir, + "function-logging.cc", + None, + true, + ); + + #[cfg(feature = "cmplog-routines")] + build_pass( + bindir_path, + out_dir, + &cxxflags, + &ldflags, + src_dir, + "cmplog-routines-pass.cc", + None, + true, + ); + + #[cfg(feature = "autotokens")] + build_pass( + bindir_path, + out_dir, + &cxxflags, + &ldflags, + src_dir, + "autotokens-pass.cc", + None, + true, + ); + + #[cfg(feature = "coverage-accounting")] + build_pass( + bindir_path, + out_dir, + &cxxflags, + &ldflags, + src_dir, + "coverage-accounting-pass.cc", + None, + true, + ); + + #[cfg(feature = "cmplog-instructions")] + build_pass( + bindir_path, + out_dir, + &cxxflags, + &ldflags, + src_dir, + "cmplog-instructions-pass.cc", + None, + true, + ); + + #[cfg(feature = "ctx")] + build_pass( + bindir_path, + out_dir, + &cxxflags, + &ldflags, + src_dir, + "ctx-pass.cc", + None, + true, + ); + + #[cfg(feature = "dump-cfg")] + build_pass( + bindir_path, + out_dir, + &cxxflags, + &ldflags, + src_dir, + "dump-cfg-pass.cc", + None, false, ); - for pass in [ - "function-logging.cc", - "cmplog-routines-pass.cc", - "autotokens-pass.cc", - "coverage-accounting-pass.cc", - "cmplog-instructions-pass.cc", - "ctx-pass.cc", - ] { - build_pass( - bindir_path, - out_dir, - &cxxflags, - &ldflags, - src_dir, - pass, - None, - true, - ); - } - - // Optional pass - for pass in ["dump-cfg-pass.cc", "profiling.cc"] { - build_pass( - bindir_path, - out_dir, - &cxxflags, - &ldflags, - src_dir, - pass, - None, - false, - ); - } + #[cfg(feature = "profiling")] + build_pass( + bindir_path, + out_dir, + &cxxflags, + &ldflags, + src_dir, + "profiling-pass.cc", + None, + false, + ); cc::Build::new() .file(src_dir.join("no-link-rt.c")) diff --git a/libafl_cc/src/profiling.cc b/libafl_cc/src/profiling-pass.cc similarity index 100% rename from libafl_cc/src/profiling.cc rename to libafl_cc/src/profiling-pass.cc