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