X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=Readme.md;h=22d9e00923f006f1711a5d6791fd8ac78ad9d827;hb=3ea8915d4a247b5b3c4cfb3424c230ccd2645b17;hp=230a08191ff5bfdf032f14f6a021adb569d1a233;hpb=52a43e963961d1e78cc8d272044e1d23cada19f0;p=rust.git diff --git a/Readme.md b/Readme.md index 230a08191ff..22d9e00923f 100644 --- a/Readme.md +++ b/Readme.md @@ -1,48 +1,111 @@ -# Work in progress cranelift codegen backend for rust +# WIP Cranelift codegen backend for rust -> ⚠⚠⚠ This doesn't do much useful yet ⚠⚠⚠ +> ⚠⚠⚠ Certain kinds of FFI don't work yet. ⚠⚠⚠ -## Building +The goal of this project is to create an alternative codegen backend for the rust compiler based on [Cranelift](https://github.com/bytecodealliance/wasmtime/blob/main/cranelift). +This has the potential to improve compilation times in debug mode. +If your project doesn't use any of the things listed under "Not yet supported", it should work fine. +If not please open an issue. + +## Building and testing ```bash $ git clone https://github.com/bjorn3/rustc_codegen_cranelift.git $ cd rustc_codegen_cranelift -$ ./prepare.sh # downloads and patches sysroot src and installs hyperfine for benchmarking +$ ./prepare.sh # download and patch sysroot src and install hyperfine for benchmarking +$ ./build.sh +``` + +To run the test suite replace the last command with: + +```bash $ ./test.sh ``` +This will implicitly build cg_clif too. Both `build.sh` and `test.sh` accept a `--debug` argument to +build in debug mode. + +Alternatively you can download a pre built version from [GHA]. It is listed in the artifacts section +of workflow runs. Unfortunately due to GHA restrictions you need to be logged in to access it. + +[GHA]: https://github.com/bjorn3/rustc_codegen_cranelift/actions?query=branch%3Amaster+event%3Apush+is%3Asuccess + ## Usage -`$cg_clif_dir` is the directory you cloned this repo into in the following instruction. +rustc_codegen_cranelift can be used as a near-drop-in replacement for `cargo build` or `cargo run` for existing projects. + +Assuming `$cg_clif_dir` is the directory you cloned this repo into and you followed the instructions (`prepare.sh` and `build.sh` or `test.sh`). + +### Cargo + +In the directory with your project (where you can do the usual `cargo build`), run: + +```bash +$ $cg_clif_dir/build/cargo.sh run +``` + +This should build and run your project with rustc_codegen_cranelift instead of the usual LLVM backend. ### Rustc +> You should prefer using the Cargo method. + ```bash -$ rustc -Cpanic=abort -Zcodegen-backend=$cg_clif_dir/target/debug/librustc_codegen_cranelift.so my_crate.rs +$ $cg_clif_dir/build/bin/cg_clif my_crate.rs ``` -### Cargo +### 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 jit mode will probably need cargo integration to make this possible. ```bash -$ RUSTFLAGS="-Cpanic=abort -Zcodegen-backend=$cg_clif_dir/target/debug/librustc_codegen_cranelift.dylib --sysroot $cg_clif_dir/build_sysroot/sysroot" cargo run +$ $cg_clif_dir/build/cargo.sh jit ``` -## Not yet supported +or -* Good non-rust abi support ([scalar pair and vector are passed by-ref](https://github.com/bjorn3/rustc_codegen_cranelift/issues/10)) -* Checked binops ([some missing instructions in cranelift](https://github.com/CraneStation/cranelift/issues/460)) -* Inline assembly ([no cranelift support](https://github.com/CraneStation/cranelift/issues/444)) -* Varargs ([no cranelift support](https://github.com/CraneStation/cranelift/issues/212)) -* libstd (needs varargs and some other stuff) ([tracked here](https://github.com/bjorn3/rustc_codegen_cranelift/issues/146)) -* u128 and i128 ([no cranelift support](https://github.com/CraneStation/cranelift/issues/354)) -* SIMD ([tracked here](https://github.com/bjorn3/rustc_codegen_cranelift/issues/171)) +```bash +$ $cg_clif_dir/build/bin/cg_clif -Cllvm-args=mode=jit -Cprefer-dynamic my_crate.rs +``` + +There is also an experimental lazy jit mode. In this mode functions are only compiled once they are +first called. It currently does not work with multi-threaded programs. When a not yet compiled +function is called from another thread than the main thread, you will get an ICE. -## Troubleshooting +```bash +$ $cg_clif_dir/build/cargo.sh lazy-jit +``` -### Can't compile +### Shell -Try updating your nightly compiler. You can try to use an nightly a day or two older if updating rustc doesn't fix it. If you still can't compile it, please fill an issue. +These are a few functions that allow you to easily run rust code from the shell using cg_clif as jit. -### error[E0463]: can't find crate for `std` while compiling a no_std crate +```bash +function jit_naked() { + echo "$@" | $cg_clif_dir/build/bin/cg_clif - -Cllvm-args=mode=jit -Cprefer-dynamic +} + +function jit() { + jit_naked "fn main() { $@ }" +} + +function jit_calc() { + jit 'println!("0x{:x}", ' $@ ');'; +} +``` + +## Env vars + +[see env_vars.md](docs/env_vars.md) + +## Not yet supported -If you use `RUSTFLAGS` to pass `-Zcodegen-backend` to rustc, cargo will compile `build-dependencies` with those flags too. Because this project doesn't support libstd yet, that will result in an error. I don't know of any way to fix this. :( +* Good non-rust abi support ([several problems](https://github.com/bjorn3/rustc_codegen_cranelift/issues/10)) +* Inline assembly ([no cranelift support](https://github.com/bytecodealliance/wasmtime/issues/1041) + * On Linux there is support for invoking an external assembler for `global_asm!` and `asm!`. + `llvm_asm!` will remain unimplemented forever. `asm!` doesn't yet support reg classes. You + have to specify specific registers instead. +* SIMD ([tracked here](https://github.com/bjorn3/rustc_codegen_cranelift/issues/171), some basic things work)