From 426e55709cf6badbeb99cdae9587ab8ffb8a98ac Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Tue, 29 Sep 2020 18:41:59 +0200 Subject: [PATCH] Replace CG_CLIF_JIT with --jit --- Readme.md | 21 +++++++++++++++++++-- cargo.sh | 9 ++++----- docs/env_vars.md | 2 -- scripts/filter_profile.rs | 2 +- src/bin/cg_clif.rs | 23 ++++++++++++++++++++--- src/driver/jit.rs | 2 +- src/driver/mod.rs | 12 ++++++++---- src/lib.rs | 17 ++++++++++++++--- test.sh | 4 ++-- 9 files changed, 69 insertions(+), 23 deletions(-) diff --git a/Readme.md b/Readme.md index c4e55975541..41159b66af8 100644 --- a/Readme.md +++ b/Readme.md @@ -36,7 +36,24 @@ If you compiled cg_clif in debug mode (aka you didn't pass `--release` to `./tes > You should prefer using the Cargo method. ```bash -$ rustc +$(cat $cg_clif_dir/rust-toolchain) -Cpanic=abort -Zcodegen-backend=$cg_clif_dir/target/release/librustc_codegen_cranelift.so --sysroot $cg_clif_dir/build_sysroot/sysroot my_crate.rs +$ $cg_clif_dir/target/release/cg_clif my_crate.rs +``` + +### Jit mode + +In jit mode cg_clif will immediately execute your code without creating an executable file. +This requires all dependencies to be available as dynamic library. +The easiest way to achieve this is by creating a new dylib crate that has all your dependencies as dependencies of itself. +Rustc will then link all your rlib dependencies into the dylib. + +```bash +$ $cg_clif_dir/cargo.sh jit +``` + +or + +```bash +$ $cg_clif_dir/target/release/cg_clif --jit my_crate.rs ``` ### Shell @@ -45,7 +62,7 @@ These are a few functions that allow you to easily run rust code from the shell ```bash function jit_naked() { - echo "$@" | CG_CLIF_JIT=1 rustc -Zcodegen-backend=$cg_clif_dir/target/release/librustc_codegen_cranelift.so --sysroot $cg_clif_dir/build_sysroot/sysroot - -Cprefer-dynamic + echo "$@" | $cg_clif_dir/target/release/cg_clif - --jit } function jit() { diff --git a/cargo.sh b/cargo.sh index ba4b7d6c942..cebc3e67363 100755 --- a/cargo.sh +++ b/cargo.sh @@ -12,12 +12,11 @@ TOOLCHAIN=$(cat rust-toolchain) popd >/dev/null -if [[ $(rustc -V) != $(rustc +${TOOLCHAIN} -V) ]]; then - echo "rustc_codegen_cranelift is build for $(rustc +${TOOLCHAIN} -V) but the default rustc version is $(rustc -V)." - echo "Using $(rustc +${TOOLCHAIN} -V)." -fi - cmd=$1 shift +if [[ "$cmd" = "jit" ]]; then +cargo +${TOOLCHAIN} rustc $@ -- --jit +else cargo +${TOOLCHAIN} $cmd $@ +fi diff --git a/docs/env_vars.md b/docs/env_vars.md index 3707909a978..07b75622a58 100644 --- a/docs/env_vars.md +++ b/docs/env_vars.md @@ -1,8 +1,6 @@ # List of env vars recognized by cg_clif
-
CG_CLIF_JIT
-
Enable JIT mode to immediately run a program instead of writing an executable file.
CG_CLIF_JIT_ARGS
When JIT mode is enable pass these arguments to the program.
CG_CLIF_INCR_CACHE_DISABLED
diff --git a/scripts/filter_profile.rs b/scripts/filter_profile.rs index 75f2f61b21a..c70c3ec47f3 100755 --- a/scripts/filter_profile.rs +++ b/scripts/filter_profile.rs @@ -5,7 +5,7 @@ CHANNEL="release" pushd $(dirname "$0")/../ source scripts/config.sh popd -CG_CLIF_JIT=1 PROFILE=$1 OUTPUT=$2 exec rustc $RUSTFLAGS $0 --crate-type bin -Cprefer-dynamic +PROFILE=$1 OUTPUT=$2 exec $RUSTC $RUSTFLAGS --jit $0 #*/ //! This program filters away uninteresting samples and trims uninteresting frames for stackcollapse diff --git a/src/bin/cg_clif.rs b/src/bin/cg_clif.rs index 49279f8b921..8a39e9b0590 100644 --- a/src/bin/cg_clif.rs +++ b/src/bin/cg_clif.rs @@ -50,7 +50,9 @@ fn main() { let mut callbacks = TimePassesCallbacks::default(); rustc_driver::install_ice_hook(); let exit_code = rustc_driver::catch_with_exit_code(|| { - let args = std::env::args_os() + let mut use_jit = false; + + let mut args = std::env::args_os() .enumerate() .map(|(i, arg)| { arg.into_string().unwrap_or_else(|arg| { @@ -60,14 +62,29 @@ fn main() { ) }) }) + .filter(|arg| { + if arg == "--jit" { + use_jit = true; + false + } else { + true + } + }) .collect::>(); + if use_jit { + args.push("-Cprefer-dynamic".to_string()); + } rustc_driver::run_compiler( &args, &mut callbacks, None, None, - Some(Box::new(|_| { - rustc_codegen_cranelift::__rustc_codegen_backend() + Some(Box::new(move |_| { + Box::new(rustc_codegen_cranelift::CraneliftCodegenBackend { + config: rustc_codegen_cranelift::BackendConfig { + use_jit, + } + }) })), ) }); diff --git a/src/driver/jit.rs b/src/driver/jit.rs index 9f8426961ee..5a899afb97c 100644 --- a/src/driver/jit.rs +++ b/src/driver/jit.rs @@ -87,7 +87,7 @@ pub(super) fn run_jit(tcx: TyCtxt<'_>) -> ! { let finalized_main: *const u8 = jit_module.get_finalized_function(main_func_id); - println!("Rustc codegen cranelift will JIT run the executable, because the CG_CLIF_JIT env var is set"); + println!("Rustc codegen cranelift will JIT run the executable, because --jit was passed"); let f: extern "C" fn(c_int, *const *const c_char) -> c_int = unsafe { ::std::mem::transmute(finalized_main) }; diff --git a/src/driver/mod.rs b/src/driver/mod.rs index 0224f929ac7..881221c0105 100644 --- a/src/driver/mod.rs +++ b/src/driver/mod.rs @@ -16,15 +16,19 @@ pub(crate) fn codegen_crate( tcx: TyCtxt<'_>, metadata: EncodedMetadata, need_metadata_module: bool, + config: crate::BackendConfig, ) -> Box { tcx.sess.abort_if_errors(); - if std::env::var("CG_CLIF_JIT").is_ok() - && tcx + if config.use_jit { + let is_executable = tcx .sess .crate_types() - .contains(&rustc_session::config::CrateType::Executable) - { + .contains(&rustc_session::config::CrateType::Executable); + if !is_executable { + tcx.sess.fatal("can't jit non-executable crate"); + } + #[cfg(feature = "jit")] let _: ! = jit::run_jit(tcx); diff --git a/src/lib.rs b/src/lib.rs index 64f4e490aed..52845b11da0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -181,7 +181,14 @@ impl<'tcx, B: Backend + 'static> CodegenCx<'tcx, B> { } } -struct CraneliftCodegenBackend; +#[derive(Copy, Clone, Debug)] +pub struct BackendConfig { + pub use_jit: bool, +} + +pub struct CraneliftCodegenBackend { + pub config: BackendConfig, +} impl CodegenBackend for CraneliftCodegenBackend { fn init(&self, sess: &Session) { @@ -223,7 +230,7 @@ impl CodegenBackend for CraneliftCodegenBackend { metadata: EncodedMetadata, need_metadata_module: bool, ) -> Box { - let res = driver::codegen_crate(tcx, metadata, need_metadata_module); + let res = driver::codegen_crate(tcx, metadata, need_metadata_module, self.config); rustc_symbol_mangling::test::report_symbol_names(tcx); @@ -345,5 +352,9 @@ fn build_isa(sess: &Session, enable_pic: bool) -> Box Box { - Box::new(CraneliftCodegenBackend) + Box::new(CraneliftCodegenBackend { + config: BackendConfig { + use_jit: false, + } + }) } diff --git a/test.sh b/test.sh index 9b61a38ffe0..0d2b5c6a392 100755 --- a/test.sh +++ b/test.sh @@ -29,7 +29,7 @@ $RUSTC example/example.rs --crate-type lib --target $TARGET_TRIPLE if [[ "$JIT_SUPPORTED" = "1" ]]; then echo "[JIT] mini_core_hello_world" - CG_CLIF_JIT=1 CG_CLIF_JIT_ARGS="abc bcd" $RUSTC --crate-type bin -Cprefer-dynamic example/mini_core_hello_world.rs --cfg jit --target $HOST_TRIPLE + CG_CLIF_JIT_ARGS="abc bcd" $RUSTC --jit example/mini_core_hello_world.rs --cfg jit --target $HOST_TRIPLE else echo "[JIT] mini_core_hello_world (skipped)" fi @@ -52,7 +52,7 @@ $RUN_WRAPPER ./target/out/alloc_example if [[ "$JIT_SUPPORTED" = "1" ]]; then echo "[JIT] std_example" - CG_CLIF_JIT=1 $RUSTC --crate-type bin -Cprefer-dynamic example/std_example.rs --target $HOST_TRIPLE + $RUSTC --jit example/std_example.rs --target $HOST_TRIPLE else echo "[JIT] std_example (skipped)" fi