1*a7c257b0Skamil //===-- ubsan_init.cc -----------------------------------------------------===// 2*a7c257b0Skamil // 3*a7c257b0Skamil // The LLVM Compiler Infrastructure 4*a7c257b0Skamil // 5*a7c257b0Skamil // This file is distributed under the University of Illinois Open Source 6*a7c257b0Skamil // License. See LICENSE.TXT for details. 7*a7c257b0Skamil // 8*a7c257b0Skamil //===----------------------------------------------------------------------===// 9*a7c257b0Skamil // 10*a7c257b0Skamil // Initialization of UBSan runtime. 11*a7c257b0Skamil // 12*a7c257b0Skamil //===----------------------------------------------------------------------===// 13*a7c257b0Skamil 14*a7c257b0Skamil #include "ubsan_platform.h" 15*a7c257b0Skamil #if CAN_SANITIZE_UB 16*a7c257b0Skamil #include "ubsan_diag.h" 17*a7c257b0Skamil #include "ubsan_init.h" 18*a7c257b0Skamil #include "ubsan_flags.h" 19*a7c257b0Skamil #include "sanitizer_common/sanitizer_common.h" 20*a7c257b0Skamil #include "sanitizer_common/sanitizer_libc.h" 21*a7c257b0Skamil #include "sanitizer_common/sanitizer_mutex.h" 22*a7c257b0Skamil #include "sanitizer_common/sanitizer_symbolizer.h" 23*a7c257b0Skamil 24*a7c257b0Skamil using namespace __ubsan; 25*a7c257b0Skamil GetSanititizerToolName()26*a7c257b0Skamilconst char *__ubsan::GetSanititizerToolName() { 27*a7c257b0Skamil return "UndefinedBehaviorSanitizer"; 28*a7c257b0Skamil } 29*a7c257b0Skamil 30*a7c257b0Skamil static bool ubsan_initialized; 31*a7c257b0Skamil static StaticSpinMutex ubsan_init_mu; 32*a7c257b0Skamil CommonInit()33*a7c257b0Skamilstatic void CommonInit() { 34*a7c257b0Skamil InitializeSuppressions(); 35*a7c257b0Skamil } 36*a7c257b0Skamil CommonStandaloneInit()37*a7c257b0Skamilstatic void CommonStandaloneInit() { 38*a7c257b0Skamil SanitizerToolName = GetSanititizerToolName(); 39*a7c257b0Skamil CacheBinaryName(); 40*a7c257b0Skamil InitializeFlags(); 41*a7c257b0Skamil __sanitizer_set_report_path(common_flags()->log_path); 42*a7c257b0Skamil AndroidLogInit(); 43*a7c257b0Skamil InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); 44*a7c257b0Skamil CommonInit(); 45*a7c257b0Skamil } 46*a7c257b0Skamil InitAsStandalone()47*a7c257b0Skamilvoid __ubsan::InitAsStandalone() { 48*a7c257b0Skamil SpinMutexLock l(&ubsan_init_mu); 49*a7c257b0Skamil if (!ubsan_initialized) { 50*a7c257b0Skamil CommonStandaloneInit(); 51*a7c257b0Skamil ubsan_initialized = true; 52*a7c257b0Skamil } 53*a7c257b0Skamil } 54*a7c257b0Skamil InitAsStandaloneIfNecessary()55*a7c257b0Skamilvoid __ubsan::InitAsStandaloneIfNecessary() { return InitAsStandalone(); } 56*a7c257b0Skamil InitAsPlugin()57*a7c257b0Skamilvoid __ubsan::InitAsPlugin() { 58*a7c257b0Skamil SpinMutexLock l(&ubsan_init_mu); 59*a7c257b0Skamil if (!ubsan_initialized) { 60*a7c257b0Skamil CommonInit(); 61*a7c257b0Skamil ubsan_initialized = true; 62*a7c257b0Skamil } 63*a7c257b0Skamil } 64*a7c257b0Skamil 65*a7c257b0Skamil #endif // CAN_SANITIZE_UB 66