1 //===-- flags.cpp -----------------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "flags.h"
10 #include "common.h"
11 #include "flags_parser.h"
12 #include "interface.h"
13
14 namespace scudo {
15
getFlags()16 Flags *getFlags() {
17 static Flags F;
18 return &F;
19 }
20
setDefaults()21 void Flags::setDefaults() {
22 #define SCUDO_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
23 #include "flags.inc"
24 #undef SCUDO_FLAG
25
26 #ifdef GWP_ASAN_HOOKS
27 #define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \
28 GWP_ASAN_##Name = DefaultValue;
29 #include "gwp_asan/options.inc"
30 #undef GWP_ASAN_OPTION
31 #endif // GWP_ASAN_HOOKS
32 }
33
registerFlags(FlagParser * Parser,Flags * F)34 void registerFlags(FlagParser *Parser, Flags *F) {
35 #define SCUDO_FLAG(Type, Name, DefaultValue, Description) \
36 Parser->registerFlag(#Name, Description, FlagType::FT_##Type, \
37 reinterpret_cast<void *>(&F->Name));
38 #include "flags.inc"
39 #undef SCUDO_FLAG
40
41 #ifdef GWP_ASAN_HOOKS
42 #define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \
43 Parser->registerFlag("GWP_ASAN_" #Name, Description, FlagType::FT_##Type, \
44 reinterpret_cast<void *>(&F->GWP_ASAN_##Name));
45 #include "gwp_asan/options.inc"
46 #undef GWP_ASAN_OPTION
47 #endif // GWP_ASAN_HOOKS
48 }
49
getCompileDefinitionScudoDefaultOptions()50 static const char *getCompileDefinitionScudoDefaultOptions() {
51 #ifdef SCUDO_DEFAULT_OPTIONS
52 return STRINGIFY(SCUDO_DEFAULT_OPTIONS);
53 #else
54 return "";
55 #endif
56 }
57
getScudoDefaultOptions()58 static const char *getScudoDefaultOptions() {
59 return (&__scudo_default_options) ? __scudo_default_options() : "";
60 }
61
initFlags()62 void initFlags() {
63 Flags *F = getFlags();
64 F->setDefaults();
65 FlagParser Parser;
66 registerFlags(&Parser, F);
67 Parser.parseString(getCompileDefinitionScudoDefaultOptions());
68 Parser.parseString(getScudoDefaultOptions());
69 Parser.parseString(getEnv("SCUDO_OPTIONS"));
70 }
71
72 } // namespace scudo
73