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()263cab2bb3Spatrickconst char *__ubsan::GetSanititizerToolName() { 273cab2bb3Spatrick return "UndefinedBehaviorSanitizer"; 283cab2bb3Spatrick } 293cab2bb3Spatrick 303cab2bb3Spatrick static bool ubsan_initialized; 313cab2bb3Spatrick static StaticSpinMutex ubsan_init_mu; 323cab2bb3Spatrick CommonInit()333cab2bb3Spatrickstatic void CommonInit() { 343cab2bb3Spatrick InitializeSuppressions(); 353cab2bb3Spatrick } 363cab2bb3Spatrick UbsanDie()37d89ec533Spatrickstatic void UbsanDie() { 38d89ec533Spatrick if (common_flags()->print_module_map >= 1) 39d89ec533Spatrick DumpProcessMap(); 40d89ec533Spatrick } 41d89ec533Spatrick CommonStandaloneInit()423cab2bb3Spatrickstatic 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()583cab2bb3Spatrickvoid __ubsan::InitAsStandalone() { 593cab2bb3Spatrick SpinMutexLock l(&ubsan_init_mu); 603cab2bb3Spatrick if (!ubsan_initialized) { 613cab2bb3Spatrick CommonStandaloneInit(); 623cab2bb3Spatrick ubsan_initialized = true; 633cab2bb3Spatrick } 643cab2bb3Spatrick } 653cab2bb3Spatrick InitAsStandaloneIfNecessary()663cab2bb3Spatrickvoid __ubsan::InitAsStandaloneIfNecessary() { return InitAsStandalone(); } 673cab2bb3Spatrick InitAsPlugin()683cab2bb3Spatrickvoid __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