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