]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/scudo/scudo_flags.cpp
Merge compiler-rt trunk r291476.
[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 = 64;
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 = 1024;
80     f->ThreadLocalQuarantineSizeKb = DefaultThreadLocalQuarantineSizeKb;
81   }
82   // And an upper limit of 128Mb for the thread quarantine cache.
83   if (f->ThreadLocalQuarantineSizeKb > (128 * 1024)) {
84     dieWithMessage("ERROR: the per thread quarantine cache size is too "
85                    "large\n");
86   }
87 }
88
89 Flags *getFlags() {
90   return &ScudoFlags;
91 }
92
93 }  // namespace __scudo