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 Dionneint 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