diff options
author | Asiri Rathnayake <asiri.rathnayake@arm.com> | 2017-04-04 14:03:54 +0000 |
---|---|---|
committer | Asiri Rathnayake <asiri.rathnayake@arm.com> | 2017-04-04 14:03:54 +0000 |
commit | 4cc78d7008ab6b8a7b09d01881e1d24aa8958c6d (patch) | |
tree | 8974dab74cb4e1b0a1891d30014988e45e1f72ff /libcxxabi | |
parent | dbdcfa127f333127cb248d1819780f7fdbc5cf5a (diff) | |
download | llvm-4cc78d7008ab6b8a7b09d01881e1d24aa8958c6d.zip llvm-4cc78d7008ab6b8a7b09d01881e1d24aa8958c6d.tar.gz llvm-4cc78d7008ab6b8a7b09d01881e1d24aa8958c6d.tar.bz2 |
Fix exception address alignment test for EHABI
This test fails on ARM bare-metal targets because it assumes the Itanium ABI,
whereas EHABI requires the exception address to be 8-byte aligned.
I was a bit puzzled at first because this should've failed on the public
arm-linux builder too. I think the reason it passes there is because we don't
include libunwind headers in the include path when running the libcxxabi tests,
so the system unwind.h gets picked up.
Reviewers: rengolin, EricWF
Differential revision: https://reviews.llvm.org/D31178
llvm-svn: 299435
Diffstat (limited to 'libcxxabi')
-rw-r--r-- | libcxxabi/CMakeLists.txt | 7 | ||||
-rw-r--r-- | libcxxabi/test/libcxxabi/test/config.py | 7 | ||||
-rw-r--r-- | libcxxabi/test/lit.site.cfg.in | 1 | ||||
-rw-r--r-- | libcxxabi/test/test_exception_address_alignment.pass.cpp | 17 |
4 files changed, 27 insertions, 5 deletions
diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt index be76724..162db8e 100644 --- a/libcxxabi/CMakeLists.txt +++ b/libcxxabi/CMakeLists.txt @@ -502,9 +502,14 @@ if (LIBCXXABI_USE_LLVM_UNWINDER OR LLVM_NATIVE_ARCH MATCHES ARM) set(LIBCXXABI_LIBUNWIND_SOURCES "") endif() - if (NOT LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL-NOTFOUND") + if (LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL-NOTFOUND") + set(LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL "") + endif() + + if (NOT LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "") include_directories("${LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL}") endif() + if (NOT LIBCXXABI_LIBUNWIND_SOURCES STREQUAL "") include_directories("${LIBCXXABI_LIBUNWIND_SOURCES}") endif() diff --git a/libcxxabi/test/libcxxabi/test/config.py b/libcxxabi/test/libcxxabi/test/config.py index 6d4da90..75da244 100644 --- a/libcxxabi/test/libcxxabi/test/config.py +++ b/libcxxabi/test/libcxxabi/test/config.py @@ -84,6 +84,13 @@ class Configuration(LibcxxConfiguration): % libcxxabi_headers) self.cxx.compile_flags += ['-I' + libcxxabi_headers] + libunwind_headers = self.get_lit_conf('libunwind_headers', None) + if self.get_lit_bool('llvm_unwinder', False) and libunwind_headers: + 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 diff --git a/libcxxabi/test/lit.site.cfg.in b/libcxxabi/test/lit.site.cfg.in index a650660..faa8df9 100644 --- a/libcxxabi/test/lit.site.cfg.in +++ b/libcxxabi/test/lit.site.cfg.in @@ -6,6 +6,7 @@ config.libcxxabi_obj_root = "@LIBCXXABI_BINARY_DIR@" config.abi_library_path = "@LIBCXXABI_LIBRARY_DIR@" config.libcxx_src_root = "@LIBCXXABI_LIBCXX_PATH@" config.cxx_headers = "@LIBCXXABI_LIBCXX_INCLUDES@" +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@" diff --git a/libcxxabi/test/test_exception_address_alignment.pass.cpp b/libcxxabi/test/test_exception_address_alignment.pass.cpp index 8a41f0c..138fb4d 100644 --- a/libcxxabi/test/test_exception_address_alignment.pass.cpp +++ b/libcxxabi/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 <cstdint> #include <cassert> @@ -24,7 +24,16 @@ #include <unwind.h> struct __attribute__((aligned)) AlignedType {}; -static_assert(alignof(AlignedType) == alignof(_Unwind_Exception), + +// EHABI : 8-byte aligned +// Itanium: Largest supported alignment for the system +#if defined(_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 @@ int main() { try { throw MinAligned{}; } catch (MinAligned const& ref) { - assert(reinterpret_cast<uintptr_t>(&ref) % alignof(AlignedType) == 0); + assert(reinterpret_cast<uintptr_t>(&ref) % EXPECTED_ALIGNMENT == 0); } } } |