[compiler-rt] r275948 - [esan|wset] Fix flaky sampling tests

Derek Bruening via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 18 22:07:13 PDT 2016


Author: bruening
Date: Tue Jul 19 00:06:48 2016
New Revision: 275948

URL: http://llvm.org/viewvc/llvm-project?rev=275948&view=rev
Log:
[esan|wset] Fix flaky sampling tests

Adds a new esan public interface routine __esan_get_sample_count() and uses
it to ensure that tests of sampling receive the minimum number of samples.

Modified:
    compiler-rt/trunk/include/sanitizer/esan_interface.h
    compiler-rt/trunk/lib/esan/esan.cpp
    compiler-rt/trunk/lib/esan/esan.h
    compiler-rt/trunk/lib/esan/esan_interface.cpp
    compiler-rt/trunk/lib/esan/working_set.cpp
    compiler-rt/trunk/lib/esan/working_set.h
    compiler-rt/trunk/test/esan/TestCases/workingset-midreport.cpp
    compiler-rt/trunk/test/esan/TestCases/workingset-samples.cpp

Modified: compiler-rt/trunk/include/sanitizer/esan_interface.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/include/sanitizer/esan_interface.h?rev=275948&r1=275947&r2=275948&view=diff
==============================================================================
--- compiler-rt/trunk/include/sanitizer/esan_interface.h (original)
+++ compiler-rt/trunk/include/sanitizer/esan_interface.h Tue Jul 19 00:06:48 2016
@@ -39,6 +39,10 @@ extern "C" {
 // data for that point in the run be reported from the tool.
 void COMPILER_RT_WEAK __esan_report();
 
+// This function returns the number of samples that the esan tool has collected
+// to this point.  This is useful for testing.
+unsigned int COMPILER_RT_WEAK __esan_get_sample_count();
+
 #ifdef __cplusplus
 } // extern "C"
 #endif

Modified: compiler-rt/trunk/lib/esan/esan.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/esan/esan.cpp?rev=275948&r1=275947&r2=275948&view=diff
==============================================================================
--- compiler-rt/trunk/lib/esan/esan.cpp (original)
+++ compiler-rt/trunk/lib/esan/esan.cpp Tue Jul 19 00:06:48 2016
@@ -259,4 +259,12 @@ void processCompilationUnitExit(void *Pt
   }
 }
 
+unsigned int getSampleCount() {
+  VPrintf(1, "in esan::%s\n", __FUNCTION__);
+  if (__esan_which_tool == ESAN_WorkingSet) {
+    return getSampleCountWorkingSet();
+  }
+  return 0;
+}
+
 } // namespace __esan

Modified: compiler-rt/trunk/lib/esan/esan.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/esan/esan.h?rev=275948&r1=275947&r2=275948&view=diff
==============================================================================
--- compiler-rt/trunk/lib/esan/esan.h (original)
+++ compiler-rt/trunk/lib/esan/esan.h Tue Jul 19 00:06:48 2016
@@ -38,6 +38,7 @@ extern bool EsanDuringInit;
 void initializeLibrary(ToolType Tool);
 int finalizeLibrary();
 void reportResults();
+unsigned int getSampleCount();
 // Esan creates the variable per tool per compilation unit at compile time
 // and passes its pointer Ptr to the runtime library.
 void processCompilationUnitInit(void *Ptr);

Modified: compiler-rt/trunk/lib/esan/esan_interface.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/esan/esan_interface.cpp?rev=275948&r1=275947&r2=275948&view=diff
==============================================================================
--- compiler-rt/trunk/lib/esan/esan_interface.cpp (original)
+++ compiler-rt/trunk/lib/esan/esan_interface.cpp Tue Jul 19 00:06:48 2016
@@ -115,4 +115,8 @@ extern "C" {
 SANITIZER_INTERFACE_ATTRIBUTE void __esan_report() {
   reportResults();
 }
+
+SANITIZER_INTERFACE_ATTRIBUTE unsigned int __esan_get_sample_count() {
+  return getSampleCount();
+}
 } // extern "C"

Modified: compiler-rt/trunk/lib/esan/working_set.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/esan/working_set.cpp?rev=275948&r1=275947&r2=275948&view=diff
==============================================================================
--- compiler-rt/trunk/lib/esan/working_set.cpp (original)
+++ compiler-rt/trunk/lib/esan/working_set.cpp Tue Jul 19 00:06:48 2016
@@ -190,6 +190,11 @@ static void takeSample(void *Arg) {
   }
 }
 
+unsigned int getSampleCountWorkingSet()
+{
+  return SnapshotNum;
+}
+
 // Initialization that must be done before any instrumented code is executed.
 void initializeShadowWorkingSet() {
   CHECK(getFlags()->cache_line_size == CacheLineSize);

Modified: compiler-rt/trunk/lib/esan/working_set.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/esan/working_set.h?rev=275948&r1=275947&r2=275948&view=diff
==============================================================================
--- compiler-rt/trunk/lib/esan/working_set.h (original)
+++ compiler-rt/trunk/lib/esan/working_set.h Tue Jul 19 00:06:48 2016
@@ -24,6 +24,7 @@ void initializeWorkingSet();
 void initializeShadowWorkingSet();
 int finalizeWorkingSet();
 void reportWorkingSet();
+unsigned int getSampleCountWorkingSet();
 void processRangeAccessWorkingSet(uptr PC, uptr Addr, SIZE_T Size,
                                   bool IsWrite);
 

Modified: compiler-rt/trunk/test/esan/TestCases/workingset-midreport.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/esan/TestCases/workingset-midreport.cpp?rev=275948&r1=275947&r2=275948&view=diff
==============================================================================
--- compiler-rt/trunk/test/esan/TestCases/workingset-midreport.cpp (original)
+++ compiler-rt/trunk/test/esan/TestCases/workingset-midreport.cpp Tue Jul 19 00:06:48 2016
@@ -17,15 +17,15 @@ const int iters = 6;
 int main(int argc, char **argv) {
   char *buf = (char *)mmap(0, size, PROT_READ | PROT_WRITE,
                            MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-  // Try to increase the probability that the sideline thread is
-  // scheduled.  Unfortunately we can't do proper synchronization
-  // without some form of annotation or something.
-  sched_yield();
-  // Do enough work to get at least 4 samples.
-  for (int j = 0; j < iters; ++j) {
-    for (int i = 0; i < size; ++i)
-      buf[i] = i;
-    sched_yield();
+  // To avoid flakiness stemming from whether the sideline thread
+  // is scheduled enough on a loaded test machine, we coordinate
+  // with esan itself:
+  if (__esan_get_sample_count) {
+    while (__esan_get_sample_count() < 4) {
+      for (int i = 0; i < size; ++i)
+        buf[i] = i;
+      sched_yield();
+    }
   }
   // Ensure a non-esan build works without ifdefs:
   if (__esan_report) {

Modified: compiler-rt/trunk/test/esan/TestCases/workingset-samples.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/esan/TestCases/workingset-samples.cpp?rev=275948&r1=275947&r2=275948&view=diff
==============================================================================
--- compiler-rt/trunk/test/esan/TestCases/workingset-samples.cpp (original)
+++ compiler-rt/trunk/test/esan/TestCases/workingset-samples.cpp Tue Jul 19 00:06:48 2016
@@ -1,6 +1,7 @@
 // RUN: %clang_esan_wset -O0 %s -o %t 2>&1
 // RUN: %run %t 2>&1 | FileCheck %s
 
+#include <sanitizer/esan_interface.h>
 #include <sched.h>
 #include <stdlib.h>
 #include <string.h>
@@ -12,15 +13,15 @@ const int iters = 6;
 int main(int argc, char **argv) {
   char *buf = (char *)mmap(0, size, PROT_READ | PROT_WRITE,
                            MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-  // Try to increase the probability that the sideline thread is
-  // scheduled.  Unfortunately we can't do proper synchronization
-  // without some form of annotation or something.
-  sched_yield();
-  // Do enough work to get at least 4 samples.
-  for (int j = 0; j < iters; ++j) {
-    for (int i = 0; i < size; ++i)
-      buf[i] = i;
-    sched_yield();
+  // To avoid flakiness stemming from whether the sideline thread
+  // is scheduled enough on a loaded test machine, we coordinate
+  // with esan itself:
+  if (__esan_get_sample_count) {
+    while (__esan_get_sample_count() < 4) {
+      for (int i = 0; i < size; ++i)
+        buf[i] = i;
+      sched_yield();
+    }
   }
   munmap(buf, size);
   // We only check for a few samples here to reduce the chance of flakiness.




More information about the llvm-commits mailing list