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
13#include "scudo/interface.h"
14
15namespace scudo {
16
17Flags *getFlags() {
18 static Flags F;
19 return &F;
20}
21
22void Flags::setDefaults() {
23#define SCUDO_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
24#include "flags.inc"
25#undef SCUDO_FLAG
26
27#ifdef GWP_ASAN_HOOKS
28#define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \
29 GWP_ASAN_##Name = DefaultValue;
30#include "gwp_asan/options.inc"
31#undef GWP_ASAN_OPTION
32#endif // GWP_ASAN_HOOKS
33}
34
35void registerFlags(FlagParser *Parser, Flags *F) {
36#define SCUDO_FLAG(Type, Name, DefaultValue, Description) \
37 Parser->registerFlag(#Name, Description, FlagType::FT_##Type, \
38 reinterpret_cast<void *>(&F->Name));
39#include "flags.inc"
40#undef SCUDO_FLAG
41
42#ifdef GWP_ASAN_HOOKS
43#define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \
44 Parser->registerFlag("GWP_ASAN_" #Name, Description, FlagType::FT_##Type, \
45 reinterpret_cast<void *>(&F->GWP_ASAN_##Name));
46#include "gwp_asan/options.inc"
47#undef GWP_ASAN_OPTION
48#endif // GWP_ASAN_HOOKS
49}
50
51static const char *getCompileDefinitionScudoDefaultOptions() {
52#ifdef SCUDO_DEFAULT_OPTIONS
53 return STRINGIFY(SCUDO_DEFAULT_OPTIONS);
54#else
55 return "";
56#endif
57}
58
59static const char *getScudoDefaultOptions() {
60 return (&__scudo_default_options) ? __scudo_default_options() : "";
61}
62
63void initFlags() {
64 Flags *F = getFlags();
65 F->setDefaults();
66 FlagParser Parser;
67 registerFlags(Parser: &Parser, F);
68 Parser.parseString(S: getCompileDefinitionScudoDefaultOptions());
69 Parser.parseString(S: getScudoDefaultOptions());
70 Parser.parseString(S: getEnv(Name: "SCUDO_OPTIONS"));
71 if (const char *V = getEnv(Name: "SCUDO_ALLOCATION_RING_BUFFER_SIZE")) {
72 Parser.parseStringPair(Name: "allocation_ring_buffer_size", Value: V);
73 }
74}
75
76} // namespace scudo
77