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