xref: /openbsd-src/gnu/llvm/compiler-rt/lib/ubsan/ubsan_init.cpp (revision 810390e339a5425391477d5d41c78d7cab2424ac)
13cab2bb3Spatrick //===-- ubsan_init.cpp ----------------------------------------------------===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick //
93cab2bb3Spatrick // Initialization of UBSan runtime.
103cab2bb3Spatrick //
113cab2bb3Spatrick //===----------------------------------------------------------------------===//
123cab2bb3Spatrick 
133cab2bb3Spatrick #include "ubsan_platform.h"
143cab2bb3Spatrick #if CAN_SANITIZE_UB
153cab2bb3Spatrick #include "sanitizer_common/sanitizer_common.h"
16*810390e3Srobert #include "sanitizer_common/sanitizer_interface_internal.h"
173cab2bb3Spatrick #include "sanitizer_common/sanitizer_libc.h"
183cab2bb3Spatrick #include "sanitizer_common/sanitizer_mutex.h"
193cab2bb3Spatrick #include "sanitizer_common/sanitizer_symbolizer.h"
20*810390e3Srobert #include "ubsan_diag.h"
21*810390e3Srobert #include "ubsan_flags.h"
22*810390e3Srobert #include "ubsan_init.h"
233cab2bb3Spatrick 
243cab2bb3Spatrick using namespace __ubsan;
253cab2bb3Spatrick 
GetSanititizerToolName()263cab2bb3Spatrick const char *__ubsan::GetSanititizerToolName() {
273cab2bb3Spatrick   return "UndefinedBehaviorSanitizer";
283cab2bb3Spatrick }
293cab2bb3Spatrick 
303cab2bb3Spatrick static bool ubsan_initialized;
313cab2bb3Spatrick static StaticSpinMutex ubsan_init_mu;
323cab2bb3Spatrick 
CommonInit()333cab2bb3Spatrick static void CommonInit() {
343cab2bb3Spatrick   InitializeSuppressions();
353cab2bb3Spatrick }
363cab2bb3Spatrick 
UbsanDie()37d89ec533Spatrick static void UbsanDie() {
38d89ec533Spatrick   if (common_flags()->print_module_map >= 1)
39d89ec533Spatrick     DumpProcessMap();
40d89ec533Spatrick }
41d89ec533Spatrick 
CommonStandaloneInit()423cab2bb3Spatrick static void CommonStandaloneInit() {
433cab2bb3Spatrick   SanitizerToolName = GetSanititizerToolName();
443cab2bb3Spatrick   CacheBinaryName();
453cab2bb3Spatrick   InitializeFlags();
461f9cb04fSpatrick   __sanitizer::InitializePlatformEarly();
473cab2bb3Spatrick   __sanitizer_set_report_path(common_flags()->log_path);
483cab2bb3Spatrick   AndroidLogInit();
493cab2bb3Spatrick   InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir);
503cab2bb3Spatrick   CommonInit();
51d89ec533Spatrick 
52d89ec533Spatrick   // Only add die callback when running in standalone mode to avoid printing
53d89ec533Spatrick   // the same information from multiple sanitizers' output
54d89ec533Spatrick   AddDieCallback(UbsanDie);
551f9cb04fSpatrick   Symbolizer::LateInitialize();
563cab2bb3Spatrick }
573cab2bb3Spatrick 
InitAsStandalone()583cab2bb3Spatrick void __ubsan::InitAsStandalone() {
593cab2bb3Spatrick   SpinMutexLock l(&ubsan_init_mu);
603cab2bb3Spatrick   if (!ubsan_initialized) {
613cab2bb3Spatrick     CommonStandaloneInit();
623cab2bb3Spatrick     ubsan_initialized = true;
633cab2bb3Spatrick   }
643cab2bb3Spatrick }
653cab2bb3Spatrick 
InitAsStandaloneIfNecessary()663cab2bb3Spatrick void __ubsan::InitAsStandaloneIfNecessary() { return InitAsStandalone(); }
673cab2bb3Spatrick 
InitAsPlugin()683cab2bb3Spatrick void __ubsan::InitAsPlugin() {
693cab2bb3Spatrick   SpinMutexLock l(&ubsan_init_mu);
703cab2bb3Spatrick   if (!ubsan_initialized) {
713cab2bb3Spatrick     CommonInit();
723cab2bb3Spatrick     ubsan_initialized = true;
733cab2bb3Spatrick   }
743cab2bb3Spatrick }
753cab2bb3Spatrick 
763cab2bb3Spatrick #endif  // CAN_SANITIZE_UB
77