ahatanak created this revision. r276215 made a change to annotate _Unwind_Exception with "__attribute__((__aligned__))" so that exception objects are double-word aligned. This fix hasn't been incorporated to unwind.h on Darwin yet and, since it is an ABI breaking change, I'm not sure it will ever happen in the future.
Instead of annotating struct _Unwind_Exception with the attribute, this patch annotates field unwindHeader of __cxa_exception. This fixes the test case (exception_object_alignment.sh.cpp) that used to crash because of the under-aligned object. rdar://problem/25364625 https://reviews.llvm.org/D33030 Files: src/cxa_exception.hpp test/exception_object_alignment.sh.cpp Index: test/exception_object_alignment.sh.cpp =================================================================== --- /dev/null +++ test/exception_object_alignment.sh.cpp @@ -0,0 +1,46 @@ +//===---------------- exception_object_alignment.sh.cpp -------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: libcxxabi-no-exceptions + +// RUN: %cxx %flags %compile_flags -O1 %s -o %t.exe +// RUN: %exec %t.exe + +// This test used to segfault on Darwin because field unwindHeader of struct +// __cxa_exception was not 16B aligned. + +namespace { + +struct S { + int a; + int __attribute__((aligned(16))) b; +}; + +class base1 { +protected: + virtual ~base1() throw() {} +}; + +class derived: public base1 { +public: + derived() : member() {} +private: + S member; +}; + +} + +int main() { + try { + throw derived(); + } + catch(...) { + } + return 0; +} Index: src/cxa_exception.hpp =================================================================== --- src/cxa_exception.hpp +++ src/cxa_exception.hpp @@ -61,7 +61,7 @@ size_t referenceCount; #endif - _Unwind_Exception unwindHeader; + _Unwind_Exception unwindHeader __attribute__((aligned)); }; // http://sourcery.mentor.com/archives/cxx-abi-dev/msg01924.html @@ -96,7 +96,7 @@ void* primaryException; #endif - _Unwind_Exception unwindHeader; + _Unwind_Exception unwindHeader __attribute__((aligned)); }; struct _LIBCXXABI_HIDDEN __cxa_eh_globals {
Index: test/exception_object_alignment.sh.cpp =================================================================== --- /dev/null +++ test/exception_object_alignment.sh.cpp @@ -0,0 +1,46 @@ +//===---------------- exception_object_alignment.sh.cpp -------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: libcxxabi-no-exceptions + +// RUN: %cxx %flags %compile_flags -O1 %s -o %t.exe +// RUN: %exec %t.exe + +// This test used to segfault on Darwin because field unwindHeader of struct +// __cxa_exception was not 16B aligned. + +namespace { + +struct S { + int a; + int __attribute__((aligned(16))) b; +}; + +class base1 { +protected: + virtual ~base1() throw() {} +}; + +class derived: public base1 { +public: + derived() : member() {} +private: + S member; +}; + +} + +int main() { + try { + throw derived(); + } + catch(...) { + } + return 0; +} Index: src/cxa_exception.hpp =================================================================== --- src/cxa_exception.hpp +++ src/cxa_exception.hpp @@ -61,7 +61,7 @@ size_t referenceCount; #endif - _Unwind_Exception unwindHeader; + _Unwind_Exception unwindHeader __attribute__((aligned)); }; // http://sourcery.mentor.com/archives/cxx-abi-dev/msg01924.html @@ -96,7 +96,7 @@ void* primaryException; #endif - _Unwind_Exception unwindHeader; + _Unwind_Exception unwindHeader __attribute__((aligned)); }; struct _LIBCXXABI_HIDDEN __cxa_eh_globals {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits