blob: a1c0f2e127bb7cd06e876691a9e668abb2153311 [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();
Hal Finkel04234832015-04-19 20:16:13 +000040 __sanitizer_set_report_path(common_flags()->log_path);
Alexey Samsonov09dce3b2015-04-01 22:42:36 +000041 InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir);
42 CommonInit();
43 ubsan_mode = UBSAN_MODE_STANDALONE;
44}
45
46void __ubsan::InitAsStandalone() {
47 if (SANITIZER_CAN_USE_PREINIT_ARRAY) {
48 CHECK_EQ(UBSAN_MODE_UNKNOWN, ubsan_mode);
49 CommonStandaloneInit();
50 return;
Alexey Samsonov6eb53d62014-07-25 22:24:34 +000051 }
Alexey Samsonov09dce3b2015-04-01 22:42:36 +000052 SpinMutexLock l(&ubsan_init_mu);
53 CHECK_NE(UBSAN_MODE_PLUGIN, ubsan_mode);
54 if (ubsan_mode == UBSAN_MODE_UNKNOWN)
55 CommonStandaloneInit();
56}
57
58void __ubsan::InitAsStandaloneIfNecessary() {
59 if (SANITIZER_CAN_USE_PREINIT_ARRAY) {
60 CHECK_NE(UBSAN_MODE_UNKNOWN, ubsan_mode);
61 return;
62 }
63 SpinMutexLock l(&ubsan_init_mu);
64 if (ubsan_mode == UBSAN_MODE_UNKNOWN)
65 CommonStandaloneInit();
66}
67
68void __ubsan::InitAsPlugin() {
69#if !SANITIZER_CAN_USE_PREINIT_ARRAY
70 SpinMutexLock l(&ubsan_init_mu);
71#endif
72 CHECK_EQ(UBSAN_MODE_UNKNOWN, ubsan_mode);
73 CommonInit();
74 ubsan_mode = UBSAN_MODE_PLUGIN;
75}
Alexey Samsonov0781e982015-03-26 17:26:04 +000076
77#endif // CAN_SANITIZE_UB