Skip to content

Conversation

@beetrees
Copy link
Contributor

@beetrees beetrees commented Jun 18, 2025

Fixes the 64-bit SPARC part of #115609 by replacing the current implementation with a new implementation modelled on the RISC-V calling convention code (SPARC ABI reference).

Pinging sparcv9-sun-solaris target maintainers: @psumbera @kulikjak
Fixes #115336
Fixes #115399
Fixes #122620
Fixes #147883
r? @workingjubilee

@rustbot
Copy link
Collaborator

rustbot commented Jun 18, 2025

workingjubilee is currently at their maximum review capacity.
They may take a while to respond.

@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 Jun 18, 2025
@beetrees
Copy link
Contributor Author

r? @bjorn3

@rustbot rustbot assigned bjorn3 and unassigned workingjubilee Jun 18, 2025
@beetrees
Copy link
Contributor Author

beetrees commented Jun 18, 2025

Note that there are currently two places that Clang and GCC disagree AFAIK:

  • Clang fails to correctly align 16-byte structs when passing them as arguments, whereas GCC correctly aligns them. As the specification states that the structs must be aligned, I've filed an Clang bug at Clang: 64-bit SPARC doesn't align struct arguments as required by ABI llvm/llvm-project#144709.
  • Clang passes floating point fields in packed structs in floating point register if the field is aligned within the argument as a whole, whereas GCC always passes packed structs in integer registers. The specification doesn't consider the existence of packed structs, however in my opinion Clang's interpretation seems more correct so that's what I've implemented in this PR. Issues for Rust, Clang and GCC.

@psumbera
Copy link
Contributor

Thank you for doing this! My knowledge in this area is rather limited.

I was able to build latest Rust sources with your fix on top on Solaris 11.4 SPARC. Then I used this version to build Firefox on Solaris. There was no problem. Firefox also worked as expected.

I also tested some problematic cases which I was handling few years ago (https://github.com/psumbera/rust-sparc64-abi-tests). All seemed to be ok.

@bjorn3
Copy link
Member

bjorn3 commented Jul 3, 2025

I don't have time to properly review this right now.

r? compiler

@rustbot rustbot assigned WaffleLapkin and unassigned bjorn3 Jul 3, 2025
@workingjubilee workingjubilee self-assigned this Jul 4, 2025
@bors
Copy link
Collaborator

bors commented Jul 6, 2025

☔ The latest upstream changes (presumably #143521) made this pull request unmergeable. Please resolve the merge conflicts.

@beetrees beetrees force-pushed the sparc64-float-struct-abi branch from 4eb3ce5 to 9e4a7bc Compare July 6, 2025 14:45
@beetrees
Copy link
Contributor Author

beetrees commented Jul 6, 2025

Rebased

@WaffleLapkin WaffleLapkin removed their assignment Jul 8, 2025
@bors
Copy link
Collaborator

bors commented Jul 22, 2025

☔ The latest upstream changes (presumably #144249) made this pull request unmergeable. Please resolve the merge conflicts.

@beetrees beetrees force-pushed the sparc64-float-struct-abi branch from 9e4a7bc to b7b3ed7 Compare July 27, 2025 08:50
@wesleywiser
Copy link
Member

Hi @workingjubilee, are you still interested in reviewing this? If not, we can reroll for a different reviewer. Thanks!

@tgross35
Copy link
Contributor

tgross35 commented Sep 5, 2025

Looks like there is a Clang fix in llvm/llvm-project#155829

@workingjubilee
Copy link
Member

Sorry about that, currently in catchup mode so I am going to delegate, yes.

r? @tgross35

@rustbot rustbot assigned tgross35 and unassigned workingjubilee Sep 10, 2025
@beetrees beetrees force-pushed the sparc64-float-struct-abi branch from b7b3ed7 to 7cba46f Compare September 10, 2025 19:41
@rustbot

This comment has been minimized.

@beetrees beetrees force-pushed the sparc64-float-struct-abi branch from 7cba46f to b2e4ee9 Compare September 10, 2025 19:51
@rustbot

This comment has been minimized.

@folkertdev
Copy link
Contributor

In @beetrees's absence, @tgross35 and I decided that we should move forward here to remove a blocker for f128, so I'll rebase and add some comments and this should be good to go.

@folkertdev folkertdev force-pushed the sparc64-float-struct-abi branch from b2e4ee9 to 7df3c25 Compare January 31, 2026 13:05
@rustbot

This comment has been minimized.

Comment on lines 184 to 198
let cast_target = match regs {
[Some(reg), None, ..] => CastTarget::from(reg),
_ => CastTarget::prefixed(regs, Uniform::new(Reg::i8(), Size::ZERO)),
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely sure why the special-casing is, but the first case fits in a register no problem, while the second case requires some sort of larger struct that is cast.

@rust-log-analyzer

This comment has been minimized.

@folkertdev folkertdev force-pushed the sparc64-float-struct-abi branch from 7df3c25 to 7515aca Compare January 31, 2026 14:41
@folkertdev
Copy link
Contributor

@rustbot ready

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Feb 2, 2026
Copy link
Contributor

@tgross35 tgross35 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two nits but LGTM, thanks for picking this up. Two comment requests below.

I believe you should technically make yourself the commit author since you're the one submitting it in its final form. Then add beetrees back via a Co-authored-by: trailer.

View changes since this review


arg.cast_to(Uniform::new(Reg::i64(), total));
let cast_target = match regs {
[Some(reg), None, ..] => CastTarget::from(reg),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional nit, sanity check

        [Some(reg), None, rest @ ..] => {
            debug_assert!(rest.iter().all(|x| x.is_none());
            CastTarget::from(reg)
        }

Comment on lines 209 to 217
// sparc64-unknown-linux-{gnu,musl,uclibc} doesn't ignore ZSTs.
let passes_zsts = match cx.target_spec().os {
Os::Linux => matches!(cx.target_spec().env, Env::Gnu | Env::Musl | Env::Uclibc),
_ => false,
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What makes this env-dependent? The only supported Linux env seems to be gnu at this time.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have

sparc64-unknown-linux-gnu
sparc64-unknown-netbsd
sparc64-unknown-openbsd
sparcv9-sun-solaris

so this only matches in if the os is linux, and it's a bit more general so that if a new target (e.g. musl) is added, it does the right thing from the start. There could, I suppose, be a linux env that does ignore ZSTs.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why would it ever be coupled to the env though? I see that this exists across other arches but it seems a bit bogus.

Doing some archaeology, the pattern kind of follows:

The env had to be specified on Windows and it seems like others followed suit. I think this can just be deleted here, probably the same in the other places, under the assumption that we're not likely to get a nightmare env that breaks from the psABI (at least not on Linux).

@tgross35
Copy link
Contributor

@rustbot author

@rustbot rustbot 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-review Status: Awaiting review from the assignee but also interested parties. labels Feb 10, 2026
@folkertdev folkertdev force-pushed the sparc64-float-struct-abi branch from 7515aca to 9129b31 Compare February 10, 2026 10:39
@rustbot
Copy link
Collaborator

rustbot commented Feb 10, 2026

This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed.

Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers.

@folkertdev folkertdev force-pushed the sparc64-float-struct-abi branch from 9129b31 to 4373d2f Compare February 10, 2026 11:17
Copy link
Contributor

@tgross35 tgross35 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-log-analyzer

This comment has been minimized.

@folkertdev folkertdev force-pushed the sparc64-float-struct-abi branch from 4373d2f to 8ebba60 Compare February 10, 2026 11:30
@rust-log-analyzer

This comment has been minimized.

Co-authored-by: beetrees <b@beetr.ee>
@folkertdev folkertdev force-pushed the sparc64-float-struct-abi branch from 8ebba60 to c9b5c93 Compare February 10, 2026 11:40
@folkertdev
Copy link
Contributor

@bors r=tgross35

@rust-bors
Copy link
Contributor

rust-bors bot commented Feb 10, 2026

📌 Commit c9b5c93 has been approved by tgross35

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-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Feb 10, 2026
Zalathar added a commit to Zalathar/rust that referenced this pull request Feb 11, 2026
… r=tgross35

Fix passing/returning structs with the 64-bit SPARC ABI

Fixes the 64-bit SPARC part of rust-lang#115609 by replacing the current implementation with a new implementation modelled on the RISC-V calling convention code ([SPARC ABI reference](https://sparc.org/wp-content/uploads/2014/01/SCD.2.4.1.pdf.gz)).

Pinging `sparcv9-sun-solaris` target maintainers: @psumbera @kulikjak
Fixes rust-lang#115336
Fixes rust-lang#115399
Fixes rust-lang#122620
Fixes rust-lang#147883
r? @workingjubilee
Zalathar added a commit to Zalathar/rust that referenced this pull request Feb 11, 2026
… r=tgross35

Fix passing/returning structs with the 64-bit SPARC ABI

Fixes the 64-bit SPARC part of rust-lang#115609 by replacing the current implementation with a new implementation modelled on the RISC-V calling convention code ([SPARC ABI reference](https://sparc.org/wp-content/uploads/2014/01/SCD.2.4.1.pdf.gz)).

Pinging `sparcv9-sun-solaris` target maintainers: @psumbera @kulikjak
Fixes rust-lang#115336
Fixes rust-lang#115399
Fixes rust-lang#122620
Fixes rust-lang#147883
r? @workingjubilee
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet