From 9822763f9403c0740a01b7b5b50e3f15eec76b65 Mon Sep 17 00:00:00 2001 From: Renato Golin Date: Fri, 2 Dec 2016 17:33:09 +0000 Subject: [ARM|RT] Merging r24766 into 3.9.1 Fixes a bug encountered in RC2 validation. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/branches/release_39@288513 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../TestCases/Linux/sem_init_glibc.cc | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc b/test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc index 193b33d79..ff1ddc432 100644 --- a/test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc +++ b/test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc @@ -17,6 +17,21 @@ typedef uint64_t semval_t; typedef unsigned semval_t; #endif +// glibc 2.21 has introduced some changes in the way the semaphore value is +// handled for 32-bit platforms, but since these changes are not ABI-breaking +// they are not versioned. On newer platforms such as ARM, there is only one +// version of the symbol, so it's enough to check the glibc version. However, +// for old platforms such as i386, glibc contains two or even three versions of +// the sem_init symbol, and the sanitizers always pick the oldest one. +// Therefore, it is not enough to rely on the __GLIBC_PREREQ macro - we should +// instead check the platform as well to make sure we only expect the new +// behavior on platforms where the older symbols do not exist. +#if defined(__arm__) && __GLIBC_PREREQ(2, 21) +#define GET_SEM_VALUE(V) ((V) >> 1) +#else +#define GET_SEM_VALUE(V) (V) +#endif + void my_sem_init(bool priv, int value, semval_t *a, unsigned char *b) { sem_t sem; memset(&sem, 0xAB, sizeof(sem)); @@ -34,10 +49,10 @@ int main() { unsigned char b; my_sem_init(false, 42, &a, &b); - assert(a == 42); + assert(GET_SEM_VALUE(a) == 42); assert(b != 0xAB); my_sem_init(true, 43, &a, &b); - assert(a == 43); + assert(GET_SEM_VALUE(a) == 43); assert(b != 0xAB); } -- cgit v1.2.1