Make llvm pass build feature dependent (#2357)

* push

* everybody is default

* fix

* fix
This commit is contained in:
Dongjia "toka" Zhang 2024-07-02 17:37:07 +02:00 committed by GitHub
parent 7c95afc42f
commit 762b6e008e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 124 additions and 47 deletions

View File

@ -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 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[features] [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] [build-dependencies]
cc = { version = "1.0", features = ["parallel"] } cc = { version = "1.0", features = ["parallel"] }

View File

@ -144,6 +144,7 @@ fn find_llvm_version() -> Option<i32> {
} }
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
#[allow(unused)]
fn build_pass( fn build_pass(
bindir_path: &Path, bindir_path: &Path,
out_dir: &Path, out_dir: &Path,
@ -199,24 +200,26 @@ fn build_pass(
}; };
match command_result { match command_result {
Some(res) => match res { Some(res) => {
Ok(s) => { match res {
if !s.success() { 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 { 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 { } 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 => { None => {
println!("cargo:warning=Skipping compiler pass src/{src_file} - Only supported on Windows or *nix."); 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<usize> = None;
ldflags.push(&sdk_path); ldflags.push(&sdk_path);
}; };
#[cfg(feature = "ddg-instr")]
build_pass( build_pass(
bindir_path, bindir_path,
out_dir, out_dir,
@ -424,42 +428,104 @@ pub const LIBAFL_CC_LLVM_VERSION: Option<usize> = None;
src_dir, src_dir,
"ddg-instr.cc", "ddg-instr.cc",
Some(&vec!["ddg-utils.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, false,
); );
for pass in [ #[cfg(feature = "profiling")]
"function-logging.cc", build_pass(
"cmplog-routines-pass.cc", bindir_path,
"autotokens-pass.cc", out_dir,
"coverage-accounting-pass.cc", &cxxflags,
"cmplog-instructions-pass.cc", &ldflags,
"ctx-pass.cc", src_dir,
] { "profiling-pass.cc",
build_pass( None,
bindir_path, false,
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,
);
}
cc::Build::new() cc::Build::new()
.file(src_dir.join("no-link-rt.c")) .file(src_dir.join("no-link-rt.c"))