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