Author: ericwf Date: Wed Jul 20 18:56:42 2016 New Revision: 276215 URL: http://llvm.org/viewvc/llvm-project?rev=276215&view=rev Log: [libunwind] Properly align _Unwind_Exception.
Summary: _Unwind_Exception is required to be double word aligned. Currently the struct is under aligned. Reviewers: mclow.lists, compnerd, kledzik, emaste Subscribers: emaste, cfe-commits Differential Revision: https://reviews.llvm.org/D22543 Added: libunwind/trunk/test/alignment.pass.cpp Modified: libunwind/trunk/include/unwind.h Modified: libunwind/trunk/include/unwind.h URL: http://llvm.org/viewvc/llvm-project/libunwind/trunk/include/unwind.h?rev=276215&r1=276214&r2=276215&view=diff ============================================================================== --- libunwind/trunk/include/unwind.h (original) +++ libunwind/trunk/include/unwind.h Wed Jul 20 18:56:42 2016 @@ -122,13 +122,16 @@ struct _Unwind_Exception { uintptr_t private_1; // non-zero means forced unwind uintptr_t private_2; // holds sp that phase1 found for phase2 to use #ifndef __LP64__ - // The gcc implementation of _Unwind_Exception used attribute mode on the - // above fields which had the side effect of causing this whole struct to + // The implementation of _Unwind_Exception uses an attribute mode on the + // above fields which has the side effect of causing this whole struct to // round up to 32 bytes in size. To be more explicit, we add pad fields // added for binary compatibility. uint32_t reserved[3]; #endif -}; + // The Itanium ABI requires that _Unwind_Exception objects are "double-word + // aligned". GCC has interpreted this to mean "use the maximum useful + // alignment for the target"; so do we. +} __attribute__((__aligned__)); typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn) (int version, Added: libunwind/trunk/test/alignment.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libunwind/trunk/test/alignment.pass.cpp?rev=276215&view=auto ============================================================================== --- libunwind/trunk/test/alignment.pass.cpp (added) +++ libunwind/trunk/test/alignment.pass.cpp Wed Jul 20 18:56:42 2016 @@ -0,0 +1,21 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// The Itanium ABI requires that _Unwind_Exception objects are "double-word +// aligned". + +#include <unwind.h> + +struct MaxAligned {} __attribute__((aligned)); +static_assert(alignof(_Unwind_Exception) == alignof(MaxAligned), ""); + +int main() +{ +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits