1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/test/clang_profiling.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include "base/no_destructor.h" 8*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/lock.h" 9*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker extern "C" int __llvm_profile_dump(void); 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker namespace base { 14*6777b538SAndroid Build Coastguard Worker WriteClangProfilingProfile()15*6777b538SAndroid Build Coastguard Workervoid WriteClangProfilingProfile() { 16*6777b538SAndroid Build Coastguard Worker // __llvm_profile_dump() guarantees that it will not dump profiling 17*6777b538SAndroid Build Coastguard Worker // information if it is being called twice or more. However, it is not thread 18*6777b538SAndroid Build Coastguard Worker // safe, as it is supposed to be called from atexit() handler rather than 19*6777b538SAndroid Build Coastguard Worker // being called directly from random places. Since we have to call it 20*6777b538SAndroid Build Coastguard Worker // ourselves, we must ensure thread safety in order to prevent duplication of 21*6777b538SAndroid Build Coastguard Worker // profiling counters. 22*6777b538SAndroid Build Coastguard Worker static base::NoDestructor<base::Lock> lock; 23*6777b538SAndroid Build Coastguard Worker base::AutoLock auto_lock(*lock); 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker // Fuchsia's profile runtime does not handle profile dumping. 26*6777b538SAndroid Build Coastguard Worker // Coverage builds are built with runtime counter relocation and are expected to 27*6777b538SAndroid Build Coastguard Worker // be run under continuous coverage mode (enabled by adding %c to the 28*6777b538SAndroid Build Coastguard Worker // LLVM_PROFILE_FILE environment variable), which updates counters in real time, 29*6777b538SAndroid Build Coastguard Worker // so __llvm_profile_dump() is not needed. 30*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(USE_CLANG_COVERAGE) 31*6777b538SAndroid Build Coastguard Worker __llvm_profile_dump(); 32*6777b538SAndroid Build Coastguard Worker #endif // !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(USE_CLANG_COVERAGE) 33*6777b538SAndroid Build Coastguard Worker } 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker } // namespace base 36