flags.cpp revision 360784
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
14namespace scudo {
15
16Flags *getFlags() {
17  static Flags F;
18  return &F;
19}
20
21void 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
34void 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
50static const char *getCompileDefinitionScudoDefaultOptions() {
51#ifdef SCUDO_DEFAULT_OPTIONS
52  return STRINGIFY(SCUDO_DEFAULT_OPTIONS);
53#else
54  return "";
55#endif
56}
57
58static const char *getScudoDefaultOptions() {
59  return (&__scudo_default_options) ? __scudo_default_options() : "";
60}
61
62void 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