xref: /netbsd-src/external/gpl3/gcc/dist/libsanitizer/ubsan/ubsan_init.cpp (revision ff6d591ca308ed13e9c5ae142cf113a246c2cdc6)
1*ff6d591cSmrg //===-- ubsan_init.cpp ----------------------------------------------------===//
2*ff6d591cSmrg //
3*ff6d591cSmrg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*ff6d591cSmrg // See https://llvm.org/LICENSE.txt for license information.
5*ff6d591cSmrg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*ff6d591cSmrg //
7*ff6d591cSmrg //===----------------------------------------------------------------------===//
8*ff6d591cSmrg //
9*ff6d591cSmrg // Initialization of UBSan runtime.
10*ff6d591cSmrg //
11*ff6d591cSmrg //===----------------------------------------------------------------------===//
12*ff6d591cSmrg 
13*ff6d591cSmrg #include "ubsan_platform.h"
14*ff6d591cSmrg #if CAN_SANITIZE_UB
15*ff6d591cSmrg #include "ubsan_diag.h"
16*ff6d591cSmrg #include "ubsan_init.h"
17*ff6d591cSmrg #include "ubsan_flags.h"
18*ff6d591cSmrg #include "sanitizer_common/sanitizer_common.h"
19*ff6d591cSmrg #include "sanitizer_common/sanitizer_libc.h"
20*ff6d591cSmrg #include "sanitizer_common/sanitizer_mutex.h"
21*ff6d591cSmrg #include "sanitizer_common/sanitizer_symbolizer.h"
22*ff6d591cSmrg 
23*ff6d591cSmrg using namespace __ubsan;
24*ff6d591cSmrg 
GetSanititizerToolName()25*ff6d591cSmrg const char *__ubsan::GetSanititizerToolName() {
26*ff6d591cSmrg   return "UndefinedBehaviorSanitizer";
27*ff6d591cSmrg }
28*ff6d591cSmrg 
29*ff6d591cSmrg static bool ubsan_initialized;
30*ff6d591cSmrg static StaticSpinMutex ubsan_init_mu;
31*ff6d591cSmrg 
CommonInit()32*ff6d591cSmrg static void CommonInit() {
33*ff6d591cSmrg   InitializeSuppressions();
34*ff6d591cSmrg }
35*ff6d591cSmrg 
UbsanDie()36*ff6d591cSmrg static void UbsanDie() {
37*ff6d591cSmrg   if (common_flags()->print_module_map >= 1)
38*ff6d591cSmrg     DumpProcessMap();
39*ff6d591cSmrg }
40*ff6d591cSmrg 
CommonStandaloneInit()41*ff6d591cSmrg static void CommonStandaloneInit() {
42*ff6d591cSmrg   SanitizerToolName = GetSanititizerToolName();
43*ff6d591cSmrg   CacheBinaryName();
44*ff6d591cSmrg   InitializeFlags();
45*ff6d591cSmrg   __sanitizer::InitializePlatformEarly();
46*ff6d591cSmrg   __sanitizer_set_report_path(common_flags()->log_path);
47*ff6d591cSmrg   AndroidLogInit();
48*ff6d591cSmrg   InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir);
49*ff6d591cSmrg   CommonInit();
50*ff6d591cSmrg 
51*ff6d591cSmrg   // Only add die callback when running in standalone mode to avoid printing
52*ff6d591cSmrg   // the same information from multiple sanitizers' output
53*ff6d591cSmrg   AddDieCallback(UbsanDie);
54*ff6d591cSmrg   Symbolizer::LateInitialize();
55*ff6d591cSmrg }
56*ff6d591cSmrg 
InitAsStandalone()57*ff6d591cSmrg void __ubsan::InitAsStandalone() {
58*ff6d591cSmrg   SpinMutexLock l(&ubsan_init_mu);
59*ff6d591cSmrg   if (!ubsan_initialized) {
60*ff6d591cSmrg     CommonStandaloneInit();
61*ff6d591cSmrg     ubsan_initialized = true;
62*ff6d591cSmrg   }
63*ff6d591cSmrg }
64*ff6d591cSmrg 
InitAsStandaloneIfNecessary()65*ff6d591cSmrg void __ubsan::InitAsStandaloneIfNecessary() { return InitAsStandalone(); }
66*ff6d591cSmrg 
InitAsPlugin()67*ff6d591cSmrg void __ubsan::InitAsPlugin() {
68*ff6d591cSmrg   SpinMutexLock l(&ubsan_init_mu);
69*ff6d591cSmrg   if (!ubsan_initialized) {
70*ff6d591cSmrg     CommonInit();
71*ff6d591cSmrg     ubsan_initialized = true;
72*ff6d591cSmrg   }
73*ff6d591cSmrg }
74*ff6d591cSmrg 
75*ff6d591cSmrg #endif  // CAN_SANITIZE_UB
76