Require target lra in gcc.dg/pr108095.c
[official-gcc.git] / gcc / rust / README.md
blob1f76bba9f5f07304f3b2887625e566ff1a056439
1 ![C/C++ CI](https://github.com/Rust-GCC/gccrs/workflows/C/C++%20CI/badge.svg)
2 [![GCC Bootstrap Build](https://github.com/Rust-GCC/gccrs/actions/workflows/bootstrap.yml/badge.svg)](https://github.com/Rust-GCC/gccrs/actions/workflows/bootstrap.yml)
3 [![Build Docker image](https://github.com/Rust-GCC/gccrs/actions/workflows/docker.yml/badge.svg)](https://github.com/Rust-GCC/gccrs/actions/workflows/docker.yml)
4 ![Docker Pulls](https://img.shields.io/docker/pulls/philberty/gccrs)
5 [![project chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://gcc-rust.zulipchat.com/)
6 [![Bors enabled](https://bors.tech/images/badge_small.svg)](https://app.bors.tech/repositories/32890)
7 # GCC Rust
8 ![GCC Rust](logo.png?raw=true "GCC rust Logo")
10 Please note, the compiler is in a very early stage and not usable yet for compiling real Rust programs.
12 gccrs is a full alternative implementation of the Rust language ontop of GCC with the goal
13 to become fully upstream with the GNU toolchain.
15 The origin of this project was a community effort several years ago where Rust was still at version 0.9;
16 the language was subject to so much change that it became difficult for a community effort to play catch up.
17 Now that the language is stable, it is an excellent time to create alternative compilers. The developers of
18 the project are keen “Rustaceans” with a desire to give back to the Rust community and to learn what GCC is capable
19 of when it comes to a modern language.
21 ## Build Farm Status
23 - [Debian i386](https://builder.sourceware.org/buildbot/#/builders/gccrust-debian-i386) [![Debian i386](https://builder.sourceware.org/buildbot/badges/gccrust-debian-i386.svg)](https://builder.sourceware.org/buildbot/#/builders/gccrust-debian-i386)
24 - [Debian ppc64](https://builder.sourceware.org/buildbot/#/builders/gccrust-debian-ppc64) [![Debian ppc64](https://builder.sourceware.org/buildbot/badges/gccrust-debian-ppc64.svg)](https://builder.sourceware.org/buildbot/#/builders/gccrust-debian-ppc64)
25 - [Debian testing-x86_64](https://builder.sourceware.org/buildbot/#/builders/146) [![Debian testing-x86_64](https://builder.sourceware.org/buildbot/badges/gccrust-debian-testing-x86_64.svg)](https://builder.sourceware.org/buildbot/#/builders/146)
26 - [Fedora arm64](https://builder.sourceware.org/buildbot/#/builders/179) [![Fedora arm64](https://builder.sourceware.org/buildbot/badges/gccrust-fedora-arm64.svg)](https://builder.sourceware.org/buildbot/#/builders/179)
27 - [Fedora ppc64le](https://builder.sourceware.org/buildbot/#/builders/gccrust-fedora-ppc64le) [![Fedora ppc64le](https://builder.sourceware.org/buildbot/badges/gccrust-fedora-ppc64le.svg)](https://builder.sourceware.org/buildbot/#/builders/gccrust-fedora-ppc64le)
28 - [Fedora s390x](https://builder.sourceware.org/buildbot/#/builders/gccrust-fedora-s390x) [![Fedora s390x](https://builder.sourceware.org/buildbot/badges/gccrust-fedora-s390x.svg)](https://builder.sourceware.org/buildbot/#/builders/gccrust-fedora-s390x)
29 - [Fedora X86_64](https://builder.sourceware.org/buildbot/#/builders/gccrust-fedora-x86_64) [![Fedora X86-64](https://builder.sourceware.org/buildbot/badges/gccrust-fedora-x86_64.svg)](https://builder.sourceware.org/buildbot/#/builders/gccrust-fedora-x86_64)
30 - [OpenSUSE Leap X86_64](https://builder.sourceware.org/buildbot/#/builders/104) [![OpenSUSE Leap X86_64](https://builder.sourceware.org/buildbot/badges/gccrust-opensuseleap-x86_64.svg)](https://builder.sourceware.org/buildbot/#/builders/104)
31 - [OpenSUSE tw X86_64](https://builder.sourceware.org/buildbot/#/builders/103) [![OpenSUSE tw X86_64](https://builder.sourceware.org/buildbot/badges/gccrust-opensusetw-x86_64.svg)](https://builder.sourceware.org/buildbot/#/builders/103)
32 - [Rawhide X86_64](https://builder.sourceware.org/buildbot/#/builders/132) [![Rawhide X86_64](https://builder.sourceware.org/buildbot/badges/gccrust-rawhide-x86_64.svg)](https://builder.sourceware.org/buildbot/#/builders/132)
34 ## FAQ
36 Please find the answers to frequently asked questions over on: https://github.com/Rust-GCC/gccrs/wiki/Frequently-Asked-Questions
38 ## Development Environment
40 ### Building
42 Fetch dependencies for Ubuntu:
44 ```bash
45 $ apt install build-essential libgmp3-dev libmpfr-dev libmpc-dev flex bison autogen gcc-multilib dejagnu
46 ```
48 Clone the repository
50 ```bash
51 $ git clone https://github.com/Rust-GCC/gccrs
52 ```
54 #### Linux
56 It is important to remember that GNU toolchain projects are designed to be built outside of their source directory
57 which is why a build directory is created.
59 ```bash
60 $ mkdir gccrs-build
61 $ cd gccrs-build
62 $ ../gccrs/configure --prefix=$HOME/gccrs-install --disable-bootstrap --enable-multilib --enable-languages=rust
63 $ make
64 ```
66 #### MacOS
68 The path of header dir and sysroot should be specified when you configure the project.
69 ```bash
70 $ mkdir mac-build
71 $ cd mac-build
72 $ ../gccrs/configure --prefix=$HOME/gccrs-install --disable-bootstrap --enable-multilib --enable-languages=rust --with-native-system-header-dir=/usr/include --with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
73 $ make
75 ```
77 #### Running GCC Rust
79 Running the compiler itself without make install we can simply invoke the compiler proper:
81 ```bash
82 $ ./gcc/rust1 test.rs -frust-debug -frust-dump-parse -Warray-bounds -dumpbase test.rs -mtune=generic -march=x86-64 -O0 -version -fdump-tree-gimple -o test.s -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib64
83 ```
85 To invoke the compiler driver (gccrs) we need to:
87 ```bash
88 $ make install
89 ```
91 Then invoke the compiler from the installation directory:
93 ```bash
94 $ $HOME/gccrs-install/gccrs -g -O2 -c test.rs -o test.o
95 $ $HOME/gccrs-install/gccrs -o test test.o
96 ```
98 You can also setup your shell to automatically find the installed compiler. For example for `bash`,
99 add the following in your `$HOME/.bashrc`:
101 ```bash
102 export PATH=$HOME/gccrs-install/bin:$PATH
106 ## Testsuite
108 Invoke the full testsuite from the build directory (`gccrs-build` in the previous commands):
110 ```bash
111 $ make check-rust
114 Invoke a subset of the testsuite. For example, to only run tests that are currently known/expected to fail:
116 ```bash
117 $ make check-rust RUNTESTFLAGS="xfail.exp"
119 There are the following sets of tests:
120 - `compile.exp` : compilation tests
121 - `execute.exp` : execution tests
122 - `xfail.exp` : tests that are currently known/expected to fail
124 Invoke only a specific test :
126 ```bash
127 $ make check-rust RUNTESTFLAGS="--all compile.exp=continue1.rs"
130 Logs (with corresponding commands) can be found in : `gccrs-build/gcc/testsuite/rust/rust.log`.
132 See [GCC Testing documentation](https://gcc.gnu.org/install/test.html) for more details.
134 Test cases are located within [`gcc/testsuite/rust/`](gcc/testsuite/rust/).
135 Please contribute your specific
136 test cases referencing any issues on Github.
138 ## Debugging
140 ### Enabling internal checks
142 GCC has several internal checks that can be enabled during configuration. In the case of `gccrs`,
143 you can enable the following:
144 ```bash
145 $ ../gccrs/configure --prefix=$HOME/gccrs-install --disable-bootstrap --enable-multilib --enable-languages=rust --enable-checking=gimple,tree,types
148 ### GDB
149 You can directly invoke `gdb` on the `rust1` compiler process (you can find the
150 exact command adding `--verbose` to your `gccrs` invocation):
151 ```bash
152 $ gccrs test.rs -O0 -S -o arithmetic_expressions1.s --verbose
154  /some/path/../../rust1 test.rs -quiet -dumpbase arithmetic_expressions1.rs -dumpbase-ext .rs
155  -mtune=generic -march=x86-64 -O0 -w -version -fdiagnostics-color=never -fno-diagnostics-show-caret -fno-diagnostics-show-line-numbers -fdiagnostics-urls=never -fdiagnostics-path-format=separate-events -o test.s -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu
157 $ gdb --args  /some/path/../../rust1 test.rs -quiet -dumpbase arithmetic_expressions1.rs -dumpbase-ext .rs
158  -mtune=generic -march=x86-64 -O0 -w -version -fdiagnostics-color=never -fno-diagnostics-show-caret -fno-diagnostics-show-line-numbers -fdiagnostics-urls=never -fdiagnostics-path-format=separate-events -o test.s -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu
161 Or simply add the `-wrapper gdb,--args` option.
162 This will call each subcommand in `gdb` and you simply have to break/debug in `rust1`:
163 ```bash
164 $ gccrs test.rs -O0 -S -o arithmetic_expressions1.s -wrapper gdb,--args
167 ## Docker image
169 There is a docker image hosted over on:
171 https://hub.docker.com/repository/docker/philberty/gccrs
173 ```bash
174 $ docker pull philberty/gccrs
177 Or you can build your own image:
179 ```bash
180 $ docker build . -t gccrs-dev
182 If you want to build an object file:
184 ```bash
185 $ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp \
186     gccrs-dev:latest gccrs -g -O2 -c \
187     gcc/testsuite/rust/compile/torture/type_infer1.rs -o type_infer1.o
190 If you want to build an executable file:
191 ```bash
192 $ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp \
193     gccrs-dev:latest gccrs -g -O2 \
194     gcc/testsuite/rust/compile/torture/type_infer1.rs -o type_infer1
197 To emit assembly :
198 ```bash
199 $ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp \
200     gccrs-dev:latest gccrs -g -O2 \
201     gcc/testsuite/rust/compile/torture/type_infer1.rs -S -o type_infer1.s
204 To emit Rust front end debug output, you may add options like `-frust-debug`, `-frust-dump-all`.
207 ## Contributing
209 If you want to contribute to GCC Rust, you can find more information in [CONTRIBUTING.md](https://github.com/Rust-GCC/gccrs/blob/master/CONTRIBUTING.md).
211 Please be aware this project is designed to be pushed upstream to GCC when we reach some milestones,
212 and this means we require copyright assignment or the Developer's Certificate of Origin sign-off.
213 Please see the [Contributing to GCC](https://gcc.gnu.org/contribute.html) guide or [Developer's Certificate of Origin (DCO) Sign-off](https://gcc.gnu.org/dco.html) guide.
215 Not all contributions must be code; we would love to see new test cases or bugs and issues to be reported.
216 Feel free to add any comments on open PRs
219 ## Continuous Integration
221 When submitting (or updating) a [GitHub Pull Request](https://github.com/Rust-GCC/gccrs/pull/),
222 several automated checks are run.
223 Generally, a "green status" is necessary before merge.
226 ### Compiler Diagnostics
228 That is, here, diagnostics emitted by the "initial" compiler used to build GCC/Rust.
230 If building a native toolchain,
231 GCC by default does a 3-stage bootstrap build (<https://gcc.gnu.org/install/configure.html>).
232 In addition to making sure that GCC is able to reproduce itself bit-by-bit,
233 this also means that stages 2+ are built with `-Werror`
234 (turning most _warning_ into _error_ diagnostics; see `--enable-werror`,
235 possibly enabled by default).
236 This helps to catch a good number of bugs, because it enforces that GCC compiles without compiler diagnostics;
237 it's a requirement for upstream patch submission (<https://gcc.gnu.org/contribute.html#testing>).
239 GCC generally is only expected to be "warning-clean" without `--disable-bootstrap`
240 (that is, default `--enable-bootstrap` for a native build),
241 and not for the initial stage where it's using the "initial" compiler -- otherwise
242 we're at the mercy of whatever "initial" compiler we're using.
243 Doing a `--disable-bootstrap` build is much faster, of course, so we're often doing that:
244 for example, per the instructions above, or in the standard CI.
245 With that, we're missing out on the aspect that _enforces that GCC compiles without compiler diagnostics_.
247 To encounter that, the default CI has a [_check for new warnings_ step](https://github.com/Rust-GCC/gccrs/pull/1026)
248 that verifies in the CI `--disable-bootstrap` build configuration that no new warnings are introduced.
249 If that step fails, it usually points out a new _warning_ you've introduced erroneously, and should address.
250 Occasionally it means that simply the `.github/bors_log_expected_warnings` file needs to be updated,
251 for example if due to any kind of "environmental changes" (for example, CI "initial" compiler changes).
252 Unless diligently reproducing the CI configuration (in particular "initial" compiler, GCC version),
253 it's not really feasible to reproduce this check locally.
254 If in doubt, do a local `--enable-bootstrap` build, or submit your changes, and wait for the CI system's results.
257 ## Community
259 We can be found on all usual Rust channels such as Zulip, but we also have our own channels:
261 * GCC Rust Zulip: https://gcc-rust.zulipchat.com/
262 * Twitter: https://twitter.com/gcc_rust
263 * GCC Mailing List: https://gcc.gnu.org/mailman/listinfo/gcc-rust
264 * irc: irc.oftc.net - gccrust