xref: /llvm-project/libcxxabi/test/exception_object_alignment.pass.cpp (revision 3497500946c9b6a1b2e1452312a24c41ee412b34)
1*eb8650a7SLouis Dionne //===----------------------------------------------------------------------===//
20c1016a3SAkira Hatanaka //
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
60c1016a3SAkira Hatanaka //
70c1016a3SAkira Hatanaka //===----------------------------------------------------------------------===//
80c1016a3SAkira Hatanaka 
98c61114cSLouis Dionne // UNSUPPORTED: no-exceptions
100c1016a3SAkira Hatanaka 
110c1016a3SAkira Hatanaka // Check that the pointer __cxa_allocate_exception returns is aligned to the
120c1016a3SAkira Hatanaka // default alignment for the target architecture.
130c1016a3SAkira Hatanaka 
140c1016a3SAkira Hatanaka #include <cassert>
150c1016a3SAkira Hatanaka #include <cstdint>
160c1016a3SAkira Hatanaka #include <cxxabi.h>
170c1016a3SAkira Hatanaka #include <type_traits>
180c1016a3SAkira Hatanaka #include <__cxxabi_config.h>
190c1016a3SAkira Hatanaka 
200c1016a3SAkira Hatanaka struct S {
210c1016a3SAkira Hatanaka   int a[4];
220c1016a3SAkira Hatanaka } __attribute__((aligned));
230c1016a3SAkira Hatanaka 
main(int,char **)24504bc07dSLouis Dionne int main(int, char**) {
250c1016a3SAkira Hatanaka #if !defined(_LIBCXXABI_ARM_EHABI)
260c1016a3SAkira Hatanaka   void *p = __cxxabiv1::__cxa_allocate_exception(16);
270c1016a3SAkira Hatanaka   auto i = reinterpret_cast<uintptr_t>(p);
280c1016a3SAkira Hatanaka   auto a = std::alignment_of<S>::value;
290c1016a3SAkira Hatanaka   assert(i % a == 0);
307d5d9dc1SAkira Hatanaka   __cxxabiv1::__cxa_free_exception(p);
310c1016a3SAkira Hatanaka #endif
320c1016a3SAkira Hatanaka   return 0;
330c1016a3SAkira Hatanaka }
34