Skip to content

Conversation

@ehuss
Copy link
Contributor

@ehuss ehuss commented Sep 17, 2025

This updates the definitions of the extern ABIs to try to make them a little clearer as to what they mean.

This also adds new statements about the equivalence of some ABIs to the "C" ABI.

Fixes #1946.

@ehuss
Copy link
Contributor Author

ehuss commented Sep 17, 2025

@ChrisDenton We rephrased the description of the "system" ABI, and were wondering if you could take a look to see if the new text was accurate and conveyed the right meaning.

@Amanieu or @ChrisDenton We made a few new claims in this edit about the "C" ABI. We were sure who to ask, but were wondering if you knew the answer. In particular it is specifying that:

  • "win64" is the same as the "C" ABI on Windows x86_64 targets
  • "sysv64" is the same as the "C" ABI on non-Windows x86_64 targets
@Amanieu
Copy link
Member

Amanieu commented Sep 17, 2025

Yes, that seems correct to me.

@ChrisDenton
Copy link
Member

ChrisDenton commented Sep 17, 2025

Should probably @workingjubilee and @RalfJung who are knowledgable in this area.

This looks good to me though rust-lang/rust#136946 will need to adjust the the Windows 32-bit documentation to note the varargs peculiarity.

Copy link
Member

@RalfJung RalfJung left a comment

Choose a reason for hiding this comment

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

This sounds right but I don't actually know that much about all these target-specific ABIs.

Not sure how I feel about linking to the Microsoft docs for some of these (even when they are not Microsoft-defined ABIs, or are they?), but I don't know a better place to link to either.


r[items.extern.abi.c]
* `unsafe extern "C"` --- This is the same as `extern fn foo()`; whatever the default your C compiler supports.
* `unsafe extern "C"` --- The "C" ABI attempts to match the default ABI chosen by the dominant C compiler for the target.
Copy link
Member

Choose a reason for hiding this comment

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

"attempts to match" is a bit... weak?^^

* `unsafe extern "system"` --- This is equivalent to `extern "C"` except on Windows x86_32 where it is equivalent to `"stdcall"`.

> [!NOTE]
> As the correct underlying ABI on Windows is target-specific, it's best to use `extern "system"` when attemping to link to the Windows API.
Copy link
Member

Choose a reason for hiding this comment

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

This isn't true for all of the Windows API though, some of it uses "C"...

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Updated, though I think you meant cdecl here?

Copy link
Member

Choose a reason for hiding this comment

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

No I meant "C". "cdecl" is x86-32-only.

r[items.extern.abi.stdcall]
* `unsafe extern "stdcall"` --- The default for the Win32 API on x86_32.
* `unsafe extern "stdcall"` --- The calling convention typically used by the [Win32 API] on x86_32.
Copy link
Member

Choose a reason for hiding this comment

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

Does this correspond to __stdcall or __attribute__((stdcall)) or anything like that on any other compiler?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I believe the answer is "yes". Are you suggesting this should explicitly say that like the entry for fastcall does?

Copy link
Member

Choose a reason for hiding this comment

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

Seems worthwhile, doesn't it?


r[items.extern.abi.cdecl]
* `unsafe extern "cdecl"` --- The default for x86_32 C code.
* `unsafe extern "cdecl"` --- The calling convention typically used with x86_32 C code.
Copy link
Member

Choose a reason for hiding this comment

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

Does this correspond to __scdecl or __attribute__((cdecl)) or anything like that on any other compiler?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I believe the answer here is also "yes" (assuming the s is a typo).

Comment on lines 146 to 165
* `unsafe extern "win64"` --- The Windows x64 ABI.
* Only available on x86_64 targets.
* "win64" is the same as the "C" ABI on Windows x86_64 targets.

> [!NOTE]
> See <https://learn.microsoft.com/en-us/cpp/build/x64-software-conventions> and <https://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention> for more information.
r[items.extern.abi.sysv64]
* `unsafe extern "sysv64"` --- The default for C code on non-Windows x86_64.
* `unsafe extern "sysv64"` --- The System V ABI.
* Only available on x86_64 targets.
Copy link
Member

Choose a reason for hiding this comment

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

Do clang/gcc/MSVC have attributes that correspond to our win64/sysv64?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I believe the answer is "kinda".

AFAIK, Microsoft's __cdecl is the same as our "win64" or "C" (and I believe clang/gcc also do the same).

I believe for "sysv64", the answer is "no" for MSVC, you cannot explicitly specify that on MSVC. It looks like clang and gcc use the attribute sysv_abi.

Are you suggesting that we should be more explicit about these equivalences?

Copy link
Member

Choose a reason for hiding this comment

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

AFAIK, Microsoft's __cdecl is the same as our "win64" or "C"

That's just a consequence of "C" being "win64" for them, right?

Do clang/gcc support explicitly using the win64 ABI somehow? That would be the most direct equivalent.

Are you suggesting that we should be more explicit about these equivalences?

We're very explicit about it in some cases but not others. That seemed odd.

Copy link
Member

Choose a reason for hiding this comment

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

It's truer to say that __cdecl, __fastcall, etc is ignored outside of x86_32. I don't believe MSVC has an explicit calling convention for arm64 or x86_64. It just ignores any calling convention other than __vector_call and thus uses the default. I guess you could claim that one of these ignored calling conventions is the "real" name for the calling convention on x64 or arm64 but I don't think it's particularly useful to do so.

@ehuss
Copy link
Contributor Author

ehuss commented Sep 29, 2025

OK, I pushed up a change that tries to be more consistent with showing the equivalent attributes.

My homework for investigating this:

Primary sources are:

For the translation in rustc to LLVM, there are multiple places to look:

  • AbiMapping -- This is a first canonicalization of ABIs. Most ABIs have a clear translation ("Rust" is "Rust"). Some are erased at this stage (efiapi gets translated to various other ABIs based on the target).
  • llvm::CallConv -- Converts rustc's call convention to LLVM's.
  • LLVM CallingConv.h -- LLVM's definition of the different calling conventions.
  • Clang CallingConv -- How attributes to mapped to a calling convention.
  • Clang ClangCallConvToLLVMCallConv -- Converts clang's calling convention to LLVM.

Generally I tried to make sure that clang translation to LLVM is the same as rustc's.

@ehuss ehuss marked this pull request as ready for review September 29, 2025 20:52
@rustbot rustbot added the S-waiting-on-review Status: The marked PR is awaiting review from a maintainer label Sep 29, 2025
@rustbot

This comment has been minimized.

@ehuss ehuss force-pushed the rewrite-abi-defs branch from 8da6ee3 to d0fce21 Compare October 7, 2025 21:17
@rustbot

This comment has been minimized.

ehuss added 2 commits October 7, 2025 23:57
This updates the definitions of the extern ABIs to try to make them a little clearer as to what they mean. This also adds new statements about the equivalence of some ABIs to the "C" ABI.
@rustbot
Copy link
Collaborator

rustbot commented Oct 7, 2025

This PR was rebased onto a different master 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.

Due to changes we've recently merged discussing the default ABI of an `extern` that doesn't specify one ("C"), the description of "Rust" being the default ABI for functions that followed immediately after this read as a bit odd. Let's revise this to clarify that "Rust" is the default ABI when `extern fn` is not used.
Some Windows API functions have an explicitly defined ABI. We were trying to suggest this with wording that was a bit subtle; let's spell it out explicitly.
For each of the ABIs, we have outbound links to documents with more details. For most of these, we display the URL, since these URLs are short and readable enough that it's probably more informative to just show them as compared to trying to describe the document. However, the URLs are still long enough that they look better as list items, so let's switch to doing it that way.
When using the "C" ABI, do we "match" the default ABI chosen by the dominant C compiler for the target or do we "attempt" to match it? Tough question. There are believed to be some exceptions in current behavior. However, in the Reference, we generally state things in terms of what the consensus is on how they should be and then note the bugs, so let's do that here. We'll just say that we "match" it.
@traviscross traviscross enabled auto-merge October 8, 2025 01:39
@traviscross traviscross added this pull request to the merge queue Oct 8, 2025
Merged via the queue into rust-lang:master with commit 053c511 Oct 8, 2025
5 checks passed
@rustbot rustbot removed the S-waiting-on-review Status: The marked PR is awaiting review from a maintainer label Oct 8, 2025
Zalathar added a commit to Zalathar/rust that referenced this pull request Oct 21, 2025
Update books ## rust-lang/book 68 commits in 1d7c3e6abec2d5a9bfac798b29b7855b95025426..af415fc6c8a6823dfb4595074f27d5a3e9e2fe49 2025-10-20 14:01:39 UTC to 2025-01-21 22:49:39 UTC - Prepare for renaming of rust-lang/rust default branch (rust-lang/book#4534) - Adding Uzbek translated rust-book repository to the list (rust-lang/book#4387) - I have added Bengali Translation of The Book. (rust-lang/book#4476) - Add+ vietnamese language translate (rust-lang/book#4368) - Appendix B and Appendix D from tech review (rust-lang/book#4466) - Chapter 21 from tech review (rust-lang/book#4464) - Chapter 20 from tech review (rust-lang/book#4460) - Chapter 19 from tech review (rust-lang/book#4446) - Chapter 18 from tech review (rust-lang/book#4445) - Chapter 16 from tech review (rust-lang/book#4438) - WIP ch 17 edits after tech review (rust-lang/book#4319) - Chapter 15 from tech review (rust-lang/book#4433) - Chapter 14 from tech review (rust-lang/book#4423) - Chapter 13 from tech review (rust-lang/book#4421) - Chapter 12 from tech review (rust-lang/book#4410) - Chapter 11 from tech review (rust-lang/book#4391) - Chapter 10 from tech review (rust-lang/book#4379) - Chapter 9 from tech review (rust-lang/book#4377) - Chapter 8 from tech review (rust-lang/book#4378) - Chapter 7 from tech review (rust-lang/book#4374) - Chapter 6 from tech review (rust-lang/book#4370) - Chapter 5 from tech review (rust-lang/book#4359) - Chapter 4 from tech review (rust-lang/book#4358) - Chapter 3 from tech review (rust-lang/book#4353) - Ch01+ch02 after tech review (rust-lang/book#4329) - Ch. 21: call out Chrome multiple-connections issue (rust-lang/book#4297) - Ch. 16: refactor 16-6 to using listing component (rust-lang/book#4295) - Ch. 01: Show how to work offline (rust-lang/book#4294) - Ch. 07: Clarify sentences about `pub use` (rust-lang/book#4293) - Ch. 02: Consistent ordering of `use` statements (rust-lang/book#4292) - Anchors on listings (rust-lang/book#4271) - Ch. 17: another tweak to how we phrase things about sections (rust-lang/book#4288) - Ch. 20: correct listing number (rust-lang/book#4287) - Ch. 10.3: clarify language detail (rust-lang/book#4284) - Ch. 17: minor typos and link reference (rust-lang/book#4286) - Ch. 9: correctly demonstrate privacy with module (rust-lang/book#4282) - Ch. 18: correct discussion of delegation in `Post` methods (rust-lang/book#4281) - Ch. 20: tell folks to see the Reference for more ABI info (rust-lang/book#4165) - Ch 10.1 minor clarifications (rust-lang/book#4256) - Clarified the misunderstanding b/w crates, module, items (rust-lang/book#4232) - Ferris: always show, even when it’s small (rust-lang/book#4280) - Ch. 17: mention `use std::pin::{Pin, pin};` on introduction (rust-lang/book#4279) - Persist printing error, NOT ErrorKind (rust-lang/book#4259) - Typo: "2" should be "2 seconds" (rust-lang/book#4263) - Ch. 17: fix tiny example consistency issue (rust-lang/book#4270) - Bump ring from 0.17.8 to 0.17.13 in /listings/ch17-async-await/listing-17-02 (rust-lang/book#4261) - Bump ring from 0.17.8 to 0.17.14 in /packages/trpl (rust-lang/book#4273) - 2024 Print Edition: updates to Word docs and more fixes to Markdown text (rust-lang/book#4272) - Ch. 10: Make social media discussion generic. (rust-lang/book#4249) - Another Ch. 17 -> 18 fix (rust-lang/book#4247) - Ch. 05: further tweak to wording about `user1` availability (rust-lang/book#4246) - Ch. 02: Fix rand version mistake (from testing) (rust-lang/book#4245) - Ch. 19: Correct the discussion of `fn` type and closures (rust-lang/book#4244) - Edition maintenance: scripting the updates for future work (rust-lang/book#4243) - Ch. 17: fresh-eyes edits (rust-lang/book#4242) - Ch. 17: drop lifetime not required in 2024 Edition (rust-lang/book#4212) - Appendix B, Operators: Replace “member access” with “field access” and “method call”. (rust-lang/book#4240) - Update to Rust 1.85 and 2024 Edition! (rust-lang/book#4241) - Chapter 1: fix 'four things' now that spacing is not emphasized (rust-lang/book#4239) - Fix typos in chapter 17 (rust-lang/book#4238) - NoStarch backports (rust-lang/book#4224) - Fix example for `cargo fix` (rust-lang/book#4226) - Add missing word in ch17-04-streams.md (rust-lang/book#4218) - Fix typo in ch5.3 and in CONTRIBUTING.md (rust-lang/book#4216) - chore: reformat src with dprint (rust-lang/book#4211) - Redirects: get rid of the weird gap in Ch. 20 sections! (rust-lang/book#4209) - Document that `use` is also for `precise capturing` (rust-lang/book#4210) - Ch. 17: NoStarch Edits! (rust-lang/book#4206) ## rust-lang/nomicon 1 commits in 23fc2682f8fcb887f77d0eaabba708809f834c11..60f0b30d8ec1c9eb5c2582f2ec55f1094b0f8c42 2025-10-20 13:05:39 UTC to 2025-10-20 13:05:39 UTC - Fix typo in exception-safety.md (BinaryHeap::sift_up, user-defined and unsafe code separated) (rust-lang/nomicon#504) ## rust-lang/reference 11 commits in 8efb9805686722dba511b7b27281bb6b77d32130..752eab01cebdd6a2d90b53087298844c251859a1 2025-10-16 04:31:58 UTC to 2025-10-06 22:38:53 UTC - Clarify struct pattern binding shorthand (rust-lang/reference#2054) - Follow edition formatting for keywords (rust-lang/reference#2050) - generalise paragraph (rust-lang/reference#2047) - Rework the definitions of the extern ABIs (rust-lang/reference#2003) - Fix grammar of `ConstParam` (rust-lang/reference#2036) - Add a note to patterns.ident.precedent (rust-lang/reference#2022) - Add a description of how the reference is published (rust-lang/reference#2028) - Rearrange the README a little (rust-lang/reference#2029) - Consistently use sentence case (rust-lang/reference#2030) - More clearly define the default abi of an extern block (rust-lang/reference#2001) - fix(css): Correctly specify grammar-literal-bg (rust-lang/reference#2032)
rust-timer added a commit to rust-lang/rust that referenced this pull request Oct 21, 2025
Rollup merge of #147916 - rustbot:docs-update, r=ehuss Update books ## rust-lang/book 68 commits in 1d7c3e6abec2d5a9bfac798b29b7855b95025426..af415fc6c8a6823dfb4595074f27d5a3e9e2fe49 2025-10-20 14:01:39 UTC to 2025-01-21 22:49:39 UTC - Prepare for renaming of rust-lang/rust default branch (rust-lang/book#4534) - Adding Uzbek translated rust-book repository to the list (rust-lang/book#4387) - I have added Bengali Translation of The Book. (rust-lang/book#4476) - Add+ vietnamese language translate (rust-lang/book#4368) - Appendix B and Appendix D from tech review (rust-lang/book#4466) - Chapter 21 from tech review (rust-lang/book#4464) - Chapter 20 from tech review (rust-lang/book#4460) - Chapter 19 from tech review (rust-lang/book#4446) - Chapter 18 from tech review (rust-lang/book#4445) - Chapter 16 from tech review (rust-lang/book#4438) - WIP ch 17 edits after tech review (rust-lang/book#4319) - Chapter 15 from tech review (rust-lang/book#4433) - Chapter 14 from tech review (rust-lang/book#4423) - Chapter 13 from tech review (rust-lang/book#4421) - Chapter 12 from tech review (rust-lang/book#4410) - Chapter 11 from tech review (rust-lang/book#4391) - Chapter 10 from tech review (rust-lang/book#4379) - Chapter 9 from tech review (rust-lang/book#4377) - Chapter 8 from tech review (rust-lang/book#4378) - Chapter 7 from tech review (rust-lang/book#4374) - Chapter 6 from tech review (rust-lang/book#4370) - Chapter 5 from tech review (rust-lang/book#4359) - Chapter 4 from tech review (rust-lang/book#4358) - Chapter 3 from tech review (rust-lang/book#4353) - Ch01+ch02 after tech review (rust-lang/book#4329) - Ch. 21: call out Chrome multiple-connections issue (rust-lang/book#4297) - Ch. 16: refactor 16-6 to using listing component (rust-lang/book#4295) - Ch. 01: Show how to work offline (rust-lang/book#4294) - Ch. 07: Clarify sentences about `pub use` (rust-lang/book#4293) - Ch. 02: Consistent ordering of `use` statements (rust-lang/book#4292) - Anchors on listings (rust-lang/book#4271) - Ch. 17: another tweak to how we phrase things about sections (rust-lang/book#4288) - Ch. 20: correct listing number (rust-lang/book#4287) - Ch. 10.3: clarify language detail (rust-lang/book#4284) - Ch. 17: minor typos and link reference (rust-lang/book#4286) - Ch. 9: correctly demonstrate privacy with module (rust-lang/book#4282) - Ch. 18: correct discussion of delegation in `Post` methods (rust-lang/book#4281) - Ch. 20: tell folks to see the Reference for more ABI info (rust-lang/book#4165) - Ch 10.1 minor clarifications (rust-lang/book#4256) - Clarified the misunderstanding b/w crates, module, items (rust-lang/book#4232) - Ferris: always show, even when it’s small (rust-lang/book#4280) - Ch. 17: mention `use std::pin::{Pin, pin};` on introduction (rust-lang/book#4279) - Persist printing error, NOT ErrorKind (rust-lang/book#4259) - Typo: "2" should be "2 seconds" (rust-lang/book#4263) - Ch. 17: fix tiny example consistency issue (rust-lang/book#4270) - Bump ring from 0.17.8 to 0.17.13 in /listings/ch17-async-await/listing-17-02 (rust-lang/book#4261) - Bump ring from 0.17.8 to 0.17.14 in /packages/trpl (rust-lang/book#4273) - 2024 Print Edition: updates to Word docs and more fixes to Markdown text (rust-lang/book#4272) - Ch. 10: Make social media discussion generic. (rust-lang/book#4249) - Another Ch. 17 -> 18 fix (rust-lang/book#4247) - Ch. 05: further tweak to wording about `user1` availability (rust-lang/book#4246) - Ch. 02: Fix rand version mistake (from testing) (rust-lang/book#4245) - Ch. 19: Correct the discussion of `fn` type and closures (rust-lang/book#4244) - Edition maintenance: scripting the updates for future work (rust-lang/book#4243) - Ch. 17: fresh-eyes edits (rust-lang/book#4242) - Ch. 17: drop lifetime not required in 2024 Edition (rust-lang/book#4212) - Appendix B, Operators: Replace “member access” with “field access” and “method call”. (rust-lang/book#4240) - Update to Rust 1.85 and 2024 Edition! (rust-lang/book#4241) - Chapter 1: fix 'four things' now that spacing is not emphasized (rust-lang/book#4239) - Fix typos in chapter 17 (rust-lang/book#4238) - NoStarch backports (rust-lang/book#4224) - Fix example for `cargo fix` (rust-lang/book#4226) - Add missing word in ch17-04-streams.md (rust-lang/book#4218) - Fix typo in ch5.3 and in CONTRIBUTING.md (rust-lang/book#4216) - chore: reformat src with dprint (rust-lang/book#4211) - Redirects: get rid of the weird gap in Ch. 20 sections! (rust-lang/book#4209) - Document that `use` is also for `precise capturing` (rust-lang/book#4210) - Ch. 17: NoStarch Edits! (rust-lang/book#4206) ## rust-lang/nomicon 1 commits in 23fc2682f8fcb887f77d0eaabba708809f834c11..60f0b30d8ec1c9eb5c2582f2ec55f1094b0f8c42 2025-10-20 13:05:39 UTC to 2025-10-20 13:05:39 UTC - Fix typo in exception-safety.md (BinaryHeap::sift_up, user-defined and unsafe code separated) (rust-lang/nomicon#504) ## rust-lang/reference 11 commits in 8efb9805686722dba511b7b27281bb6b77d32130..752eab01cebdd6a2d90b53087298844c251859a1 2025-10-16 04:31:58 UTC to 2025-10-06 22:38:53 UTC - Clarify struct pattern binding shorthand (rust-lang/reference#2054) - Follow edition formatting for keywords (rust-lang/reference#2050) - generalise paragraph (rust-lang/reference#2047) - Rework the definitions of the extern ABIs (rust-lang/reference#2003) - Fix grammar of `ConstParam` (rust-lang/reference#2036) - Add a note to patterns.ident.precedent (rust-lang/reference#2022) - Add a description of how the reference is published (rust-lang/reference#2028) - Rearrange the README a little (rust-lang/reference#2029) - Consistently use sentence case (rust-lang/reference#2030) - More clearly define the default abi of an extern block (rust-lang/reference#2001) - fix(css): Correctly specify grammar-literal-bg (rust-lang/reference#2032)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

6 participants