This is a GCC codegen for rustc, which means it can be loaded by the existing rustc frontend, but benefits from GCC: more architectures are supported and GCC's optimizations are used.
Despite its name, libgccjit can be used for ahead-of-time compilation, as is used here.
The primary goal of this project is to be able to compile Rust code on platforms unsupported by LLVM. A secondary goal is to check if using the gcc backend will provide any run-time speed improvement for the programs compiled using rustc.
Note: This requires a patched libgccjit in order to work. You need to use my fork of gcc which already includes these patches. The default configuration (see below in the Quick start section) will download a libgccjit built in the CI that already contains these patches, so you don't need to build this fork yourself if you use the default configuration.
- rustup: follow instructions on the official website
- consider to install DejaGnu which is necessary for running the libgccjit test suite. website
- additional packages: flex, libmpfr-dev, libgmp-dev, libmpc3, libmpc-dev
-
Clone and configure the repository:
git clone https://github.com/rust-lang/rustc_codegen_gcc cd rustc_codegen_gcc cp config.example.toml config.toml -
Build and test:
./y.sh prepare # downloads and patches sysroot ./y.sh build --sysroot --release # Verify setup with a simple test ./y.sh cargo build --manifest-path tests/hello-world/Cargo.toml # Run full test suite (expect ~100 failing UI tests) ./y.sh test --release
If don't need to test GCC patches you wrote in our GCC fork, then the default configuration should be all you need. You can update the rustc_codegen_gcc without worrying about GCC.
If you wrote a patch for GCC and want to test it without this backend, you will need to do a few more things.
To build it (most of these instructions come from here, so don't hesitate to take a look there if you encounter an issue):
If you want to run libgccjit tests, you will need to also enable the C++ language in the configure:
Then to run libgccjit tests:
Put the path to your custom build of libgccjit in the file config.toml.
You now need to set the gcc-path value in config.toml with the result of this command:
and to comment the download-gccjit setting:
Then you can run commands like this:
To run the tests:
You have to run these commands, in the corresponding order:
To check if all is working correctly, run:
If you compiled cg_gccjit in debug mode (aka you didn't pass --release to ./y.sh test) you should use CHANNEL="debug" instead or omit CHANNEL="release" completely.
To use LTO, you need to set the variable EMBED_LTO_BITCODE=1 in addition to setting lto = "fat" in the Cargo.toml.
Failing to set EMBED_LTO_BITCODE will give you the following error:
If you want to run rustc directly, you can do so with:
You can do the same manually (although we don't recommend it):
- CG_GCCJIT_DUMP_ALL_MODULES: Enables dumping of all compilation modules. When set to "1", a dump is created for each module during compilation and stored in /tmp/reproducers/.
- CG_GCCJIT_DUMP_MODULE: Enables dumping of a specific module. When set with the module name, e.g., CG_GCCJIT_DUMP_MODULE=module_name, a dump of that specific module is created in /tmp/reproducers/.
- CG_RUSTFLAGS: Send additional flags to rustc. Can be used to build the sysroot without unwinding by setting CG_RUSTFLAGS=-Cpanic=abort.
- CG_GCCJIT_DUMP_TO_FILE: Dump a C-like representation to /tmp/gccjit_dumps and enable debug info in order to debug this C-like representation.
- CG_GCCJIT_DUMP_RTL: Dumps RTL (Register Transfer Language) for virtual registers.
- CG_GCCJIT_DUMP_RTL_ALL: Dumps all RTL passes.
- CG_GCCJIT_DUMP_TREE_ALL: Dumps all tree (GIMPLE) passes.
- CG_GCCJIT_DUMP_IPA_ALL: Dumps all Interprocedural Analysis (IPA) passes.
- CG_GCCJIT_DUMP_CODE: Dumps the final generated code.
- CG_GCCJIT_DUMP_GIMPLE: Dumps the initial GIMPLE representation.
- CG_GCCJIT_DUMP_EVERYTHING: Enables dumping of all intermediate representations and passes.
- CG_GCCJIT_KEEP_INTERMEDIATES: Keeps intermediate files generated during the compilation process.
- CG_GCCJIT_VERBOSE: Enables verbose output from the GCC driver.
More specific documentation is available in the doc folder:
- Common errors
- Debugging GCC LTO
- Debugging libgccjit
- Git subtree sync
- List of useful commands
- Send a patch to GCC
While this crate is licensed under a dual Apache/MIT license, it links to libgccjit which is under the GPLv3+ and thus, the resulting toolchain (rustc + GCC codegen) will need to be released under the GPL license.
However, programs compiled with rustc_codegen_gcc do not need to be released under a GPL license.