summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlexey Samsonov <vonosmas@gmail.com>2014-09-11 18:20:11 +0000
committerAlexey Samsonov <vonosmas@gmail.com>2014-09-11 18:20:11 +0000
commit3451762a4db1036b0576cbaa9d1a1309b981a634 (patch)
treed457304501d4d32dd7b940164775841c6e963e3f /lib
parentcc6a14da1bb23233c0fa2c83b72587a1279bd4ca (diff)
[UBSan] Parse common flags from UBSAN_OPTIONS runtime variable even if
UBSan is combined with ASan. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@217616 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/sanitizer_common/sanitizer_flags.cc6
-rw-r--r--lib/sanitizer_common/sanitizer_flags.h3
-rw-r--r--lib/ubsan/ubsan_flags.cc3
-rw-r--r--lib/ubsan/ubsan_flags.h1
-rw-r--r--lib/ubsan/ubsan_init.cc8
5 files changed, 12 insertions, 9 deletions
diff --git a/lib/sanitizer_common/sanitizer_flags.cc b/lib/sanitizer_common/sanitizer_flags.cc
index 881cc3e7f..8482751ec 100644
--- a/lib/sanitizer_common/sanitizer_flags.cc
+++ b/lib/sanitizer_common/sanitizer_flags.cc
@@ -20,6 +20,7 @@
namespace __sanitizer {
CommonFlags common_flags_dont_use;
+bool common_flags_defaults_set = false;
struct FlagDescription {
const char *name;
@@ -35,6 +36,11 @@ IntrusiveList<FlagDescription> flag_descriptions;
#endif
void SetCommonFlagsDefaults(CommonFlags *f) {
+ CHECK_EQ(common_flags(), f);
+ if (common_flags_defaults_set)
+ return;
+ common_flags_defaults_set = true;
+
f->symbolize = true;
f->external_symbolizer_path = 0;
f->allow_addr2line = false;
diff --git a/lib/sanitizer_common/sanitizer_flags.h b/lib/sanitizer_common/sanitizer_flags.h
index 97641a6c4..256ca8ce8 100644
--- a/lib/sanitizer_common/sanitizer_flags.h
+++ b/lib/sanitizer_common/sanitizer_flags.h
@@ -67,7 +67,10 @@ inline CommonFlags *common_flags() {
return &common_flags_dont_use;
}
+// Sets default values for common flags. If called multiple times,
+// sets default values only once.
void SetCommonFlagsDefaults(CommonFlags *f);
+
void ParseCommonFlagsFromString(CommonFlags *f, const char *str);
void PrintFlagDescriptions();
diff --git a/lib/ubsan/ubsan_flags.cc b/lib/ubsan/ubsan_flags.cc
index 843f9a6c5..ae15fd389 100644
--- a/lib/ubsan/ubsan_flags.cc
+++ b/lib/ubsan/ubsan_flags.cc
@@ -28,7 +28,7 @@ static const char *GetRuntimeFlagsFromCompileDefinition() {
#endif
}
-void InitializeCommonFlags() {
+static void InitializeCommonFlags() {
CommonFlags *cf = common_flags();
SetCommonFlagsDefaults(cf);
cf->print_summary = false;
@@ -50,6 +50,7 @@ static void ParseFlagsFromString(Flags *f, const char *str) {
}
void InitializeFlags() {
+ InitializeCommonFlags();
Flags *f = flags();
// Default values.
f->halt_on_error = false;
diff --git a/lib/ubsan/ubsan_flags.h b/lib/ubsan/ubsan_flags.h
index 3b1a59e4e..f41afbd07 100644
--- a/lib/ubsan/ubsan_flags.h
+++ b/lib/ubsan/ubsan_flags.h
@@ -23,7 +23,6 @@ struct Flags {
extern Flags ubsan_flags;
inline Flags *flags() { return &ubsan_flags; }
-void InitializeCommonFlags();
void InitializeFlags();
} // namespace __ubsan
diff --git a/lib/ubsan/ubsan_init.cc b/lib/ubsan/ubsan_init.cc
index 6080e304c..2649346b1 100644
--- a/lib/ubsan/ubsan_init.cc
+++ b/lib/ubsan/ubsan_init.cc
@@ -32,15 +32,9 @@ void __ubsan::InitIfNecessary() {
if (LIKELY(ubsan_inited))
return;
if (0 == internal_strcmp(SanitizerToolName, "SanitizerTool")) {
- // WARNING: If this condition holds, then either UBSan runs in a standalone
- // mode, or initializer for another sanitizer hasn't run yet. In a latter
- // case, another sanitizer will overwrite "SanitizerToolName" and reparse
- // common flags. It means, that we are not allowed to *use* common flags
- // in this function.
+ // This will be overwritten if another sanitizer will initialize later.
SanitizerToolName = "UndefinedBehaviorSanitizer";
- InitializeCommonFlags();
}
- // Initialize UBSan-specific flags.
InitializeFlags();
SuppressionContext::InitIfNecessary();
ubsan_inited = true;