Skip to content

Commit

Permalink
[sanitizers] Update sanitizers test to better match glibc internals
Browse files Browse the repository at this point in the history
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
  • Loading branch information
rovka committed Sep 21, 2016
1 parent 601e989 commit 099771b
Showing 1 changed file with 8 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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);
}

0 comments on commit 099771b

Please sign in to comment.