xref: /netbsd-src/sys/external/bsd/compiler_rt/dist/lib/ubsan/ubsan_init.cc (revision a7c257b03e4462df2b1020128fb82716512d7856)
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*a7c257b0Skamil const 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*a7c257b0Skamil static void CommonInit() {
34*a7c257b0Skamil   InitializeSuppressions();
35*a7c257b0Skamil }
36*a7c257b0Skamil 
CommonStandaloneInit()37*a7c257b0Skamil static 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*a7c257b0Skamil void __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*a7c257b0Skamil void __ubsan::InitAsStandaloneIfNecessary() { return InitAsStandalone(); }
56*a7c257b0Skamil 
InitAsPlugin()57*a7c257b0Skamil void __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