Double-word align _Unwind_Exception - #161368
Open
hsanzg wants to merge 1 commit into
Open
Conversation
Collaborator
|
Thanks for the pull request, and welcome! The Rust Project has assigned @jieyouxu (or someone else) to review your changes, you should hear from them (or someone else) within the next two weeks. Please see the contribution instructions for more information. Why was this reviewer chosen?The reviewer was selected based on:
|
Member
|
r? libs |
tgross35
reviewed
Aug 20, 2026
Comment on lines
44
to
52
| #[repr(C)] | ||
| #[cfg_attr(target_pointer_width = "16", repr(align(4)))] | ||
| #[cfg_attr(target_pointer_width = "32", repr(align(8)))] | ||
| #[cfg_attr(target_pointer_width = "64", repr(align(16)))] | ||
| pub struct _Unwind_Exception { | ||
| pub exception_class: _Unwind_Exception_Class, | ||
| pub exception_cleanup: _Unwind_Exception_Cleanup_Fn, | ||
| pub private: [_Unwind_Word; unwinder_private_data_size], | ||
| } |
Member
There was a problem hiding this comment.
Could you add a comment similar to what's in LLVM? Otherwise LGTM.
Member
|
Cc @bjorn3 since this is your area of expertise |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The Itanium C++ ABI spec states that the
_Unwind_Exceptiontype must be double-word aligned (see Section 1.2). The missing alignment option does not seem to cause problems when a) using Rust's panic mechanism (because the exception object passed to_Unwind_RaiseExceptionis heap-allocated and thus double-word aligned by accident---although this is not guaranteed) or b) when linking against libgcc's unwinder.Most people don't need to unwind stacks themselves, so case (a) usually applies; and case (b) is the default for the
amd64-unknown-linux-gnutarget. Thus, misalignments seem unlikely to cause trouble in practice. However, I recently copied over some of the type definitions inlibrary/unwindinto a personal project, builtrustcwithrust.llvm-libunwind = "system", and installed LLVM'slibunwind-24-dev. Calling_Unwind_RaiseExceptionwith a thread-local_Unwind_Exceptionobject led to a segfault due to the too-small default alignment. Solibunwindseems to depend on the double-word alignment.N.B.: Both
libunwindandlibgcchave comments [1, 2] saying that the "double-word" alignment is a bit ambiguous when interpreted in a target-agnostic sense, and they both add__attribute__((__aligned__))to_Unwind_Exception, with no specific alignment value (the default is the maximum alignment of any integer type). Rust doesn't have such a "default" alignment, so I interpreted "double-word" in a target-dependent manner viacfg_attr+ thetarget_pointer_widthfeature.[1]: https://github.com/llvm/llvm-project/blob/196786fa5fe4225539678fc7904a383eca05374e/libunwind/include/unwind_itanium.h#L41
[2]: https://github.com/gcc-mirror/gcc/blob/50a2eb56b9a350ecced4db4942e92d463dab8d8f/libgcc/unwind-generic.h#L106