[PATCH] D24766: [sanitizers] Update sanitizers test to better match glibc internals

Diana Picus via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 20 07:47:07 PDT 2016


rovka created this revision.
rovka added reviewers: zatrazz, eugenis.
rovka added subscribers: rengolin, llvm-commits.
Herald added subscribers: kubabrecka, aemerson.

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 (ARM with glibc 2.23). I have tested on x86_64 with glibc 2.21 and
2.17, AArch64 with glibc 2.21 and ARM with glibc 2.19 and 2.23.


https://reviews.llvm.org/D24766

Files:
  test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc

Index: test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc
===================================================================
--- test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc
+++ 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 @@
   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);
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D24766.71932.patch
Type: text/x-patch
Size: 972 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160920/afed4b42/attachment.bin>


More information about the llvm-commits mailing list