diff options
author | Diana Picus <diana.picus@linaro.org> | 2016-09-21 08:56:14 +0000 |
---|---|---|
committer | Diana Picus <diana.picus@linaro.org> | 2016-09-21 08:56:14 +0000 |
commit | 099771b736a142dbd168311f29f38c6e71c8bbad (patch) | |
tree | 8e0bd32b10073c6ebf181535352d7def8cf66f8b | |
parent | 601e9898797f2b5969c5dd2814f9c4fb2e298535 (diff) | |
download | bcm5719-llvm-099771b736a142dbd168311f29f38c6e71c8bbad.tar.gz bcm5719-llvm-099771b736a142dbd168311f29f38c6e71c8bbad.zip |
[sanitizers] Update sanitizers test to better match glibc internals
One of the tests relying on sem_t's layout gets the wrong value for versions of
glibc newer than 2.21 on platforms that don't have 64-bit atomics (e.g. ARM).
This commit fixes the test to work with:
* versions of glibc >= 2.21 on platforms with 64-bit atomics: unchanged
* versions of glibc >= 2.21 on platforms without 64-bit atomics: the semaphore
value is shifted by SEM_VALUE_SHIFT (which is set to 1 in glibc's internal
headers)
* versions of glibc < 2.21: unchanged
See the glibc 2.23 sources:
* sysdeps/nptl/internaltypes.h (struct new_sem for glibc >= 2.21 and
struct old_sem for glibc < 2.21)
* nptl/sem_getvalue.c
This was uncovered on one of the new buildbots that we are trying to move to
production.
Differential Revision: https://reviews.llvm.org/D24766
llvm-svn: 282061
-rw-r--r-- | compiler-rt/test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc b/compiler-rt/test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc index 193b33d7976..50a40c419d3 100644 --- a/compiler-rt/test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc +++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc @@ -13,8 +13,14 @@ defined(__s390x__) || defined(__sparc64__) || defined(__alpha__) || \ defined(__ia64__) || defined(__m68k__)) && __GLIBC_PREREQ(2, 21) typedef uint64_t semval_t; +#define GET_SEM_VALUE(V) (V) #else typedef unsigned semval_t; +#if __GLIBC_PREREQ(2, 21) +#define GET_SEM_VALUE(V) ((V) >> 1) +#else +#define GET_SEM_VALUE(V) (V) +#endif #endif void my_sem_init(bool priv, int value, semval_t *a, unsigned char *b) { @@ -34,10 +40,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); } |