Skip to content

Conversation

@GuillaumeGomez
Copy link
Member

cc @antoyo

r? ghost

bjorn3 and others added 30 commits August 24, 2025 11:20
As opposed to passing it around through Result.
…lsewhere A lot of places had special handling just in case they would get an allocator module even though most of these places could never get one or would have a trivial implementation for the allocator module. Moving all handling of the allocator module to a single place simplifies things a fair bit.
Signed-off-by: dvermd <315743+dvermd@users.noreply.github.com>
It is always false nowadays. ThinLTO summary writing is instead done by llvm_optimize.
Signed-off-by: dvermd <315743+dvermd@users.noreply.github.com>
Misc LTO cleanups Follow up to rust-lang#145955. * Remove want_summary argument from `prepare_thin`. Since rust-lang#133250 ThinLTO summary writing is instead done by `llvm_optimize`. * Two minor cleanups
We need a different attribute than `rustc_align` because unstable attributes are tied to their feature (we can't have two unstable features use the same unstable attribute). Otherwise this uses all of the same infrastructure as `#[rustc_align]`.
…lmann,ralfjung,traviscross Implement `#[rustc_align_static(N)]` on `static`s Tracking issue: rust-lang#146177 ```rust #![feature(static_align)] #[rustc_align_static(64)] static SO_ALIGNED: u64 = 0; ``` We need a different attribute than `rustc_align` because unstable attributes are tied to their feature (we can't have two unstable features use the same unstable attribute). Otherwise this uses all of the same infrastructure as `#[rustc_align]`. r? `@traviscross`
…ethercote Add panic=immediate-abort MCP: rust-lang/compiler-team#909 This adds a new panic strategy, `-Cpanic=immediate-abort`. This panic strategy essentially just codifies use of `-Zbuild-std-features=panic_immediate_abort`. This PR is intended to just set up infrastructure, and while it will change how the compiler is invoked for users of the feature, there should be no other impacts. In many parts of the compiler, `PanicStrategy::ImmediateAbort` behaves just like `PanicStrategy::Abort`, because actually most parts of the compiler just mean to ask "can this unwind?" so I've added a helper function so we can say `sess.panic_strategy().unwinds()`. The panic and unwind strategies have some level of compatibility, which mostly means that we can pre-compile the sysroot with unwinding panics then the sysroot can be linked with aborting panics later. The immediate-abort strategy is all-or-nothing, enforced by `compiler/rustc_metadata/src/dependency_format.rs` and this is tested for in `tests/ui/panic-runtime/`. We could _technically_ be more compatible with the other panic strategies, but immediately-aborting panics primarily exist for users who want to eliminate all the code size responsible for the panic runtime. I'm open to other use cases if people want to present them, but not right now. This PR is already large. `-Cpanic=immediate-abort` sets both `cfg(panic = "immediate-abort")` _and_ `cfg(panic = "abort")`. bjorn3 pointed out that people may be checking for the abort cfg to ask if panics will unwind, and also the sysroot feature this is replacing used to require `-Cpanic=abort` so this seems like a good back-compat step. At least for the moment. Unclear if this is a good idea indefinitely. I can imagine this being confusing. The changes to the standard library attributes are purely mechanical. Apart from that, I removed an `unsafe` we haven't needed for a while since the `abort` intrinsic became safe, and I've added a helpful diagnostic for people trying to use the old feature. To test that `-Cpanic=immediate-abort` conflicts with other panic strategies, I've beefed up the core-stubs infrastructure a bit. There is now a separate attribute to set flags on it. I've added a test that this produces the desired codegen, called `tests/run-make-cargo/panic-immediate-abort-codegen/` and also a separate run-make-cargo test that checks that we can build a binary.
…monomorphization Unify zero-length and oversized SIMD errors
…, r=lcnr,RalfJung Add an attribute to check the number of lanes in a SIMD vector after monomorphization Allows std::simd to drop the `LaneCount<N>: SupportedLaneCount` trait and maintain good error messages. Also, extends rust-lang#145967 by including spans in layout errors for all ADTs. r? ``@RalfJung`` cc ``@workingjubilee`` ``@programmerjake``
TypeTree support in autodiff # TypeTrees for Autodiff ## What are TypeTrees? Memory layout descriptors for Enzyme. Tell Enzyme exactly how types are structured in memory so it can compute derivatives efficiently. ## Structure ```rust TypeTree(Vec<Type>) Type { offset: isize, // byte offset (-1 = everywhere) size: usize, // size in bytes kind: Kind, // Float, Integer, Pointer, etc. child: TypeTree // nested structure } ``` ## Example: `fn compute(x: &f32, data: &[f32]) -> f32` **Input 0: `x: &f32`** ```rust TypeTree(vec![Type { offset: -1, size: 8, kind: Pointer, child: TypeTree(vec![Type { offset: -1, size: 4, kind: Float, child: TypeTree::new() }]) }]) ``` **Input 1: `data: &[f32]`** ```rust TypeTree(vec![Type { offset: -1, size: 8, kind: Pointer, child: TypeTree(vec![Type { offset: -1, size: 4, kind: Float, // -1 = all elements child: TypeTree::new() }]) }]) ``` **Output: `f32`** ```rust TypeTree(vec![Type { offset: -1, size: 4, kind: Float, child: TypeTree::new() }]) ``` ## Why Needed? - Enzyme can't deduce complex type layouts from LLVM IR - Prevents slow memory pattern analysis - Enables correct derivative computation for nested structures - Tells Enzyme which bytes are differentiable vs metadata ## What Enzyme Does With This Information: Without TypeTrees (current state): ```llvm ; Enzyme sees generic LLVM IR: define float ``@distance(ptr*`` %p1, ptr* %p2) { ; Has to guess what these pointers point to ; Slow analysis of all memory operations ; May miss optimization opportunities } ``` With TypeTrees (our implementation): ```llvm define "enzyme_type"="{[]:Float@float}" float ``@distance(`` ptr "enzyme_type"="{[]:Pointer}" %p1, ptr "enzyme_type"="{[]:Pointer}" %p2 ) { ; Enzyme knows exact type layout ; Can generate efficient derivative code directly } ``` # TypeTrees - Offset and -1 Explained ## Type Structure ```rust Type { offset: isize, // WHERE this type starts size: usize, // HOW BIG this type is kind: Kind, // WHAT KIND of data (Float, Int, Pointer) child: TypeTree // WHAT'S INSIDE (for pointers/containers) } ``` ## Offset Values ### Regular Offset (0, 4, 8, etc.) **Specific byte position within a structure** ```rust struct Point { x: f32, // offset 0, size 4 y: f32, // offset 4, size 4 id: i32, // offset 8, size 4 } ``` TypeTree for `&Point` (internal representation): ```rust TypeTree(vec![ Type { offset: 0, size: 4, kind: Float }, // x at byte 0 Type { offset: 4, size: 4, kind: Float }, // y at byte 4 Type { offset: 8, size: 4, kind: Integer } // id at byte 8 ]) ``` Generates LLVM: ```llvm "enzyme_type"="{[]:Float@float}" ``` ### Offset -1 (Special: "Everywhere") **Means "this pattern repeats for ALL elements"** #### Example 1: Array `[f32; 100]` ```rust TypeTree(vec![Type { offset: -1, // ALL positions size: 4, // each f32 is 4 bytes kind: Float, // every element is float }]) ``` Instead of listing 100 separate Types with offsets `0,4,8,12...396` #### Example 2: Slice `&[i32]` ```rust // Pointer to slice data TypeTree(vec![Type { offset: -1, size: 8, kind: Pointer, child: TypeTree(vec![Type { offset: -1, // ALL slice elements size: 4, // each i32 is 4 bytes kind: Integer }]) }]) ``` #### Example 3: Mixed Structure ```rust struct Container { header: i64, // offset 0 data: [f32; 1000], // offset 8, but elements use -1 } ``` ```rust TypeTree(vec![ Type { offset: 0, size: 8, kind: Integer }, // header Type { offset: 8, size: 4000, kind: Pointer, child: TypeTree(vec![Type { offset: -1, size: 4, kind: Float // ALL array elements }]) } ]) ```
@rustbot
Copy link
Collaborator

rustbot commented Nov 4, 2025

Some changes occurred in compiler/rustc_codegen_gcc

cc @antoyo, @GuillaumeGomez

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Nov 4, 2025
@rustbot

This comment has been minimized.

@rustbot rustbot added has-merge-commits PR has merge commits, merge with caution. S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Nov 4, 2025
@GuillaumeGomez
Copy link
Member Author

@bors r+ p=1

@bors
Copy link
Collaborator

bors commented Nov 4, 2025

📌 Commit ca3e2ea has been approved by GuillaumeGomez

It is now in the queue for this repository.

@bors
Copy link
Collaborator

bors commented Nov 4, 2025

🌲 The tree is currently closed for pull requests below priority 100. This pull request will be tested once the tree is reopened.

@bors bors 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. S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Nov 4, 2025
@rust-log-analyzer

This comment has been minimized.

@GuillaumeGomez
Copy link
Member Author

@bors r-

@bors bors added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. labels Nov 4, 2025
@rustbot
Copy link
Collaborator

rustbot commented Nov 4, 2025

⚠️ Warning ⚠️

@rust-log-analyzer
Copy link
Collaborator

The job x86_64-gnu-gcc failed! Check out the build log: (web) (plain enhanced) (plain)

Click to see the possible cause of the failure (guessed by this bot)
 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 2208k 100 2208k 0 0 4540k 0 --:--:-- --:--:-- --:--:-- 4544k gettext-0.22.tar.gz: OK gmp-6.3.0.tar.bz2: FAILED sha512sum: WARNING: 1 computed checksum did NOT match error: Cannot verify integrity of possibly corrupted file gmp-6.3.0.tar.bz2 Command `/checkout/obj/build/x86_64-unknown-linux-gnu/gcc/src/contrib/download_prerequisites [workdir=/checkout/obj/build/x86_64-unknown-linux-gnu/gcc/src]` failed with exit code 1 Created at: src/bootstrap/src/core/build_steps/gcc.rs:253:5 Executed at: src/bootstrap/src/core/build_steps/gcc.rs:253:83 Command has failed. Rerun with -v to see more details. Bootstrap failed while executing `--stage 2 test tests --test-codegen-backend gcc --skip tests/coverage --skip tests/coverage-run-rustdoc --skip tests/rustdoc --skip tests/rustdoc-gui --skip tests/rustdoc-js --skip tests/rustdoc-js-std --skip tests/rustdoc-json --skip tests/rustdoc-ui --set rust.codegen-backends=["llvm","gcc"]` Build completed unsuccessfully in 0:01:53 local time: Tue Nov 4 15:34:07 UTC 2025 network time: Tue, 04 Nov 2025 15:34:07 GMT **************************************************************************** 

For more information how to resolve CI failures of this job, visit this link.

@GuillaumeGomez
Copy link
Member Author

I think you're the one who wrote this @Kobzol? Any idea what we need to update here?

@Kobzol
Copy link
Member

Kobzol commented Nov 4, 2025

I'm not sure why did the hashes changes. We seem to mirror these files from our infra now, but the files should be the same? In any case, the hashes need to be updated in https://github.com/rust-lang/gcc/blob/master/contrib/prerequisites.md5 and https://github.com/rust-lang/gcc/blob/master/contrib/prerequisites.sha512.

@antoyo
Copy link
Contributor

antoyo commented Nov 6, 2025

I'm not sure why did the hashes changes. We seem to mirror these files from our infra now, but the files should be the same? In any case, the hashes need to be updated in https://github.com/rust-lang/gcc/blob/master/contrib/prerequisites.md5 and https://github.com/rust-lang/gcc/blob/master/contrib/prerequisites.sha512.

Perhaps we need to update our GCC fork?
Do you mirror the files corresponding to our GCC fork or upstream GCC?

@Kobzol
Copy link
Member

Kobzol commented Nov 6, 2025

Everything should happen through the fork.

@antoyo
Copy link
Contributor

antoyo commented Nov 6, 2025

When I run the script locally, I get:

2025-11-06 11:29:37 URL:https://ci-mirrors.rust-lang.org/rustc/gcc/gettext-0.22.tar.gz [26105696/26105696] -> "gettext-0.22.tar.gz" [1] https://ci-mirrors.rust-lang.org/rustc/gcc/gmp-6.3.0.tar.bz2: 2025-11-06 11:29:38 ERROR 404: Not Found. error: Cannot download gmp-6.3.0.tar.bz2 from https://ci-mirrors.rust-lang.org/rustc/gcc/ 

Does it work for anyone else?

@GuillaumeGomez
Copy link
Member Author

The link works for me.

@antoyo
Copy link
Contributor

antoyo commented Nov 6, 2025

The gettext link works for me, but not the gmp one.

@GuillaumeGomez
Copy link
Member Author

Sorry, the gettext link works, but not the gmp one.

@antoyo
Copy link
Contributor

antoyo commented Nov 6, 2025

So it looks like the actual problem is that gmp is not in the mirrors.

@Kobzol
Copy link
Member

Kobzol commented Nov 6, 2025

Seems like gmp was updated in the meantime, we have 6.2.1 in the mirrors (https://github.com/rust-lang/ci-mirrors/blob/15a6d341341e858c2b7be872a47a39f546cc6759/files/rustc/misc.toml#L93). Could you please send a PR to the ci-mirrors repo with the new version?

Add e.g. a file files/rustc/gcc.toml with the following contents:

[[files]] name = "rustc/gcc/gmp-6.3.0.tar.bz2" source = "<source-url>" sha256 = "<hash>" license = "GNU General Public License"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

has-merge-commits PR has merge commits, merge with caution. S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.