[PATCH] D33030: [libcxxabi] Align unwindHeader on a double-word boundary

Akira Hatanaka via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue May 9 23:34:57 PDT 2017


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 {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D33030.98401.patch
Type: text/x-patch
Size: 1712 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170510/8dc287b4/attachment.bin>


More information about the cfe-commits mailing list