[msan] Make one test case less brittle.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Fri, 11 Jul 2014 08:47:51 +0000 (08:47 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Fri, 11 Jul 2014 08:47:51 +0000 (08:47 +0000)
llvm-svn: 212798

compiler-rt/test/msan/wrap_indirect_calls_in_rtl.cc

index 040ff13..58e8004 100644 (file)
@@ -1,8 +1,10 @@
 // Test indirect call wrapping in MemorySanitizer runtime.
 
 // RUN: %clangxx_msan -O0 -g -rdynamic %s -o %t && %run %t
+// RUN: %clangxx_msan -O2 -g -rdynamic %s -o %t && %run %t
 
 #include <assert.h>
+#include <dlfcn.h>
 #include <math.h>
 #include <pthread.h>
 #include <stdio.h>
@@ -24,9 +26,6 @@ void *ThreadFn2(void *) {
   return 0;
 }
 
-bool in_gettimeofday;
-bool in_lgamma;
-
 int my_gettimeofday(struct timeval *p, void *q) {
   p->tv_sec = 1;
   p->tv_usec = 2;
@@ -37,17 +36,20 @@ double my_lgamma(double x) {
   return x;
 }
 
+uintptr_t real_gettimeofday;
+uintptr_t real_lgamma;
+
 extern "C" uintptr_t my_wrapper(uintptr_t f) {
-  if (f == (uintptr_t)ThreadFn)
-    return (uintptr_t)&ThreadFn2;
-  if (in_gettimeofday)
-    return (uintptr_t)my_gettimeofday;
-  if (in_lgamma)
-    return (uintptr_t)my_lgamma;
+  if (f == (uintptr_t)ThreadFn) return (uintptr_t)&ThreadFn2;
+  if (f == real_gettimeofday) return (uintptr_t)my_gettimeofday;
+  if (f == real_lgamma) return (uintptr_t)my_lgamma;
   return f;
 }
 
 int main(void) {
+  real_gettimeofday = (uintptr_t)dlsym(RTLD_NEXT, "gettimeofday");
+  real_lgamma = (uintptr_t)dlsym(RTLD_NEXT, "lgamma");
+
   __msan_set_indirect_call_wrapper((uintptr_t)my_wrapper);
 
   // ThreadFn is called indirectly from a wrapper function in MSan rtl and
@@ -61,18 +63,14 @@ int main(void) {
   // gettimeofday is intercepted in msan_interceptors.cc and the real one (from
   // libc) is called indirectly.
   struct timeval tv;
-  in_gettimeofday = true;
   int res = gettimeofday(&tv, NULL);
-  in_gettimeofday = false;
   assert(tv.tv_sec == 1);
   assert(tv.tv_usec == 2);
   assert(res == 42);
 
   // lgamma is intercepted in sanitizer_common_interceptors.inc and is also
   // called indirectly.
-  in_lgamma = true;
   double dres = lgamma(1.1);
-  in_lgamma = false;
   assert(dres == 1.1);
   
   return 0;