4 fn bool_env_var(key: &str) -> bool {
5 env::var(key).as_deref() == Ok("1")
8 /// The mode to use for compilation.
9 #[derive(Copy, Clone, Debug)]
10 pub enum CodegenMode {
11 /// AOT compile the crate. This is the default.
13 /// JIT compile and execute the crate.
15 /// JIT compile and execute the crate, but only compile functions the first time they are used.
19 impl FromStr for CodegenMode {
22 fn from_str(s: &str) -> Result<Self, Self::Err> {
24 "aot" => Ok(CodegenMode::Aot),
25 "jit" => Ok(CodegenMode::Jit),
26 "jit-lazy" => Ok(CodegenMode::JitLazy),
27 _ => Err(format!("Unknown codegen mode `{}`", s)),
32 /// Configuration of cg_clif as passed in through `-Cllvm-args` and various env vars.
33 #[derive(Clone, Debug)]
34 pub struct BackendConfig {
35 /// Should the crate be AOT compiled or JIT executed.
37 /// Defaults to AOT compilation. Can be set using `-Cllvm-args=mode=...`.
38 pub codegen_mode: CodegenMode,
40 /// When JIT mode is enable pass these arguments to the program.
42 /// Defaults to the value of `CG_CLIF_JIT_ARGS`.
43 pub jit_args: Vec<String>,
45 /// Display the time it took to perform codegen for a crate.
47 /// Defaults to true when the `CG_CLIF_DISPLAY_CG_TIME` env var is set to 1 or false otherwise.
48 /// Can be set using `-Cllvm-args=display_cg_time=...`.
49 pub display_cg_time: bool,
51 /// Enable the Cranelift ir verifier for all compilation passes. If not set it will only run
52 /// once before passing the clif ir to Cranelift for compilation.
54 /// Defaults to true when the `CG_CLIF_ENABLE_VERIFIER` env var is set to 1 or when cg_clif is
55 /// compiled with debug assertions enabled or false otherwise. Can be set using
56 /// `-Cllvm-args=enable_verifier=...`.
57 pub enable_verifier: bool,
59 /// Don't cache object files in the incremental cache. Useful during development of cg_clif
60 /// to make it possible to use incremental mode for all analyses performed by rustc without
61 /// caching object files when their content should have been changed by a change to cg_clif.
63 /// Defaults to true when the `CG_CLIF_DISABLE_INCR_CACHE` env var is set to 1 or false
64 /// otherwise. Can be set using `-Cllvm-args=disable_incr_cache=...`.
65 pub disable_incr_cache: bool,
68 impl Default for BackendConfig {
69 fn default() -> Self {
71 codegen_mode: CodegenMode::Aot,
73 let args = std::env::var("CG_CLIF_JIT_ARGS").unwrap_or_else(|_| String::new());
74 args.split(' ').map(|arg| arg.to_string()).collect()
76 display_cg_time: bool_env_var("CG_CLIF_DISPLAY_CG_TIME"),
77 enable_verifier: cfg!(debug_assertions) || bool_env_var("CG_CLIF_ENABLE_VERIFIER"),
78 disable_incr_cache: bool_env_var("CG_CLIF_DISABLE_INCR_CACHE"),
84 /// Parse the configuration passed in using `-Cllvm-args`.
85 pub fn from_opts(opts: &[String]) -> Result<Self, String> {
86 fn parse_bool(name: &str, value: &str) -> Result<bool, String> {
87 value.parse().map_err(|_| format!("failed to parse value `{}` for {}", value, name))
90 let mut config = BackendConfig::default();
92 if let Some((name, value)) = opt.split_once('=') {
94 "mode" => config.codegen_mode = value.parse()?,
95 "display_cg_time" => config.display_cg_time = parse_bool(name, value)?,
96 "enable_verifier" => config.enable_verifier = parse_bool(name, value)?,
97 "disable_incr_cache" => config.disable_incr_cache = parse_bool(name, value)?,
98 _ => return Err(format!("Unknown option `{}`", name)),
101 return Err(format!("Invalid option `{}`", opt));