1353944Sdim//===-- ubsan_init.cpp ----------------------------------------------------===// 2353944Sdim// 3353944Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353944Sdim// See https://llvm.org/LICENSE.txt for license information. 5353944Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6353944Sdim// 7353944Sdim//===----------------------------------------------------------------------===// 8353944Sdim// 9353944Sdim// Initialization of UBSan runtime. 10353944Sdim// 11353944Sdim//===----------------------------------------------------------------------===// 12353944Sdim 13353944Sdim#include "ubsan_platform.h" 14353944Sdim#if CAN_SANITIZE_UB 15353944Sdim#include "ubsan_diag.h" 16353944Sdim#include "ubsan_init.h" 17353944Sdim#include "ubsan_flags.h" 18353944Sdim#include "sanitizer_common/sanitizer_common.h" 19353944Sdim#include "sanitizer_common/sanitizer_libc.h" 20353944Sdim#include "sanitizer_common/sanitizer_mutex.h" 21353944Sdim#include "sanitizer_common/sanitizer_symbolizer.h" 22353944Sdim 23353944Sdimusing namespace __ubsan; 24353944Sdim 25353944Sdimconst char *__ubsan::GetSanititizerToolName() { 26353944Sdim return "UndefinedBehaviorSanitizer"; 27353944Sdim} 28353944Sdim 29353944Sdimstatic bool ubsan_initialized; 30353944Sdimstatic StaticSpinMutex ubsan_init_mu; 31353944Sdim 32353944Sdimstatic void CommonInit() { 33353944Sdim InitializeSuppressions(); 34353944Sdim} 35353944Sdim 36353944Sdimstatic void CommonStandaloneInit() { 37353944Sdim SanitizerToolName = GetSanititizerToolName(); 38353944Sdim CacheBinaryName(); 39353944Sdim InitializeFlags(); 40353944Sdim __sanitizer_set_report_path(common_flags()->log_path); 41353944Sdim AndroidLogInit(); 42353944Sdim InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); 43353944Sdim CommonInit(); 44353944Sdim} 45353944Sdim 46353944Sdimvoid __ubsan::InitAsStandalone() { 47353944Sdim SpinMutexLock l(&ubsan_init_mu); 48353944Sdim if (!ubsan_initialized) { 49353944Sdim CommonStandaloneInit(); 50353944Sdim ubsan_initialized = true; 51353944Sdim } 52353944Sdim} 53353944Sdim 54353944Sdimvoid __ubsan::InitAsStandaloneIfNecessary() { return InitAsStandalone(); } 55353944Sdim 56353944Sdimvoid __ubsan::InitAsPlugin() { 57353944Sdim SpinMutexLock l(&ubsan_init_mu); 58353944Sdim if (!ubsan_initialized) { 59353944Sdim CommonInit(); 60353944Sdim ubsan_initialized = true; 61353944Sdim } 62353944Sdim} 63353944Sdim 64353944Sdim#endif // CAN_SANITIZE_UB 65