summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAsiri Rathnayake <asiri.rathnayake@arm.com>2017-04-04 14:03:54 +0000
committerAsiri Rathnayake <asiri.rathnayake@arm.com>2017-04-04 14:03:54 +0000
commit0a3a1a8a5ca5ef69e0f6b7d5b9d13e63e6fd2c19 (patch)
tree4eba99dfb042196bbb549089395675de62996905 /test
parent66db5e3ea75d0f8a9c4f6e7f4672bc219c326ab8 (diff)
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 git-svn-id: https://llvm.org/svn/llvm-project/libcxxabi/trunk@299435 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/libcxxabi/test/config.py7
-rw-r--r--test/lit.site.cfg.in1
-rw-r--r--test/test_exception_address_alignment.pass.cpp17
3 files changed, 21 insertions, 4 deletions
diff --git a/test/libcxxabi/test/config.py b/test/libcxxabi/test/config.py
index 6d4da90..75da244 100644
--- a/test/libcxxabi/test/config.py
+++ b/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/test/lit.site.cfg.in b/test/lit.site.cfg.in
index a650660..faa8df9 100644
--- a/test/lit.site.cfg.in
+++ b/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/test/test_exception_address_alignment.pass.cpp b/test/test_exception_address_alignment.pass.cpp
index 8a41f0c..138fb4d 100644
--- a/test/test_exception_address_alignment.pass.cpp
+++ b/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);
}
}
}