Skip to content

Rollup of 5 pull requests#159579

Merged
rust-bors[bot] merged 13 commits into
rust-lang:mainfrom
JonathanBrouwer:rollup-TlvztYP
Jul 20, 2026
Merged

Rollup of 5 pull requests#159579
rust-bors[bot] merged 13 commits into
rust-lang:mainfrom
JonathanBrouwer:rollup-TlvztYP

Conversation

@JonathanBrouwer

Copy link
Copy Markdown
Contributor

Successful merges:

r? @ghost

Create a similar rollup

Kobzol and others added 13 commits July 12, 2026 21:01
- Boolean target modifiers are now mentioned without a trailing `=` in the
messages.
- Wording improved for unset target modifiers.
…and NVPTX

For AVR, AMDGCN, and NVPTX, crates built with different target CPU values are
not generally link-compatible.

Add a `requires_consistent_cpu` flag to the target spec and enable it for these
targets. When the flag is set, treat `-Ctarget-cpu` as a target modifier and
require all linked crates to agree on its value.

Reject `-Ctarget-cpu=native` before codegen for targets that set
`requires_consistent_cpu` to true. Also do not include `native` in the printed
`target-cpus` list for such targets.

Add tests covering:
- which built-in targets set `requires-consistent-cpu`
- cross-crate behavior with and without `requires-consistent-cpu`
- that an omitted `-Ctarget-cpu` compares equal to an explicitly specified
  default CPU
- rejection and printing behavior for `native`
- precedence of repeated `-Ctarget-cpu` flags in metadata comparison and LLVM IR
…k-Simulacrum

Always generate private and hidden items in JSON docs of the stdlib

This data is needed for downstream tools, e.g. cargo-semver-checks, to analyse the whole stdlib.

For the HTML output it is configurable using `build.library-docs-private-items`, but to avoid adding a separate config for just the JSON format, I think that we can just enable it unconditionally.

An alternative would be to change the flag from a bool to something like
```rust
enum StdDocsPrivateItems {
    No,
    Yes,
    Html,
    Json
}
```
…orn3

Convert `-Ctarget-cpu` into a target-modifier for AVR, AMDGCN and NVPTX

Crates built for AVR, AMDGCN and NVPTX that specify different values for `-Ctarget-cpu` cannot be soundly linked together.
This PR attempts to make `rustc` ensure that no crates with disagreeing values for `-Ctarget-cpu` are linked together. This is achieved by converting `-Ctarget-cpu` into a target-modifier depending on `--target`.
To do this, the consistency check for `-Ctarget-cpu` considers mismatching values as inconsistent only for targets for which the new flag `requires_consistent_cpu` is set in their target spec.

**Why should `-Ctarget-cpu` be a target-modifier for `nvptx`?**
<details><summary>PTX is a single-module contract</summary>
<p>
PTX requires a binary to start with .version (`ptx$$`) then .target (`sm_$$`). If the ptx contains instructions that are not supported by either .version or .target, the binary is ill-formed and will be rejected by ptxas. The concept of features that can be mixed and matched in a binary does not exist for nvptx and is therefore not supported by LLVM.
</p>
</details>

<details><summary>It prevents the production of bitcode that cannot be codegen'd after linking</summary>
<p>
A target modifier should prevent configurations that are not composable across crates when those crates are linked together. The most prominent example is when enabling a target feature changes the ABI, making cross-crate calls inherently unsound.

In the case of nvptx, ABI mismatch is (at least for now) not the core problem motivating target modifiers. NVIDIA’s documented PTX calling convention has [remained stable since ptx20](https://docs.nvidia.com/cuda/ptx-writers-guide-to-interoperability/index.html#function-calling-sequence).

However, in the current state it is possible to produce bitcode that cannot be codegen'd after linking, because some operations are only lowerable for sufficiently new SM/PTX levels. In the best case this results in an LLVM error during the final llc step, but this is not something we should rely on for correctness.

nvptx has a special compilation pipeline where instead of linking the final PTX object, instead LLVM bitcode is linked. The resulting artifact is then compiled in one invocation.
Now consider crate A which is independently compiled into bitcode with the following rustc arguments:

```Rust
//@ compile-flags: --target nvptx64-nvidia-cuda -C target-cpu=sm_70 --crate-type=rlib
#[cfg(target_feature = "sm_70")]
fn foo() {
    // cannot be lowered to ptx before "sm_70: so currently produces an LLVM error
}
#[cfg(not(target_feature = "sm_70"))]
fn foo() {
    // can be lowered to ptx before "sm_70"
}
pub fn bar() {
    foo()
}
```
Crate A is a dependency of crate B. In the *rustc* invocation of crate B
1. crate B is compiled into bitcode, too
2. both bitcode artifacts are bitcode-linked by *llvm-link*
3. the resulting bitcode artifact is compiled by *llc -mcpu=sm_60*

This should now ideally create an LLVM error, because the linked bitcode contains code paths that were selected under `sm_70` assumptions but the final NVPTX codegen is targeting `sm_60`, where those operations are not lowerable. An LLVM error here is better than silent miscompilation, but it’s not a promise we should rely on.

A real example where this could happen is the lowering of atomic loads and stores with non-relaxed orderings, which is known to depend on the selected SM level.
</p>
</details>

**Why should `-Ctarget-cpu` be a target-modifier for `amdgcn` and `avr`?**
- In case of AVR the target-cpu defines the ISA, which is encoded in the ELF header flags, amdgcn also encodes the cpu directly into those flags
- To not rely on *lld* which currently prevents it for both by looking at those flags [AVR](https://github.com/llvm/llvm-project/blob/597ffbe09d5f774f861ee55e50022bf84d7f98e2/lld/test/ELF/avr-flags.s) and [amdgcn](https://github.com/llvm/llvm-project/blob/597ffbe09d5f774f861ee55e50022bf84d7f98e2/lld/test/ELF/amdgpu-elf-flags-err.s)

Previous discussions about the topic can be found [here](rust-lang#131799 (comment)) and [here](rust-lang#141468).

I also created a [Zulip discussion](https://rust-lang.zulipchat.com/#narrow/channel/131828-t-compiler/topic/Making.20-Ctarget-cpu.20a.20target-modifier.20on.20NVPTX/with/566622679).

I am unsure if a MCP is needed before proceeding. If you think so please let me know.

Creating *target-modifiers* for NVPTX *target-features* is to be done in a follow-up.

cc @kjetilkjeka as target maintainer for NVPTX
cc @Flakebi as target maintainer for amdgcn
cc @Patryk27 as target maintainer for AVR
cc @RalfJung you were very involved in the discussions so far

Target modifier tracking issue: rust-lang#136966
…ark-Simulacrum

restrict const-eval-related 'content' triggers to library/ folder

Cc @rust-lang/wg-const-eval

The 2nd commit is a drive-by fix.
fix ICE in opsem inhabitedness check

I feel like maybe rust-lang#159560 should be avoided by not even trying to evaluate this constant... but anyway it makes sense to make this query tolerant to `ty::Error` IMO.

The error message we emit still makes no sense, but that's a separate issue and better than ICEing.

Fixes rust-lang#159560
r? @oli-obk
@rust-bors rust-bors Bot added the rollup A PR which is a rollup label Jul 19, 2026
@rustbot rustbot added A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. A-meta Area: Issues & PRs about the rust-lang/rust repository itself A-run-make Area: port run-make Makefiles to rmake.rs S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-bootstrap Relevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap) T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Jul 19, 2026
@JonathanBrouwer

Copy link
Copy Markdown
Contributor Author

@bors r+ rollup=never p=5

@rust-bors

rust-bors Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 1271efe has been approved by JonathanBrouwer

It is now in the queue for this repository.

@rust-bors rust-bors Bot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 19, 2026
@rust-bors

This comment has been minimized.

rust-bors Bot pushed a commit that referenced this pull request Jul 19, 2026
…uwer

Rollup of 5 pull requests

Successful merges:

 - #159188 (Always generate private and hidden items in JSON docs of the stdlib)
 - #159567 (Update rustc crate crossbeam-epoch to 0.9.20)
 - #150732 (Convert `-Ctarget-cpu` into a target-modifier for AVR, AMDGCN and NVPTX )
 - #159549 (restrict const-eval-related 'content' triggers to library/ folder)
 - #159570 (fix ICE in opsem inhabitedness check)
@rust-bors rust-bors Bot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. labels Jul 20, 2026
@rust-bors

rust-bors Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 4a603e4 failed: CI

@jhpratt

jhpratt commented Jul 20, 2026

Copy link
Copy Markdown
Member

The only meaningful diagnostics are info-level, with the final line saying "The operation was canceled." Given that none of these PRs seem to have anything to do with the diagnostics

@bors retry

@rust-bors rust-bors Bot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 20, 2026
@rust-bors

This comment has been minimized.

@rust-bors rust-bors Bot added merged-by-bors This PR was explicitly merged by bors. and removed S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. labels Jul 20, 2026
@rust-bors

rust-bors Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

☀️ Test successful - CI
Approved by: JonathanBrouwer
Duration: 3h 20m 22s
Pushing 730a6b5 to main...

@rust-bors
rust-bors Bot merged commit 730a6b5 into rust-lang:main Jul 20, 2026
14 checks passed
@rustbot rustbot added this to the 1.99.0 milestone Jul 20, 2026
@rust-timer

Copy link
Copy Markdown
Collaborator

📌 Perf builds for each rolled up PR:

PR# Message Perf Build Sha
#159188 Always generate private and hidden items in JSON docs of th… 7ecc8d0f3301f932a797ce42b2b19ac506bf3dc7 (link)
#159567 Update rustc crate crossbeam-epoch to 0.9.20 9024d5a0ec72495e227238b0922c0a1a25371134 (link)
#150732 Convert -Ctarget-cpu into a target-modifier for AVR, AMDG… 1cdab18f63308ac73c7b02c98c43b48a69d3708a (link)
#159549 restrict const-eval-related 'content' triggers to library/ … f6153f6bb6bf4ccd54fe12410e28ecefa52183ad (link)
#159570 fix ICE in opsem inhabitedness check 50852b315ca87ea4b6ad5b192eb9ea55b22fc7ba (link)

previous master: 9f36de775b

In the case of a perf regression, run the following command for each PR you suspect might be the cause: @rust-timer build $SHA

@github-actions

Copy link
Copy Markdown
Contributor
What is this? This is an experimental post-merge analysis report that shows differences in test outcomes between the merged PR and its parent PR.

Comparing 9f36de7 (parent) -> 730a6b5 (this PR)

Test differences

Show 31 test diffs

Stage 1

  • [ui] tests/ui/consts/extra-const-ub/pointee-type-with-error-issue-159560.rs: [missing] -> pass (J1)
  • [ui] tests/ui/target_modifiers/target_cpu_default.rs#explicit_default: [missing] -> pass (J1)
  • [ui] tests/ui/target_modifiers/target_cpu_default.rs#explicit_mismatch: [missing] -> pass (J1)
  • [ui] tests/ui/target_modifiers/target_cpu_default.rs#implicit_default: [missing] -> pass (J1)
  • [ui] tests/ui/target_modifiers/target_cpu_default.rs#implicit_mismatch: [missing] -> pass (J1)
  • [ui (polonius)] tests/ui/consts/extra-const-ub/pointee-type-with-error-issue-159560.rs: [missing] -> pass (J2)
  • [ui (polonius)] tests/ui/target_modifiers/target_cpu_default.rs#explicit_default: [missing] -> pass (J2)
  • [ui (polonius)] tests/ui/target_modifiers/target_cpu_default.rs#explicit_mismatch: [missing] -> pass (J2)
  • [ui (polonius)] tests/ui/target_modifiers/target_cpu_default.rs#implicit_default: [missing] -> pass (J2)
  • [ui (polonius)] tests/ui/target_modifiers/target_cpu_default.rs#implicit_mismatch: [missing] -> pass (J2)
  • [run-make] tests/run-make/requires-consistent-cpu-no-native: [missing] -> pass (J5)
  • [run-make] tests/run-make/target-cpu-as-target-modifier: [missing] -> pass (J5)
  • [run-make] tests/run-make/target-cpu-precedence: [missing] -> pass (J5)

Stage 2

  • [ui] tests/ui/target_modifiers/target_cpu_default.rs#explicit_default: [missing] -> ignore (gcc backend is marked as ignore) (J0)
  • [ui] tests/ui/target_modifiers/target_cpu_default.rs#explicit_mismatch: [missing] -> ignore (gcc backend is marked as ignore) (J0)
  • [ui] tests/ui/target_modifiers/target_cpu_default.rs#implicit_default: [missing] -> ignore (gcc backend is marked as ignore) (J0)
  • [ui] tests/ui/target_modifiers/target_cpu_default.rs#implicit_mismatch: [missing] -> ignore (gcc backend is marked as ignore) (J0)
  • [ui] tests/ui/target_modifiers/target_cpu_default.rs#explicit_default: [missing] -> pass (J3)
  • [ui] tests/ui/target_modifiers/target_cpu_default.rs#explicit_mismatch: [missing] -> pass (J3)
  • [ui] tests/ui/target_modifiers/target_cpu_default.rs#implicit_default: [missing] -> pass (J3)
  • [ui] tests/ui/target_modifiers/target_cpu_default.rs#implicit_mismatch: [missing] -> pass (J3)
  • [run-make] tests/run-make/requires-consistent-cpu-no-native: [missing] -> pass (J4)
  • [run-make] tests/run-make/target-cpu-as-target-modifier: [missing] -> pass (J4)
  • [run-make] tests/run-make/target-cpu-precedence: [missing] -> pass (J4)
  • [ui] tests/ui/consts/extra-const-ub/pointee-type-with-error-issue-159560.rs: [missing] -> pass (J6)

Additionally, 6 doctest diffs were found. These are ignored, as they are noisy.

Job group index

  • J0: x86_64-gnu-gcc
  • J1: x86_64-gnu-llvm-21-3, x86_64-gnu-llvm-22-3, x86_64-gnu-next-trait-solver-polonius
  • J2: x86_64-gnu-next-trait-solver-polonius
  • J3: aarch64-apple, aarch64-apple-macos-26, aarch64-gnu, aarch64-gnu-llvm-21-1, aarch64-msvc-1, arm-android, armhf-gnu, dist-i586-gnu-i586-i686-musl, i686-gnu-1, i686-gnu-nopt-1, i686-msvc-1, optional-x86_64-gnu-parallel-frontend, test-various, x86_64-gnu, x86_64-gnu-debug, x86_64-gnu-llvm-21, x86_64-gnu-llvm-21-2, x86_64-gnu-llvm-22-2, x86_64-gnu-nopt, x86_64-gnu-stable, x86_64-mingw-1, x86_64-msvc-1
  • J4: aarch64-apple, aarch64-apple-macos-26, aarch64-gnu, aarch64-gnu-debug, aarch64-gnu-llvm-21-1, aarch64-msvc-1, arm-android, armhf-gnu, dist-i586-gnu-i586-i686-musl, dist-various-1, i686-gnu-1, i686-gnu-nopt-1, i686-msvc-1, test-various, x86_64-gnu, x86_64-gnu-debug, x86_64-gnu-gcc, x86_64-gnu-llvm-21-2, x86_64-gnu-llvm-22-2, x86_64-gnu-nopt, x86_64-gnu-stable, x86_64-mingw-1, x86_64-msvc-1
  • J5: x86_64-gnu-llvm-21-3, x86_64-gnu-llvm-22-3
  • J6: aarch64-apple, aarch64-apple-macos-26, aarch64-gnu, aarch64-gnu-llvm-21-1, aarch64-msvc-1, arm-android, armhf-gnu, dist-i586-gnu-i586-i686-musl, i686-gnu-1, i686-gnu-nopt-1, i686-msvc-1, optional-x86_64-gnu-parallel-frontend, test-various, x86_64-gnu, x86_64-gnu-debug, x86_64-gnu-gcc, x86_64-gnu-llvm-21, x86_64-gnu-llvm-21-2, x86_64-gnu-llvm-22-2, x86_64-gnu-nopt, x86_64-gnu-stable, x86_64-mingw-1, x86_64-msvc-1
Test dashboard

Run

cargo run --manifest-path src/ci/citool/Cargo.toml -- \
    test-dashboard 730a6b5dce9477b819de0ba79d6e7945e1248e3d --output-dir test-dashboard

And then open test-dashboard/index.html in your browser to see an overview of all executed tests.

Job duration changes

  1. x86_64-gnu-llvm-22-2: 59m 23s -> 1h 37m (+64.7%)
  2. x86_64-gnu-gcc-core-tests: 9m 28s -> 14m 21s (+51.5%)
  3. armhf-gnu: 1h 4m -> 1h 35m (+49.2%)
  4. dist-android: 20m 39s -> 30m 12s (+46.2%)
  5. x86_64-gnu-stable: 1h 46m -> 2h 32m (+42.9%)
  6. x86_64-gnu-llvm-21-1: 38m 31s -> 55m 2s (+42.8%)
  7. dist-x86_64-msvc-alt: 2h 53m -> 1h 41m (-41.8%)
  8. dist-x86_64-illumos: 1h 51m -> 1h 7m (-39.3%)
  9. pr-check-1: 23m 47s -> 33m 6s (+39.2%)
  10. tidy: 1m 59s -> 2m 34s (+29.0%)
How to interpret the job duration changes?

Job durations can vary a lot, based on the actual runner instance
that executed the job, system noise, invalidated caches, etc. The table above is provided
mostly for t-infra members, for simpler debugging of potential CI slow-downs.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (730a6b5): comparison URL.

Overall result: no relevant changes - no action needed

@rustbot label: -perf-regression

Instruction count

This perf run didn't have relevant results for this metric.

Max RSS (memory usage)

This perf run didn't have relevant results for this metric.

Cycles

Results (secondary -2.0%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
- - 0
Regressions ❌
(secondary)
- - 0
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
-2.0% [-2.0%, -2.0%] 1
All ❌✅ (primary) - - 0

Binary size

This perf run didn't have relevant results for this metric.

Bootstrap: 484.26s -> 485.867s (0.33%)
Artifact size: 391.74 MiB -> 391.77 MiB (0.01%)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. A-meta Area: Issues & PRs about the rust-lang/rust repository itself A-run-make Area: port run-make Makefiles to rmake.rs merged-by-bors This PR was explicitly merged by bors. rollup A PR which is a rollup T-bootstrap Relevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap) T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants