13cab2bb3Spatrick //===-- flags.cpp -----------------------------------------------*- C++ -*-===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick
93cab2bb3Spatrick #include "flags.h"
103cab2bb3Spatrick #include "common.h"
113cab2bb3Spatrick #include "flags_parser.h"
12*1f9cb04fSpatrick
13*1f9cb04fSpatrick #include "scudo/interface.h"
143cab2bb3Spatrick
153cab2bb3Spatrick namespace scudo {
163cab2bb3Spatrick
getFlags()173cab2bb3Spatrick Flags *getFlags() {
183cab2bb3Spatrick static Flags F;
193cab2bb3Spatrick return &F;
203cab2bb3Spatrick }
213cab2bb3Spatrick
setDefaults()223cab2bb3Spatrick void Flags::setDefaults() {
233cab2bb3Spatrick #define SCUDO_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
243cab2bb3Spatrick #include "flags.inc"
253cab2bb3Spatrick #undef SCUDO_FLAG
263cab2bb3Spatrick
273cab2bb3Spatrick #ifdef GWP_ASAN_HOOKS
283cab2bb3Spatrick #define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \
293cab2bb3Spatrick GWP_ASAN_##Name = DefaultValue;
303cab2bb3Spatrick #include "gwp_asan/options.inc"
313cab2bb3Spatrick #undef GWP_ASAN_OPTION
323cab2bb3Spatrick #endif // GWP_ASAN_HOOKS
333cab2bb3Spatrick }
343cab2bb3Spatrick
registerFlags(FlagParser * Parser,Flags * F)353cab2bb3Spatrick void registerFlags(FlagParser *Parser, Flags *F) {
363cab2bb3Spatrick #define SCUDO_FLAG(Type, Name, DefaultValue, Description) \
373cab2bb3Spatrick Parser->registerFlag(#Name, Description, FlagType::FT_##Type, \
383cab2bb3Spatrick reinterpret_cast<void *>(&F->Name));
393cab2bb3Spatrick #include "flags.inc"
403cab2bb3Spatrick #undef SCUDO_FLAG
413cab2bb3Spatrick
423cab2bb3Spatrick #ifdef GWP_ASAN_HOOKS
433cab2bb3Spatrick #define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \
443cab2bb3Spatrick Parser->registerFlag("GWP_ASAN_" #Name, Description, FlagType::FT_##Type, \
453cab2bb3Spatrick reinterpret_cast<void *>(&F->GWP_ASAN_##Name));
463cab2bb3Spatrick #include "gwp_asan/options.inc"
473cab2bb3Spatrick #undef GWP_ASAN_OPTION
483cab2bb3Spatrick #endif // GWP_ASAN_HOOKS
493cab2bb3Spatrick }
503cab2bb3Spatrick
getCompileDefinitionScudoDefaultOptions()513cab2bb3Spatrick static const char *getCompileDefinitionScudoDefaultOptions() {
523cab2bb3Spatrick #ifdef SCUDO_DEFAULT_OPTIONS
533cab2bb3Spatrick return STRINGIFY(SCUDO_DEFAULT_OPTIONS);
543cab2bb3Spatrick #else
553cab2bb3Spatrick return "";
563cab2bb3Spatrick #endif
573cab2bb3Spatrick }
583cab2bb3Spatrick
getScudoDefaultOptions()593cab2bb3Spatrick static const char *getScudoDefaultOptions() {
603cab2bb3Spatrick return (&__scudo_default_options) ? __scudo_default_options() : "";
613cab2bb3Spatrick }
623cab2bb3Spatrick
initFlags()633cab2bb3Spatrick void initFlags() {
643cab2bb3Spatrick Flags *F = getFlags();
653cab2bb3Spatrick F->setDefaults();
663cab2bb3Spatrick FlagParser Parser;
673cab2bb3Spatrick registerFlags(&Parser, F);
683cab2bb3Spatrick Parser.parseString(getCompileDefinitionScudoDefaultOptions());
693cab2bb3Spatrick Parser.parseString(getScudoDefaultOptions());
703cab2bb3Spatrick Parser.parseString(getEnv("SCUDO_OPTIONS"));
713cab2bb3Spatrick }
723cab2bb3Spatrick
733cab2bb3Spatrick } // namespace scudo
74