// 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
}
}
+unsigned int getSampleCount() {
+ VPrintf(1, "in esan::%s\n", __FUNCTION__);
+ if (__esan_which_tool == ESAN_WorkingSet) {
+ return getSampleCountWorkingSet();
+ }
+ return 0;
+}
+
} // namespace __esan
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);
SANITIZER_INTERFACE_ATTRIBUTE void __esan_report() {
reportResults();
}
+
+SANITIZER_INTERFACE_ATTRIBUTE unsigned int __esan_get_sample_count() {
+ return getSampleCount();
+}
} // extern "C"
}
}
+unsigned int getSampleCountWorkingSet()
+{
+ return SnapshotNum;
+}
+
// Initialization that must be done before any instrumented code is executed.
void initializeShadowWorkingSet() {
CHECK(getFlags()->cache_line_size == CacheLineSize);
void initializeShadowWorkingSet();
int finalizeWorkingSet();
void reportWorkingSet();
+unsigned int getSampleCountWorkingSet();
void processRangeAccessWorkingSet(uptr PC, uptr Addr, SIZE_T Size,
bool IsWrite);
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) {
// 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>
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.