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

Reply via email to