]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/scudo/scudo_flags.cpp
Merge llvm, clang, lld, lldb, compiler-rt and libc++ r303571, and update
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / scudo / scudo_flags.cpp
1 //===-- scudo_flags.cpp -----------------------------------------*- C++ -*-===//
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 /// Hardened Allocator flag parsing logic.
11 ///
12 //===----------------------------------------------------------------------===//
13
14 #include "scudo_flags.h"
15 #include "scudo_utils.h"
16
17 #include "sanitizer_common/sanitizer_flags.h"
18 #include "sanitizer_common/sanitizer_flag_parser.h"
19
20 extern "C" SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
21 const char* __scudo_default_options();
22
23 namespace __scudo {
24
25 Flags ScudoFlags;  // Use via getFlags().
26
27 void Flags::setDefaults() {
28 #define SCUDO_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
29 #include "scudo_flags.inc"
30 #undef SCUDO_FLAG
31 }
32
33 static void RegisterScudoFlags(FlagParser *parser, Flags *f) {
34 #define SCUDO_FLAG(Type, Name, DefaultValue, Description) \
35   RegisterFlag(parser, #Name, Description, &f->Name);
36 #include "scudo_flags.inc"
37 #undef SCUDO_FLAG
38 }
39
40 static const char *callGetScudoDefaultOptions() {
41   return (&__scudo_default_options) ? __scudo_default_options() : "";
42 }
43
44 void initFlags() {
45   SetCommonFlagsDefaults();
46   {
47     CommonFlags cf;
48     cf.CopyFrom(*common_flags());
49     cf.exitcode = 1;
50     OverrideCommonFlags(cf);
51   }
52   Flags *f = getFlags();
53   f->setDefaults();
54
55   FlagParser ScudoParser;
56   RegisterScudoFlags(&ScudoParser, f);
57   RegisterCommonFlags(&ScudoParser);
58
59   // Override from user-specified string.
60   const char *ScudoDefaultOptions = callGetScudoDefaultOptions();
61   ScudoParser.ParseString(ScudoDefaultOptions);
62
63   // Override from environment.
64   ScudoParser.ParseString(GetEnv("SCUDO_OPTIONS"));
65
66   InitializeCommonFlags();
67
68   // Sanity checks and default settings for the Quarantine parameters.
69
70   if (f->QuarantineSizeMb < 0) {
71     const int DefaultQuarantineSizeMb = FIRST_32_SECOND_64(4, 16);
72     f->QuarantineSizeMb = DefaultQuarantineSizeMb;
73   }
74   // We enforce an upper limit for the quarantine size of 4Gb.
75   if (f->QuarantineSizeMb > (4 * 1024)) {
76     dieWithMessage("ERROR: the quarantine size is too large\n");
77   }
78   if (f->ThreadLocalQuarantineSizeKb < 0) {
79     const int DefaultThreadLocalQuarantineSizeKb =
80         FIRST_32_SECOND_64(64, 256);
81     f->ThreadLocalQuarantineSizeKb = DefaultThreadLocalQuarantineSizeKb;
82   }
83   // And an upper limit of 128Mb for the thread quarantine cache.
84   if (f->ThreadLocalQuarantineSizeKb > (128 * 1024)) {
85     dieWithMessage("ERROR: the per thread quarantine cache size is too "
86                    "large\n");
87   }
88   if (f->ThreadLocalQuarantineSizeKb == 0 && f->QuarantineSizeMb > 0) {
89     dieWithMessage("ERROR: ThreadLocalQuarantineSizeKb can be set to 0 only "
90                    "when QuarantineSizeMb is set to 0\n");
91   }
92 }
93
94 Flags *getFlags() {
95   return &ScudoFlags;
96 }
97
98 }  // namespace __scudo