138 lines
6.5 KiB
Markdown
138 lines
6.5 KiB
Markdown
# Contributing to rustc_codegen_gcc
|
|
|
|
Welcome to the `rustc_codegen_gcc` project! This guide will help you get started as a contributor. The project aims to provide a GCC codegen backend for rustc, allowing Rust compilation on platforms unsupported by LLVM and potentially improving runtime performance through GCC's optimizations.
|
|
|
|
## Getting Started
|
|
|
|
### Setting Up Your Development Environment
|
|
|
|
For detailed setup instructions including dependencies, build steps, and initial testing, please refer to our [README](Readme.md). The README contains the most up-to-date information on:
|
|
|
|
- Required dependencies and system packages
|
|
- Repository setup and configuration
|
|
- Build process
|
|
- Basic test verification
|
|
|
|
Once you've completed the setup process outlined in the README, you can proceed with the contributor-specific information below.
|
|
|
|
## Communication Channels
|
|
|
|
- Matrix: Join our [Matrix channel](https://matrix.to/#/#rustc_codegen_gcc:matrix.org)
|
|
- IRC: Join us on [IRC](https://web.libera.chat/#rustc_codegen_gcc)
|
|
- [GitHub Issues](https://github.com/rust-lang/rustc_codegen_gcc/issues): For bug reports and feature discussions
|
|
|
|
We encourage new contributors to join our communication channels and introduce themselves. Feel free to ask questions about where to start or discuss potential contributions.
|
|
|
|
## Understanding Core Concepts
|
|
|
|
### Sysroot & compilation flags
|
|
|
|
#### What *is* the sysroot?
|
|
The **sysroot** is the directory that stores the compiled standard
|
|
library (`core`, `alloc`, `std`, `test`, …) and compiler built-ins.
|
|
Rustup ships these libraries **pre-compiled with LLVM**.
|
|
|
|
**rustc_codegen_gcc** replaces LLVM with the GCC backend.
|
|
|
|
The freshly compiled sysroot ends up in
|
|
`build/build_sysroot/...`.
|
|
|
|
A rebuild of sysroot is needed when
|
|
|
|
* the backend changes in a way that affects code generation, or
|
|
* the user switches toolchains / updates submodules.
|
|
|
|
Both backend and sysroot can be built using different [profiles](https://doc.rust-lang.org/cargo/reference/profiles.html#default-profiles).
|
|
That is exactly what the `--sysroot`, `--release-sysroot` and `--release` flag supported by the build system script `y.sh` take care of.
|
|
|
|
|
|
#### Typical flag combinations
|
|
|
|
| Command | Backend Profile | Sysroot Profile | Usage Scenario |
|
|
|--------------------------------------------|-------------------------------|----------------------------------|------------------------------------------------------------|
|
|
| `./y.sh build` | dev* | n/a | Build backend in dev mode with optimized dependencies without rebuilding sysroot |
|
|
| `./y.sh build --release` | release (optimized) | n/a | Build backend in release mode with optimized dependencies without rebuilding sysroot |
|
|
| `./y.sh build --release --sysroot` | release (optimized) | dev | Build backend in release mode with optimized dependencies and sysroot in dev mode (unoptimized) |
|
|
| `./y.sh build --sysroot` | dev* | dev | Build backend in dev mode with optimized dependencies and sysroot in dev mode (unoptimized) |
|
|
| `./y.sh build --release-sysroot --sysroot`| dev* | release (optimized) | Build backend in dev mode and sysroot in release mode, both with optimized dependencies |
|
|
|
|
\* In `dev` mode, dependencies are compiled with optimizations, while the code of the backend itself is not.
|
|
|
|
|
|
Note: `--release-sysroot` must be used together with `--sysroot`.
|
|
|
|
|
|
### Common Development Tasks
|
|
|
|
#### Running Specific Tests
|
|
|
|
To run specific tests, use appropriate flags such as:
|
|
|
|
- `./y.sh test --test-libcore`
|
|
- `./y.sh test --std-tests`
|
|
- `./y.sh test --cargo-tests -- <name of test>`
|
|
|
|
Additionally, you can run the tests of `libgccjit`:
|
|
|
|
```bash
|
|
# libgccjit tests
|
|
cd gcc-build/gcc
|
|
make check-jit
|
|
# For a specific test:
|
|
make check-jit RUNTESTFLAGS="-v -v -v jit.exp=jit.dg/test-asm.cc"
|
|
```
|
|
|
|
#### Debugging Tools
|
|
|
|
The project provides several environment variables for debugging:
|
|
|
|
- `CG_GCCJIT_DUMP_GIMPLE`: Dumps the GIMPLE IR
|
|
- `CG_RUSTFLAGS`: Additional Rust flags
|
|
- `CG_GCCJIT_DUMP_MODULE`: Dumps a specific module
|
|
- `CG_GCCJIT_DUMP_TO_FILE`: Creates C-like representation
|
|
|
|
Full list of debugging options can be found in the [README](Readme.md#env-vars).
|
|
|
|
## Making Contributions
|
|
|
|
### Finding Issues to Work On
|
|
|
|
1. Look for issues labeled with [`good first issue`](https://github.com/rust-lang/rustc_codegen_gcc/issues?q=is%3Aissue%20state%3Aopen%20label%3A"good%20first%20issue") or [`help wanted`](https://github.com/rust-lang/rustc_codegen_gcc/issues?q=is%3Aissue%20state%3Aopen%20label%3A"help%20wanted")
|
|
2. Check the [progress report](https://blog.antoyo.xyz/rustc_codegen_gcc-progress-report-34#state_of_rustc_codegen_gcc) for larger initiatives
|
|
3. Consider improving documentation or investigating [failing tests](https://github.com/rust-lang/rustc_codegen_gcc/tree/master/tests) (except `failing-ui-tests12.txt`)
|
|
|
|
### Pull Request Process
|
|
|
|
1. Fork the repository and create a new branch
|
|
2. Make your changes with clear commit messages
|
|
3. Add tests for new functionality
|
|
4. Update documentation as needed
|
|
5. Submit a PR with a description of your changes
|
|
|
|
### Code Style Guidelines
|
|
|
|
- Follow Rust standard coding conventions
|
|
- Ensure your code passes `rustfmt` and `clippy`
|
|
- Add comments explaining complex logic, especially in GCC interface code
|
|
|
|
## Additional Resources
|
|
|
|
- [Rustc Dev Guide](https://rustc-dev-guide.rust-lang.org/)
|
|
- [GCC Internals Documentation](https://gcc.gnu.org/onlinedocs/gccint/)
|
|
- Project-specific documentation in the `doc/` directory:
|
|
- [Common errors](doc/errors.md)
|
|
- [Debugging](doc/debugging.md)
|
|
- [Debugging libgccjit](doc/debugging-libgccjit.md)
|
|
- [Git subtree sync](doc/subtree.md)
|
|
- [List of useful commands](doc/tips.md)
|
|
- [Send a patch to GCC](doc/sending-gcc-patch.md)
|
|
|
|
## Getting Help
|
|
|
|
If you're stuck or unsure about anything:
|
|
1. Check the existing documentation in the `doc/` directory
|
|
2. Ask in the IRC or Matrix channels
|
|
3. Open a GitHub issue for technical problems
|
|
4. Comment on the issue you're working on if you need guidance
|
|
|
|
Remember that all contributions, including documentation improvements, bug reports, and feature requests, are valuable to the project.
|