[PATCH] D18854: [sanitizer] Fix sem_init_glibc.cc test on __HAVE_64B_ATOMIC arches.

Marcin Koƛcielnicki via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 7 12:29:57 PDT 2016


koriakin updated the summary for this revision.
koriakin removed rL LLVM as the repository for this revision.
koriakin updated this revision to Diff 52943.
koriakin added a comment.

Whoops, it seems the new layout is only used in glibc >= 2.21.  I assume you've tested on an older glibc?

I've added a __GLIBC_PREREQ test for that.  In theory, we should be using the runtime version of the library, and not the version of headers, but it shouldn't matter since the program is compiled immediately before use.  What do you think?


http://reviews.llvm.org/D18854

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
@@ -2,24 +2,35 @@
 // This test depends on the glibc layout of struct sem_t and checks that we
 // don't leave sem_t::private uninitialized.
 // UNSUPPORTED: android
+#include <features.h>
 #include <assert.h>
 #include <semaphore.h>
 #include <string.h>
+#include <stdint.h>
 
-void my_sem_init(bool priv, int value, unsigned *a, unsigned char *b) {
+// This condition needs to correspond to __HAVE_64B_ATOMICS macro in glibc.
+#if (defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__) || \
+     defined(__s390x__) || defined(__sparc64__) || defined(__alpha__) || \
+     defined(__ia64__) || defined(__m68k__)) && __GLIBC_PREREQ(2, 21)
+typedef uint64_t semval_t;
+#else
+typedef unsigned semval_t;
+#endif
+
+void my_sem_init(bool priv, int value, semval_t *a, unsigned char *b) {
   sem_t sem;
   memset(&sem, 0xAB, sizeof(sem));
   sem_init(&sem, priv, value);
 
   char *p = (char *)&sem;
-  memcpy(a, p, sizeof(unsigned));
-  memcpy(b, p + sizeof(unsigned), sizeof(char));
+  memcpy(a, p, sizeof(semval_t));
+  memcpy(b, p + sizeof(semval_t), sizeof(char));
 
   sem_destroy(&sem);
 }
 
 int main() {
-  unsigned a;
+  semval_t a;
   unsigned char b;
 
   my_sem_init(false, 42, &a, &b);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D18854.52943.patch
Type: text/x-patch
Size: 1464 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160407/bcb78f2a/attachment.bin>


More information about the llvm-commits mailing list