168d75effSDimitry Andric //===-- ubsan_init.cpp ----------------------------------------------------===// 268d75effSDimitry Andric // 368d75effSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 468d75effSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 568d75effSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 668d75effSDimitry Andric // 768d75effSDimitry Andric //===----------------------------------------------------------------------===// 868d75effSDimitry Andric // 968d75effSDimitry Andric // Initialization of UBSan runtime. 1068d75effSDimitry Andric // 1168d75effSDimitry Andric //===----------------------------------------------------------------------===// 1268d75effSDimitry Andric 1368d75effSDimitry Andric #include "ubsan_platform.h" 1468d75effSDimitry Andric #if CAN_SANITIZE_UB 1568d75effSDimitry Andric #include "ubsan_diag.h" 1668d75effSDimitry Andric #include "ubsan_init.h" 1768d75effSDimitry Andric #include "ubsan_flags.h" 1868d75effSDimitry Andric #include "sanitizer_common/sanitizer_common.h" 1968d75effSDimitry Andric #include "sanitizer_common/sanitizer_libc.h" 2068d75effSDimitry Andric #include "sanitizer_common/sanitizer_mutex.h" 2168d75effSDimitry Andric #include "sanitizer_common/sanitizer_symbolizer.h" 2268d75effSDimitry Andric 2368d75effSDimitry Andric using namespace __ubsan; 2468d75effSDimitry Andric 2568d75effSDimitry Andric const char *__ubsan::GetSanititizerToolName() { 2668d75effSDimitry Andric return "UndefinedBehaviorSanitizer"; 2768d75effSDimitry Andric } 2868d75effSDimitry Andric 2968d75effSDimitry Andric static bool ubsan_initialized; 3068d75effSDimitry Andric static StaticSpinMutex ubsan_init_mu; 3168d75effSDimitry Andric 3268d75effSDimitry Andric static void CommonInit() { 3368d75effSDimitry Andric InitializeSuppressions(); 3468d75effSDimitry Andric } 3568d75effSDimitry Andric 36*fe6060f1SDimitry Andric static void UbsanDie() { 37*fe6060f1SDimitry Andric if (common_flags()->print_module_map >= 1) 38*fe6060f1SDimitry Andric DumpProcessMap(); 39*fe6060f1SDimitry Andric } 40*fe6060f1SDimitry Andric 4168d75effSDimitry Andric static void CommonStandaloneInit() { 4268d75effSDimitry Andric SanitizerToolName = GetSanititizerToolName(); 4368d75effSDimitry Andric CacheBinaryName(); 4468d75effSDimitry Andric InitializeFlags(); 455ffd83dbSDimitry Andric __sanitizer::InitializePlatformEarly(); 4668d75effSDimitry Andric __sanitizer_set_report_path(common_flags()->log_path); 4768d75effSDimitry Andric AndroidLogInit(); 4868d75effSDimitry Andric InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); 4968d75effSDimitry Andric CommonInit(); 50*fe6060f1SDimitry Andric 51*fe6060f1SDimitry Andric // Only add die callback when running in standalone mode to avoid printing 52*fe6060f1SDimitry Andric // the same information from multiple sanitizers' output 53*fe6060f1SDimitry Andric AddDieCallback(UbsanDie); 545ffd83dbSDimitry Andric Symbolizer::LateInitialize(); 5568d75effSDimitry Andric } 5668d75effSDimitry Andric 5768d75effSDimitry Andric void __ubsan::InitAsStandalone() { 5868d75effSDimitry Andric SpinMutexLock l(&ubsan_init_mu); 5968d75effSDimitry Andric if (!ubsan_initialized) { 6068d75effSDimitry Andric CommonStandaloneInit(); 6168d75effSDimitry Andric ubsan_initialized = true; 6268d75effSDimitry Andric } 6368d75effSDimitry Andric } 6468d75effSDimitry Andric 6568d75effSDimitry Andric void __ubsan::InitAsStandaloneIfNecessary() { return InitAsStandalone(); } 6668d75effSDimitry Andric 6768d75effSDimitry Andric void __ubsan::InitAsPlugin() { 6868d75effSDimitry Andric SpinMutexLock l(&ubsan_init_mu); 6968d75effSDimitry Andric if (!ubsan_initialized) { 7068d75effSDimitry Andric CommonInit(); 7168d75effSDimitry Andric ubsan_initialized = true; 7268d75effSDimitry Andric } 7368d75effSDimitry Andric } 7468d75effSDimitry Andric 7568d75effSDimitry Andric #endif // CAN_SANITIZE_UB 76