blob: eda7557a006fd9ea056bac2747af79588c104f59 [file] [log] [blame]
Stephen Hines6d186232014-11-26 17:56:19 -08001//===-- ubsan_flags.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// Runtime flags for UndefinedBehaviorSanitizer.
11//
12//===----------------------------------------------------------------------===//
13
Pirama Arumuga Nainar7c915052015-04-08 08:58:29 -070014#include "ubsan_platform.h"
15#if CAN_SANITIZE_UB
Stephen Hines6d186232014-11-26 17:56:19 -080016#include "ubsan_flags.h"
17#include "sanitizer_common/sanitizer_common.h"
18#include "sanitizer_common/sanitizer_flags.h"
Stephen Hines86277eb2015-03-23 12:06:32 -070019#include "sanitizer_common/sanitizer_flag_parser.h"
Stephen Hines6d186232014-11-26 17:56:19 -080020
21namespace __ubsan {
22
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070023const char *MaybeCallUbsanDefaultOptions() {
Stephen Hines6d186232014-11-26 17:56:19 -080024 return (&__ubsan_default_options) ? __ubsan_default_options() : "";
25}
26
Stephen Hines6d186232014-11-26 17:56:19 -080027Flags ubsan_flags;
28
Stephen Hines86277eb2015-03-23 12:06:32 -070029void Flags::SetDefaults() {
30#define UBSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
31#include "ubsan_flags.inc"
32#undef UBSAN_FLAG
Stephen Hines6d186232014-11-26 17:56:19 -080033}
34
Stephen Hines86277eb2015-03-23 12:06:32 -070035void RegisterUbsanFlags(FlagParser *parser, Flags *f) {
36#define UBSAN_FLAG(Type, Name, DefaultValue, Description) \
37 RegisterFlag(parser, #Name, Description, &f->Name);
38#include "ubsan_flags.inc"
39#undef UBSAN_FLAG
40}
41
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070042void InitializeFlags() {
43 SetCommonFlagsDefaults();
44 {
Stephen Hines86277eb2015-03-23 12:06:32 -070045 CommonFlags cf;
46 cf.CopyFrom(*common_flags());
47 cf.print_summary = false;
48 OverrideCommonFlags(cf);
Stephen Hines86277eb2015-03-23 12:06:32 -070049 }
50
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070051 Flags *f = flags();
Stephen Hines86277eb2015-03-23 12:06:32 -070052 f->SetDefaults();
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070053
54 FlagParser parser;
55 RegisterCommonFlags(&parser);
56 RegisterUbsanFlags(&parser, f);
57
Stephen Hines6d186232014-11-26 17:56:19 -080058 // Override from user-specified string.
Stephen Hines86277eb2015-03-23 12:06:32 -070059 parser.ParseString(MaybeCallUbsanDefaultOptions());
Stephen Hines6d186232014-11-26 17:56:19 -080060 // Override from environment variable.
Stephen Hines86277eb2015-03-23 12:06:32 -070061 parser.ParseString(GetEnv("UBSAN_OPTIONS"));
62 SetVerbosity(common_flags()->verbosity);
Stephen Hines6d186232014-11-26 17:56:19 -080063}
64
65} // namespace __ubsan
66
67#if !SANITIZER_SUPPORTS_WEAK_HOOKS
68extern "C" {
69SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
70const char *__ubsan_default_options() { return ""; }
71} // extern "C"
72#endif
Pirama Arumuga Nainar7c915052015-04-08 08:58:29 -070073
74#endif // CAN_SANITIZE_UB