ubsan_init.cc revision 276789
1276789Sdim//===-- ubsan_init.cc -----------------------------------------------------===// 2276789Sdim// 3276789Sdim// The LLVM Compiler Infrastructure 4276789Sdim// 5276789Sdim// This file is distributed under the University of Illinois Open Source 6276789Sdim// License. See LICENSE.TXT for details. 7276789Sdim// 8276789Sdim//===----------------------------------------------------------------------===// 9276789Sdim// 10276789Sdim// Initialization of UBSan runtime. 11276789Sdim// 12276789Sdim//===----------------------------------------------------------------------===// 13276789Sdim 14276789Sdim#include "ubsan_init.h" 15276789Sdim#include "ubsan_flags.h" 16276789Sdim#include "sanitizer_common/sanitizer_common.h" 17276789Sdim#include "sanitizer_common/sanitizer_libc.h" 18276789Sdim#include "sanitizer_common/sanitizer_mutex.h" 19276789Sdim#include "sanitizer_common/sanitizer_suppressions.h" 20276789Sdim#include "sanitizer_common/sanitizer_symbolizer.h" 21276789Sdim 22276789Sdimusing namespace __ubsan; 23276789Sdim 24276789Sdimstatic bool ubsan_inited; 25276789Sdim 26276789Sdimvoid __ubsan::InitIfNecessary() { 27276789Sdim#if !SANITIZER_CAN_USE_PREINIT_ARRAY 28276789Sdim // No need to lock mutex if we're initializing from preinit array. 29276789Sdim static StaticSpinMutex init_mu; 30276789Sdim SpinMutexLock l(&init_mu); 31276789Sdim#endif 32276789Sdim if (LIKELY(ubsan_inited)) 33276789Sdim return; 34276789Sdim if (0 == internal_strcmp(SanitizerToolName, "SanitizerTool")) { 35276789Sdim // WARNING: If this condition holds, then either UBSan runs in a standalone 36276789Sdim // mode, or initializer for another sanitizer hasn't run yet. In a latter 37276789Sdim // case, another sanitizer will overwrite "SanitizerToolName" and reparse 38276789Sdim // common flags. It means, that we are not allowed to *use* common flags 39276789Sdim // in this function. 40276789Sdim SanitizerToolName = "UndefinedBehaviorSanitizer"; 41276789Sdim InitializeCommonFlags(); 42276789Sdim } 43276789Sdim // Initialize UBSan-specific flags. 44276789Sdim InitializeFlags(); 45276789Sdim SuppressionContext::InitIfNecessary(); 46276789Sdim ubsan_inited = true; 47276789Sdim} 48276789Sdim 49276789Sdim#if SANITIZER_CAN_USE_PREINIT_ARRAY 50276789Sdim__attribute__((section(".preinit_array"), used)) 51276789Sdimvoid (*__local_ubsan_preinit)(void) = __ubsan::InitIfNecessary; 52276789Sdim#else 53276789Sdim// Use a dynamic initializer. 54276789Sdimclass UbsanInitializer { 55276789Sdim public: 56276789Sdim UbsanInitializer() { 57276789Sdim InitIfNecessary(); 58276789Sdim } 59276789Sdim}; 60276789Sdimstatic UbsanInitializer ubsan_initializer; 61276789Sdim#endif // SANITIZER_CAN_USE_PREINIT_ARRAY 62