1c74a2e12SEric Fiselier //===----------------------------------------------------------------------===//
2c74a2e12SEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c74a2e12SEric Fiselier //
7c74a2e12SEric Fiselier //===----------------------------------------------------------------------===//
8c74a2e12SEric Fiselier 
98c61114cSLouis Dionne // UNSUPPORTED: no-exceptions
1031cbe0f2SLouis Dionne // UNSUPPORTED: c++03
11d532ddccSEric Fiselier 
12d520dfecSLouis Dionne // The <unwind.h> header provided in the SDK of older Xcodes used to provide
132da6ce60SLouis Dionne // an incorrectly aligned _Unwind_Exception type on non-ARM. That causes these
14*8c060613SLouis Dionne // tests to fail when running against a system libc++abi and libunwind that was
15*8c060613SLouis Dionne // compiled with an incorrect definition of _Unwind_Exception.
16c360553cSLouis Dionne // XFAIL: use_system_cxx_lib && target={{.+}}-apple-macosx10.{{9|10|11|12}}
17d532ddccSEric Fiselier 
184cc78d70SAsiri Rathnayake // Test that the address of the exception object is properly aligned as required
194cc78d70SAsiri Rathnayake // by the relevant ABI
20c74a2e12SEric Fiselier 
21c74a2e12SEric Fiselier #include <cstdint>
22c74a2e12SEric Fiselier #include <cassert>
23d8f100a6SYvan Roux #include <__cxxabi_config.h>
24c74a2e12SEric Fiselier 
25d532ddccSEric Fiselier #include <unwind.h>
26d532ddccSEric Fiselier 
27c74a2e12SEric Fiselier struct __attribute__((aligned)) AlignedType {};
284cc78d70SAsiri Rathnayake 
294cc78d70SAsiri Rathnayake // EHABI  : 8-byte aligned
304cc78d70SAsiri Rathnayake // Itanium: Largest supported alignment for the system
31d8f100a6SYvan Roux #if defined(_LIBCXXABI_ARM_EHABI)
324cc78d70SAsiri Rathnayake #  define EXPECTED_ALIGNMENT 8
334cc78d70SAsiri Rathnayake #else
344cc78d70SAsiri Rathnayake #  define EXPECTED_ALIGNMENT alignof(AlignedType)
354cc78d70SAsiri Rathnayake #endif
364cc78d70SAsiri Rathnayake 
374cc78d70SAsiri Rathnayake static_assert(alignof(_Unwind_Exception) == EXPECTED_ALIGNMENT,
38d532ddccSEric Fiselier   "_Unwind_Exception is incorrectly aligned. This test is expected to fail");
39d532ddccSEric Fiselier 
40c74a2e12SEric Fiselier struct MinAligned {  };
41c74a2e12SEric Fiselier static_assert(alignof(MinAligned) == 1 && sizeof(MinAligned) == 1, "");
42c74a2e12SEric Fiselier 
main(int,char **)43504bc07dSLouis Dionne int main(int, char**) {
44c74a2e12SEric Fiselier   for (int i=0; i < 10; ++i) {
45c74a2e12SEric Fiselier     try {
46c74a2e12SEric Fiselier       throw MinAligned{};
47c74a2e12SEric Fiselier     } catch (MinAligned const& ref) {
484cc78d70SAsiri Rathnayake       assert(reinterpret_cast<uintptr_t>(&ref) % EXPECTED_ALIGNMENT == 0);
49c74a2e12SEric Fiselier     }
50c74a2e12SEric Fiselier   }
51504bc07dSLouis Dionne 
52504bc07dSLouis Dionne   return 0;
53c74a2e12SEric Fiselier }
54