From 23e8dfd4879e97064147c4391ebc31369ac9633b Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Fri, 11 Jul 2014 08:47:51 +0000 Subject: [PATCH] [msan] Make one test case less brittle. llvm-svn: 212798 --- .../test/msan/wrap_indirect_calls_in_rtl.cc | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/compiler-rt/test/msan/wrap_indirect_calls_in_rtl.cc b/compiler-rt/test/msan/wrap_indirect_calls_in_rtl.cc index 040ff13f6881..58e80045e7de 100644 --- a/compiler-rt/test/msan/wrap_indirect_calls_in_rtl.cc +++ b/compiler-rt/test/msan/wrap_indirect_calls_in_rtl.cc @@ -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 +#include #include #include #include @@ -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;