Index: test/libcxxabi/test/config.py =================================================================== --- test/libcxxabi/test/config.py +++ test/libcxxabi/test/config.py @@ -20,6 +20,7 @@ self.libcxxabi_obj_root = None self.abi_library_path = None self.libcxx_src_root = None + self.libunwind_src = None def configure_src_root(self): self.libcxxabi_src_root = self.get_lit_conf( @@ -28,6 +29,9 @@ self.libcxx_src_root = self.get_lit_conf( 'libcxx_src_root', os.path.join(self.libcxxabi_src_root, '/../libcxx')) + self.libunwind_src = self.get_lit_conf( + 'libunwind_src', + os.path.join(self.libcxxabi_src_root, '/../libunwind/src')) def configure_obj_root(self): self.libcxxabi_obj_root = self.get_lit_conf('libcxxabi_obj_root') @@ -84,6 +88,15 @@ % libcxxabi_headers) self.cxx.compile_flags += ['-I' + libcxxabi_headers] + libunwind_headers = self.get_lit_conf( + 'libunwind_headers', + os.path.join(self.libunwind_src, '/../include')) + if self.get_lit_bool('llvm_unwinder', False): + if not os.path.isdir(libunwind_headers): + self.lit_config.fatal("libunwind_headers='%s' is not a directory." + % libunwind_headers) + self.cxx.compile_flags += ['-I' + libunwind_headers] + def configure_compile_flags_exceptions(self): pass Index: test/lit.site.cfg.in =================================================================== --- test/lit.site.cfg.in +++ test/lit.site.cfg.in @@ -6,6 +6,8 @@ config.abi_library_path = "@LIBCXXABI_LIBRARY_DIR@" config.libcxx_src_root = "@LIBCXXABI_LIBCXX_PATH@" config.cxx_headers = "@LIBCXXABI_LIBCXX_INCLUDES@" +config.libunwind_src = "@LIBCXXABI_LIBUNWIND_SOURCES@" +config.libunwind_headers = "@LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL@" config.cxx_library_root = "@LIBCXXABI_LIBCXX_LIBRARY_PATH@" config.llvm_unwinder = "@LIBCXXABI_USE_LLVM_UNWINDER@" config.enable_threads = "@LIBCXXABI_ENABLE_THREADS@" Index: test/test_exception_address_alignment.pass.cpp =================================================================== --- test/test_exception_address_alignment.pass.cpp +++ test/test_exception_address_alignment.pass.cpp @@ -15,8 +15,8 @@ // working around this failure. // XFAIL: darwin && libcxxabi-has-system-unwinder -// Test that the address of the exception object is properly aligned to the -// largest supported alignment for the system. +// Test that the address of the exception object is properly aligned as required +// by the relevant ABI #include #include @@ -24,7 +24,16 @@ #include struct __attribute__((aligned)) AlignedType {}; -static_assert(alignof(AlignedType) == alignof(_Unwind_Exception), + +// EHABI : 8-byte aligned +// Itanium: Largest supported alignment for the system +#if _LIBUNWIND_ARM_EHABI +# define EXPECTED_ALIGNMENT 8 +#else +# define EXPECTED_ALIGNMENT alignof(AlignedType) +#endif + +static_assert(alignof(_Unwind_Exception) == EXPECTED_ALIGNMENT, "_Unwind_Exception is incorrectly aligned. This test is expected to fail"); struct MinAligned { }; @@ -35,7 +44,7 @@ try { throw MinAligned{}; } catch (MinAligned const& ref) { - assert(reinterpret_cast(&ref) % alignof(AlignedType) == 0); + assert(reinterpret_cast(&ref) % EXPECTED_ALIGNMENT == 0); } } }