Find a file
Trevor Gross c117ebefd2
Rollup merge of #140920 - RalfJung:target-feature-unification, r=nnethercote,WaffleLapkin
Extract some shared code from codegen backend target feature handling

There's a bunch of code duplication between the GCC and LLVM backends in target feature handling. This moves that into new shared helper functions in `rustc_codegen_ssa`.

The first two commits should be purely refactoring. I am fairly sure the LLVM-side behavior stays the same; if the GCC side deliberately diverges from this then I may have missed that. I did account for one divergence, which I do not know is deliberate or not: GCC does not seem to use the `-Ctarget-feature` flag to populate `cfg(target_feature)`. That seems odd, since the `-Ctarget-feature` flag is used to populate the return value of `global_gcc_features` which controls the target features actually used by GCC. ``@GuillaumeGomez`` ``@antoyo`` is there a reason `target_config` ignores `-Ctarget-feature` but `global_gcc_features`  does not? The second commit also cleans up a bunch of unneeded complexity added in https://github.com/rust-lang/rust/pull/135927.

The third commit extracts some shared logic out of the functions that populate `cfg(target_feature)` and the backend target feature set, respectively. This one actually has some slight functional changes:
- Before, with `-Ctarget-feature=-feat`, if there is some other feature `x` that implies `feat` we would *not* add `-x` to the backend target feature set. Now, we do. This fixes rust-lang/rust#134792.
- The logic that removes `x` from `cfg(target_feature)` in this case also changed a bit, avoiding a large number of calls to the (uncached) `sess.target.implied_target_features` (if there were a large number of positive features listed before a negative feature) but instead constructing a full inverse implication map when encountering the first negative feature. Ideally this would be done with queries but the backend target feature logic runs before `tcx` so we can't use that...
- Previously, if feature "a" implied "b" and "b" was unstable, then using `-Ctarget-feature=+a` would also emit a warning about `b`. I had to remove this since when accounting for negative implications, this emits a ton of warnings in a bunch of existing tests... I assume this was unintentional anyway.

The fourth commit increases consistency of the GCC backend with the LLVM backend.

The last commit does some further cleanup:
- Get rid of RUSTC_SPECIAL_FEATURES. It was only needed for s390x "backchain", but since LLVM 19 that is always a regular target feature so we don't need this hack any more. The hack also has various unintended side-effects so we don't want to keep it. Fixes https://github.com/rust-lang/rust/issues/142412.
- Move RUSTC_SPECIFIC_FEATURES handling into the shared parse_rust_feature_flag helper so all consumers of `-Ctarget-feature` that only care about actual target features (and not "crt-static") have it. Previously, we actually set `cfg(target_feature = "crt-static")` twice: once in the backend target feature logic, and once specifically for that one feature. IIUC, some targets are meant to ignore `-Ctarget-feature=+crt-static`, it seems like before this PR that flag still incorrectly enabled `cfg(target_feature = "crt-static")` (but I didn't test this).
- Move fixed_x18 handling together with retpoline handling.
- Forbid setting fixed_x18 as a regular target feature, even unstably. It must be set via the `-Z` flag.

``@bjorn3`` I did not touch the cranelift backend here, since AFAIK it doesn't really support target features. But if you ever do, please use the new helpers. :)

Cc ``@workingjubilee``
2025-06-20 02:50:38 -04:00
.github Run clippy correctly, run it on build_system as well and run it earlier 2025-06-16 16:15:36 +02:00
compiler Rollup merge of #140920 - RalfJung:target-feature-unification, r=nnethercote,WaffleLapkin 2025-06-20 02:50:38 -04:00
library Auto merge of #142294 - GuillaumeGomez:specialize-tostring-on-128-integers, r=tgross35 2025-06-20 02:55:43 +00:00
LICENSES Synchronize Unicode license text from unicode.org 2024-11-20 00:54:12 -08:00
src Rollup merge of #140920 - RalfJung:target-feature-unification, r=nnethercote,WaffleLapkin 2025-06-20 02:50:38 -04:00
tests Rollup merge of #140920 - RalfJung:target-feature-unification, r=nnethercote,WaffleLapkin 2025-06-20 02:50:38 -04:00
.clang-format Add .clang-format 2024-06-26 05:56:00 +08:00
.editorconfig Don't apply editorconfig to llvm 2025-02-09 16:21:14 -05:00
.git-blame-ignore-revs git: ignore 60600a6fa4 for blame purposes 2025-04-17 11:50:24 +08:00
.gitattributes Mark .pp files as Rust 2025-03-29 12:39:06 +01:00
.gitignore change config.toml to bootstrap.toml for bootstrap module 2025-03-17 12:56:41 +05:30
.gitmodules Lowercase git url for rust-lang/enzyme.git 2025-05-15 21:37:49 +00:00
.ignore change config.toml to bootstrap.toml for bootstrap module 2025-03-17 12:56:41 +05:30
.mailmap Add some missing mailmap entries 2025-06-13 17:51:27 +00:00
bootstrap.example.toml Rename tool-config to tool and add docs 2025-06-12 13:58:38 +02:00
Cargo.lock Rollup merge of #142524 - rust-lang:cargo_update, r=Mark-Simulacrum 2025-06-18 20:22:50 -04:00
Cargo.toml Make the tempfile version in Cargo.toml matches the one in Cargo.lock 2025-06-16 17:33:03 +02:00
CODE_OF_CONDUCT.md Remove the code of conduct; instead link https://www.rust-lang.org/conduct.html 2019-10-05 22:55:19 +02:00
configure Ensure ./configure works when configure.py path contains spaces 2024-02-16 18:57:22 +00:00
CONTRIBUTING.md Improve CONTRIBUTING.md grammar and clarity 2025-05-23 23:03:06 +02:00
COPYRIGHT dist: Re-work how we describe the licence of Rust in our distributions 2024-12-09 10:18:55 +00:00
INSTALL.md mention about x.py setup in INSTALL.md 2025-04-24 09:15:53 +03:00
LICENSE-APACHE Remove appendix from LICENCE-APACHE 2019-12-30 14:25:53 +00:00
license-metadata.json Update license metadata 2025-02-15 16:48:37 +01:00
LICENSE-MIT dist: Re-work how we describe the licence of Rust in our distributions 2024-12-09 10:18:55 +00:00
README.md Update Rust Foundation links in Readme 2025-03-16 19:03:40 -07:00
RELEASES.md Rollup merge of #140879 - pthariensflame:patch-1, r=pietroalbini 2025-05-10 16:26:04 +02:00
REUSE.toml change config.toml to bootstrap.toml for bootstrap module 2025-03-17 12:56:41 +05:30
rust-bors.toml Increase timeout for new bors try builds 2025-05-30 15:59:14 +02:00
rustfmt.toml Do not run rustfmt on the compiler-builtins subtree 2025-05-18 15:42:35 +00:00
triagebot.toml remove joboet from review rotation 2025-06-18 08:54:32 +02:00
x Look for python3 first on MacOS, not py 2025-02-13 10:24:54 -05:00
x.ps1 use & instead of start-process in x.ps1 2023-12-09 09:46:16 -05:00
x.py Reformat Python code with ruff 2024-12-04 23:03:44 +01:00

This is the main source code repository for Rust. It contains the compiler, standard library, and documentation.

Why Rust?

  • Performance: Fast and memory-efficient, suitable for critical services, embedded devices, and easily integrated with other languages.

  • Reliability: Our rich type system and ownership model ensure memory and thread safety, reducing bugs at compile-time.

  • Productivity: Comprehensive documentation, a compiler committed to providing great diagnostics, and advanced tooling including package manager and build tool (Cargo), auto-formatter (rustfmt), linter (Clippy) and editor support (rust-analyzer).

Quick Start

Read "Installation" from The Book.

Installing from Source

If you really want to install from source (though this is not recommended), see INSTALL.md.

Getting Help

See https://www.rust-lang.org/community for a list of chat platforms and forums.

Contributing

See CONTRIBUTING.md.

License

Rust is primarily distributed under the terms of both the MIT license and the Apache License (Version 2.0), with portions covered by various BSD-like licenses.

See LICENSE-APACHE, LICENSE-MIT, and COPYRIGHT for details.

Trademark

The Rust Foundation owns and protects the Rust and Cargo trademarks and logos (the "Rust Trademarks").

If you want to use these names or brands, please read the Rust language trademark policy.

Third-party logos may be subject to third-party copyrights and trademarks. See Licenses for details.