From f8c7e25560f0e9bae864d7ad56079877b99c0e28 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Fri, 26 Dec 2014 10:19:56 +0000 Subject: [PATCH] Revert r224838, r224839. Flaky failures on the build bots. llvm-svn: 224850 --- compiler-rt/lib/asan/asan_activation.cc | 25 ++---- compiler-rt/lib/asan/asan_interceptors.cc | 4 +- compiler-rt/lib/asan/asan_rtl.cc | 15 ++-- compiler-rt/lib/lsan/lsan.cc | 5 +- compiler-rt/lib/msan/msan.cc | 5 +- .../lib/sanitizer_common/sanitizer_common.h | 5 +- .../sanitizer_common/sanitizer_coverage_libcdep.cc | 96 ++++++++-------------- .../sanitizer_coverage_mapping_libcdep.cc | 15 ++-- .../TestCases/Linux/coverage-direct-activation.cc | 47 ----------- 9 files changed, 68 insertions(+), 149 deletions(-) delete mode 100644 compiler-rt/test/asan/TestCases/Linux/coverage-direct-activation.cc diff --git a/compiler-rt/lib/asan/asan_activation.cc b/compiler-rt/lib/asan/asan_activation.cc index 39fa991..0aca1cb 100644 --- a/compiler-rt/lib/asan/asan_activation.cc +++ b/compiler-rt/lib/asan/asan_activation.cc @@ -26,8 +26,6 @@ static struct AsanDeactivatedFlags { AllocatorOptions allocator_options; int malloc_context_size; bool poison_heap; - bool coverage; - const char *coverage_dir; void OverrideFromActivationFlags() { Flags f; @@ -55,19 +53,16 @@ static struct AsanDeactivatedFlags { allocator_options.SetFrom(&f, &cf); malloc_context_size = cf.malloc_context_size; poison_heap = f.poison_heap; - coverage = cf.coverage; - coverage_dir = cf.coverage_dir; } void Print() { - Report( - "quarantine_size_mb %d, max_redzone %d, poison_heap %d, " - "malloc_context_size %d, alloc_dealloc_mismatch %d, " - "allocator_may_return_null %d, coverage %d, coverage_dir %s\n", - allocator_options.quarantine_size_mb, allocator_options.max_redzone, - poison_heap, malloc_context_size, - allocator_options.alloc_dealloc_mismatch, - allocator_options.may_return_null, coverage, coverage_dir); + Report("quarantine_size_mb %d, max_redzone %d, poison_heap %d, " + "malloc_context_size %d, alloc_dealloc_mismatch %d, " + "allocator_may_return_null %d\n", + allocator_options.quarantine_size_mb, allocator_options.max_redzone, + poison_heap, malloc_context_size, + allocator_options.alloc_dealloc_mismatch, + allocator_options.may_return_null); } } asan_deactivated_flags; @@ -81,14 +76,10 @@ void AsanDeactivate() { GetAllocatorOptions(&asan_deactivated_flags.allocator_options); asan_deactivated_flags.malloc_context_size = GetMallocContextSize(); asan_deactivated_flags.poison_heap = CanPoisonMemory(); - asan_deactivated_flags.coverage = common_flags()->coverage; - asan_deactivated_flags.coverage_dir = common_flags()->coverage_dir; // Deactivate the runtime. SetCanPoisonMemory(false); SetMallocContextSize(1); - ReInitializeCoverage(false, nullptr); - AllocatorOptions disabled = asan_deactivated_flags.allocator_options; disabled.quarantine_size_mb = 0; disabled.min_redzone = 16; // Redzone must be at least 16 bytes long. @@ -108,8 +99,6 @@ void AsanActivate() { SetCanPoisonMemory(asan_deactivated_flags.poison_heap); SetMallocContextSize(asan_deactivated_flags.malloc_context_size); - ReInitializeCoverage(asan_deactivated_flags.coverage, - asan_deactivated_flags.coverage_dir); ReInitializeAllocator(asan_deactivated_flags.allocator_options); asan_is_deactivated = false; diff --git a/compiler-rt/lib/asan/asan_interceptors.cc b/compiler-rt/lib/asan/asan_interceptors.cc index b492598..32c08ff 100644 --- a/compiler-rt/lib/asan/asan_interceptors.cc +++ b/compiler-rt/lib/asan/asan_interceptors.cc @@ -169,8 +169,8 @@ DECLARE_REAL_AND_INTERCEPTOR(void, free, void *) } while (false) #define COMMON_INTERCEPTOR_BLOCK_REAL(name) REAL(name) #define COMMON_INTERCEPTOR_ON_EXIT(ctx) OnExit() -#define COMMON_INTERCEPTOR_LIBRARY_LOADED(filename, res) CoverageUpdateMapping() -#define COMMON_INTERCEPTOR_LIBRARY_UNLOADED() CoverageUpdateMapping() +#define COMMON_INTERCEPTOR_LIBRARY_LOADED(filename, res) CovUpdateMapping() +#define COMMON_INTERCEPTOR_LIBRARY_UNLOADED() CovUpdateMapping() #define COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED (!asan_inited) #include "sanitizer_common/sanitizer_common_interceptors.inc" diff --git a/compiler-rt/lib/asan/asan_rtl.cc b/compiler-rt/lib/asan/asan_rtl.cc index 32ad0f2..895ac6b 100644 --- a/compiler-rt/lib/asan/asan_rtl.cc +++ b/compiler-rt/lib/asan/asan_rtl.cc @@ -397,6 +397,11 @@ static void AsanInitInternal() { MaybeStartBackgroudThread(); + // Now that ASan runtime is (mostly) initialized, deactivate it if + // necessary, so that it can be re-activated when requested. + if (flags()->start_deactivated) + AsanDeactivate(); + // On Linux AsanThread::ThreadStart() calls malloc() that's why asan_inited // should be set to 1 prior to initializing the threads. asan_inited = 1; @@ -405,12 +410,10 @@ static void AsanInitInternal() { if (flags()->atexit) Atexit(asan_atexit); - InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); - - // Now that ASan runtime is (mostly) initialized, deactivate it if - // necessary, so that it can be re-activated when requested. - if (flags()->start_deactivated) - AsanDeactivate(); + if (common_flags()->coverage) { + __sanitizer_cov_init(); + Atexit(__sanitizer_cov_dump); + } // interceptors InitTlsSize(); diff --git a/compiler-rt/lib/lsan/lsan.cc b/compiler-rt/lib/lsan/lsan.cc index 1509b2a..9a3314f 100644 --- a/compiler-rt/lib/lsan/lsan.cc +++ b/compiler-rt/lib/lsan/lsan.cc @@ -53,7 +53,10 @@ extern "C" void __lsan_init() { if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit) Atexit(DoLeakCheck); - InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); + if (common_flags()->coverage) { + __sanitizer_cov_init(); + Atexit(__sanitizer_cov_dump); + } lsan_inited = true; lsan_init_is_running = false; diff --git a/compiler-rt/lib/msan/msan.cc b/compiler-rt/lib/msan/msan.cc index 4925619..33b856b 100644 --- a/compiler-rt/lib/msan/msan.cc +++ b/compiler-rt/lib/msan/msan.cc @@ -377,7 +377,10 @@ void __msan_init() { Symbolizer::GetOrInit()->AddHooks(EnterSymbolizer, ExitSymbolizer); - InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); + if (common_flags()->coverage) { + __sanitizer_cov_init(); + Atexit(__sanitizer_cov_dump); + } MsanTSDInit(MsanTSDDtor); diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common.h b/compiler-rt/lib/sanitizer_common/sanitizer_common.h index ebbb003..b3aac1e 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common.h @@ -214,13 +214,10 @@ void PrepareForSandboxing(__sanitizer_sandbox_arguments *args); void CovPrepareForSandboxing(__sanitizer_sandbox_arguments *args); void SetSandboxingCallback(void (*f)()); -void CoverageUpdateMapping(); +void CovUpdateMapping(uptr caller_pc = 0); void CovBeforeFork(); void CovAfterFork(int child_pid); -void InitializeCoverage(bool enabled, const char *coverage_dir); -void ReInitializeCoverage(bool enabled, const char *coverage_dir); - void InitTlsSize(); uptr GetTlsSize(); diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_coverage_libcdep.cc b/compiler-rt/lib/sanitizer_common/sanitizer_coverage_libcdep.cc index eb3d243..8f0076f 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_coverage_libcdep.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_coverage_libcdep.cc @@ -58,15 +58,12 @@ static atomic_uintptr_t coverage_counter; static bool cov_sandboxed = false; static int cov_fd = kInvalidFd; static unsigned int cov_max_block_size = 0; -static bool coverage_enabled = false; -static const char *coverage_dir; namespace __sanitizer { class CoverageData { public: void Init(); - void ReInit(); void BeforeFork(); void AfterFork(int child_pid); void Extend(uptr npcs); @@ -133,16 +130,15 @@ class CoverageData { StaticSpinMutex mu; void DirectOpen(); + void ReInit(); }; static CoverageData coverage_data; -void CovUpdateMapping(const char *path, uptr caller_pc = 0); - void CoverageData::DirectOpen() { InternalScopedString path(kMaxPathLength); internal_snprintf((char *)path.data(), path.size(), "%s/%zd.sancov.raw", - coverage_dir, internal_getpid()); + common_flags()->coverage_dir, internal_getpid()); pc_fd = OpenFile(path.data(), true); if (internal_iserror(pc_fd)) { Report(" Coverage: failed to open %s for writing\n", path.data()); @@ -150,7 +146,7 @@ void CoverageData::DirectOpen() { } pc_array_mapped_size = 0; - CovUpdateMapping(coverage_dir); + CovUpdateMapping(); } void CoverageData::Init() { @@ -182,22 +178,16 @@ void CoverageData::Init() { } void CoverageData::ReInit() { - if (pc_array) { - internal_munmap(pc_array, sizeof(uptr) * kPcArrayMaxSize); - pc_array = nullptr; - } + internal_munmap(pc_array, sizeof(uptr) * kPcArrayMaxSize); if (pc_fd != kInvalidFd) internal_close(pc_fd); - if (coverage_enabled) { - if (common_flags()->coverage_direct) { - // In memory-mapped mode we must extend the new file to the known array - // size. - uptr size = atomic_load(&pc_array_size, memory_order_relaxed); - Init(); - if (size) Extend(size); - if (coverage_enabled) CovUpdateMapping(coverage_dir); - } else { - Init(); - } + if (common_flags()->coverage_direct) { + // In memory-mapped mode we must extend the new file to the known array + // size. + uptr size = atomic_load(&pc_array_size, memory_order_relaxed); + Init(); + if (size) Extend(size); + } else { + Init(); } } @@ -216,13 +206,13 @@ void CoverageData::Extend(uptr npcs) { if (!common_flags()->coverage_direct) return; SpinMutexLock l(&mu); + if (pc_fd == kInvalidFd) DirectOpen(); + CHECK_NE(pc_fd, kInvalidFd); + uptr size = atomic_load(&pc_array_size, memory_order_relaxed); size += npcs * sizeof(uptr); - if (coverage_enabled && size > pc_array_mapped_size) { - if (pc_fd == kInvalidFd) DirectOpen(); - CHECK_NE(pc_fd, kInvalidFd); - + if (size > pc_array_mapped_size) { uptr new_mapped_size = pc_array_mapped_size; while (size > new_mapped_size) new_mapped_size += kPcArrayMmapSize; CHECK_LE(new_mapped_size, sizeof(uptr) * kPcArrayMaxSize); @@ -371,14 +361,15 @@ static int CovOpenFile(bool packed, const char *name, InternalScopedString path(kMaxPathLength); if (!packed) { CHECK(name); - path.append("%s/%s.%zd.%s", coverage_dir, name, internal_getpid(), - extension); + path.append("%s/%s.%zd.%s", common_flags()->coverage_dir, name, + internal_getpid(), extension); } else { if (!name) - path.append("%s/%zd.%s.packed", coverage_dir, internal_getpid(), - extension); + path.append("%s/%zd.%s.packed", common_flags()->coverage_dir, + internal_getpid(), extension); else - path.append("%s/%s.%s.packed", coverage_dir, name, extension); + path.append("%s/%s.%s.packed", common_flags()->coverage_dir, name, + extension); } uptr fd = OpenFile(path.data(), true); if (internal_iserror(fd)) { @@ -464,7 +455,7 @@ void CoverageData::DumpCallerCalleePairs() { // Every event is a u32 value (index in tr_pc_array_index) so we compute // it once and then cache in the provided 'cache' storage. void CoverageData::TraceBasicBlock(uptr *cache) { - CHECK(coverage_enabled); + CHECK(common_flags()->coverage); uptr idx = *cache; if (!idx) { CHECK_LT(tr_pc_array_index, kTrPcArrayMaxSize); @@ -501,7 +492,7 @@ static void CovDumpAsBitSet() { // Dump the coverage on disk. static void CovDump() { - if (!coverage_enabled || common_flags()->coverage_direct) return; + if (!common_flags()->coverage || common_flags()->coverage_direct) return; #if !SANITIZER_WINDOWS if (atomic_fetch_add(&dump_once_guard, 1, memory_order_relaxed)) return; @@ -541,8 +532,8 @@ static void CovDump() { } else { // One file per module per process. path.clear(); - path.append("%s/%s.%zd.sancov", coverage_dir, module_name, - internal_getpid()); + path.append("%s/%s.%zd.sancov", common_flags()->coverage_dir, + module_name, internal_getpid()); int fd = CovOpenFile(false /* packed */, module_name); if (fd > 0) { internal_write(fd, offsets.data(), offsets.size() * sizeof(u32)); @@ -562,7 +553,7 @@ static void CovDump() { void CovPrepareForSandboxing(__sanitizer_sandbox_arguments *args) { if (!args) return; - if (!coverage_enabled) return; + if (!common_flags()->coverage) return; cov_sandboxed = args->coverage_sandboxed; if (!cov_sandboxed) return; cov_fd = args->coverage_fd; @@ -574,7 +565,7 @@ void CovPrepareForSandboxing(__sanitizer_sandbox_arguments *args) { int MaybeOpenCovFile(const char *name) { CHECK(name); - if (!coverage_enabled) return -1; + if (!common_flags()->coverage) return -1; return CovOpenFile(true /* packed */, name); } @@ -586,26 +577,6 @@ void CovAfterFork(int child_pid) { coverage_data.AfterFork(child_pid); } -void InitializeCoverage(bool enabled, const char *dir) { - coverage_enabled = enabled; - coverage_dir = dir; - if (enabled) coverage_data.Init(); -#if !SANITIZER_WINDOWS - if (!common_flags()->coverage_direct) Atexit(__sanitizer_cov_dump); -#endif -} - -void ReInitializeCoverage(bool enabled, const char *dir) { - coverage_enabled = enabled; - coverage_dir = dir; - coverage_data.ReInit(); -} - -void CoverageUpdateMapping() { - if (coverage_enabled) - CovUpdateMapping(coverage_dir); -} - } // namespace __sanitizer extern "C" { @@ -618,20 +589,19 @@ __sanitizer_cov_indir_call16(uptr callee, uptr callee_cache16[]) { coverage_data.IndirCall(StackTrace::GetPreviousInstructionPc(GET_CALLER_PC()), callee, callee_cache16, 16); } +SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_cov_dump() { CovDump(); } SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_cov_init() { - coverage_enabled = true; - coverage_dir = common_flags()->coverage_dir; coverage_data.Init(); } -SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_cov_dump() { CovDump(); } SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_cov_module_init(s32 **guards, uptr npcs) { coverage_data.InitializeGuards(guards, npcs); - if (!common_flags()->coverage_direct) return; - if (SANITIZER_ANDROID && coverage_enabled) { + if (!common_flags()->coverage || !common_flags()->coverage_direct) + return; + if (SANITIZER_ANDROID) { // dlopen/dlclose interceptors do not work on Android, so we rely on // Extend() calls to update .sancov.map. - CovUpdateMapping(coverage_dir, GET_CALLER_PC()); + CovUpdateMapping(GET_CALLER_PC()); } coverage_data.Extend(npcs); } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_coverage_mapping_libcdep.cc b/compiler-rt/lib/sanitizer_common/sanitizer_coverage_mapping_libcdep.cc index c0e406a..6a8cb8b 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_coverage_mapping_libcdep.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_coverage_mapping_libcdep.cc @@ -62,8 +62,8 @@ struct CachedMapping { static CachedMapping cached_mapping; static StaticSpinMutex mapping_mu; -void CovUpdateMapping(const char *coverage_dir, uptr caller_pc) { - if (!common_flags()->coverage_direct) return; +void CovUpdateMapping(uptr caller_pc) { + if (!common_flags()->coverage || !common_flags()->coverage_direct) return; SpinMutexLock l(&mapping_mu); @@ -92,10 +92,11 @@ void CovUpdateMapping(const char *coverage_dir, uptr caller_pc) { } int err; - InternalScopedString tmp_path(64 + internal_strlen(coverage_dir)); + InternalScopedString tmp_path(64 + + internal_strlen(common_flags()->coverage_dir)); uptr res = internal_snprintf((char *)tmp_path.data(), tmp_path.size(), - "%s/%zd.sancov.map.tmp", coverage_dir, - internal_getpid()); + "%s/%zd.sancov.map.tmp", common_flags()->coverage_dir, + internal_getpid()); CHECK_LE(res, tmp_path.size()); uptr map_fd = OpenFile(tmp_path.data(), true); if (internal_iserror(map_fd, &err)) { @@ -111,9 +112,9 @@ void CovUpdateMapping(const char *coverage_dir, uptr caller_pc) { } internal_close(map_fd); - InternalScopedString path(64 + internal_strlen(coverage_dir)); + InternalScopedString path(64 + internal_strlen(common_flags()->coverage_dir)); res = internal_snprintf((char *)path.data(), path.size(), "%s/%zd.sancov.map", - coverage_dir, internal_getpid()); + common_flags()->coverage_dir, internal_getpid()); CHECK_LE(res, path.size()); res = internal_rename(tmp_path.data(), path.data()); if (internal_iserror(res, &err)) { diff --git a/compiler-rt/test/asan/TestCases/Linux/coverage-direct-activation.cc b/compiler-rt/test/asan/TestCases/Linux/coverage-direct-activation.cc deleted file mode 100644 index 47f5775..0000000 --- a/compiler-rt/test/asan/TestCases/Linux/coverage-direct-activation.cc +++ /dev/null @@ -1,47 +0,0 @@ -// Test for direct coverage writing enabled as activation time. - -// RUN: %clangxx_asan -fsanitize-coverage=1 -DSHARED %s -shared -o %T/libcoverage_direct_test_1.so -fPIC -// RUN: %clangxx -c -DSO_DIR=\"%T\" %s -o %t.o -// RUN: %clangxx_asan -fsanitize-coverage=1 %t.o %libdl -o %t - -// RUN: rm -rf %T/coverage-direct-activation - -// RUN: mkdir -p %T/coverage-direct-activation/normal -// RUN: ASAN_OPTIONS=coverage=1,coverage_direct=0,coverage_dir=%T/coverage-direct-activation/normal:verbosity=1 %run %t -// RUN: %sancov print %T/coverage-direct-activation/normal/*.sancov >%T/coverage-direct-activation/normal/out.txt - -// RUN: mkdir -p %T/coverage-direct-activation/direct -// RUN: ASAN_OPTIONS=start_deactivated=1,coverage_direct=1,verbosity=1 \ -// RUN: ASAN_ACTIVATION_OPTIONS=coverage=1,coverage_dir=%T/coverage-direct-activation/direct %run %t -// RUN: cd %T/coverage-direct-activation/direct -// RUN: %sancov rawunpack *.sancov.raw -// RUN: %sancov print *.sancov >out.txt -// RUN: cd ../.. - -// RUN: diff -u coverage-direct-activation/normal/out.txt coverage-direct-activation/direct/out.txt - -// XFAIL: android - -#include -#include -#include -#include - -#ifdef SHARED -extern "C" { -void bar() { printf("bar\n"); } -} -#else - -int main(int argc, char **argv) { - fprintf(stderr, "PID: %d\n", getpid()); - void *handle1 = - dlopen(SO_DIR "/libcoverage_direct_test_1.so", RTLD_LAZY); - assert(handle1); - void (*bar1)() = (void (*)())dlsym(handle1, "bar"); - assert(bar1); - bar1(); - - return 0; -} -#endif -- 2.7.4