blob: 73398ceafc34209e3d4741cc09f4643d9e39449a [file] [log] [blame]
Alexey Samsonov6eb53d62014-07-25 22:24:34 +00001//===-- ubsan_init.cc -----------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Initialization of UBSan runtime.
11//
12//===----------------------------------------------------------------------===//
13
Alexey Samsonov0781e982015-03-26 17:26:04 +000014#include "ubsan_platform.h"
15#if CAN_SANITIZE_UB
Alexey Samsonovd1c31862015-02-20 17:41:59 +000016#include "ubsan_diag.h"
Alexey Samsonov6eb53d62014-07-25 22:24:34 +000017#include "ubsan_init.h"
18#include "ubsan_flags.h"
19#include "sanitizer_common/sanitizer_common.h"
20#include "sanitizer_common/sanitizer_libc.h"
Alexey Samsonov6eb53d62014-07-25 22:24:34 +000021#include "sanitizer_common/sanitizer_mutex.h"
Alexey Samsonove87e5ce2014-07-26 01:41:45 +000022#include "sanitizer_common/sanitizer_symbolizer.h"
Alexey Samsonov6eb53d62014-07-25 22:24:34 +000023
24using namespace __ubsan;
25
Alexey Samsonov09dce3b2015-04-01 22:42:36 +000026static enum {
27 UBSAN_MODE_UNKNOWN = 0,
28 UBSAN_MODE_STANDALONE,
29 UBSAN_MODE_PLUGIN
30} ubsan_mode;
31static StaticSpinMutex ubsan_init_mu;
Alexey Samsonov6eb53d62014-07-25 22:24:34 +000032
Alexey Samsonov09dce3b2015-04-01 22:42:36 +000033static void CommonInit() {
Alexey Samsonovd1c31862015-02-20 17:41:59 +000034 InitializeSuppressions();
Alexey Samsonov6eb53d62014-07-25 22:24:34 +000035}
36
Alexey Samsonov09dce3b2015-04-01 22:42:36 +000037static void CommonStandaloneInit() {
38 SanitizerToolName = "UndefinedBehaviorSanitizer";
39 InitializeFlags();
Yury Gribovc019a572015-06-04 07:29:43 +000040 CacheBinaryName();
Hal Finkel04234832015-04-19 20:16:13 +000041 __sanitizer_set_report_path(common_flags()->log_path);
Alexey Samsonov09dce3b2015-04-01 22:42:36 +000042 InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir);
43 CommonInit();
44 ubsan_mode = UBSAN_MODE_STANDALONE;
45}
46
47void __ubsan::InitAsStandalone() {
48 if (SANITIZER_CAN_USE_PREINIT_ARRAY) {
49 CHECK_EQ(UBSAN_MODE_UNKNOWN, ubsan_mode);
50 CommonStandaloneInit();
51 return;
Alexey Samsonov6eb53d62014-07-25 22:24:34 +000052 }
Alexey Samsonov09dce3b2015-04-01 22:42:36 +000053 SpinMutexLock l(&ubsan_init_mu);
54 CHECK_NE(UBSAN_MODE_PLUGIN, ubsan_mode);
55 if (ubsan_mode == UBSAN_MODE_UNKNOWN)
56 CommonStandaloneInit();
57}
58
59void __ubsan::InitAsStandaloneIfNecessary() {
60 if (SANITIZER_CAN_USE_PREINIT_ARRAY) {
61 CHECK_NE(UBSAN_MODE_UNKNOWN, ubsan_mode);
62 return;
63 }
64 SpinMutexLock l(&ubsan_init_mu);
65 if (ubsan_mode == UBSAN_MODE_UNKNOWN)
66 CommonStandaloneInit();
67}
68
69void __ubsan::InitAsPlugin() {
70#if !SANITIZER_CAN_USE_PREINIT_ARRAY
71 SpinMutexLock l(&ubsan_init_mu);
72#endif
73 CHECK_EQ(UBSAN_MODE_UNKNOWN, ubsan_mode);
74 CommonInit();
75 ubsan_mode = UBSAN_MODE_PLUGIN;
76}
Alexey Samsonov0781e982015-03-26 17:26:04 +000077
78#endif // CAN_SANITIZE_UB