//===-- flags.cpp -----------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "flags.h" #include "common.h" #include "flags_parser.h" #include "scudo/interface.h" namespace scudo { Flags *getFlags() { static Flags F; return &F; } void Flags::setDefaults() { #define SCUDO_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; #include "flags.inc" #undef SCUDO_FLAG #ifdef GWP_ASAN_HOOKS #define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \ GWP_ASAN_##Name = DefaultValue; #include "gwp_asan/options.inc" #undef GWP_ASAN_OPTION #endif // GWP_ASAN_HOOKS } void registerFlags(FlagParser *Parser, Flags *F) { #define SCUDO_FLAG(Type, Name, DefaultValue, Description) \ Parser->registerFlag(#Name, Description, FlagType::FT_##Type, \ reinterpret_cast(&F->Name)); #include "flags.inc" #undef SCUDO_FLAG #ifdef GWP_ASAN_HOOKS #define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \ Parser->registerFlag("GWP_ASAN_" #Name, Description, FlagType::FT_##Type, \ reinterpret_cast(&F->GWP_ASAN_##Name)); #include "gwp_asan/options.inc" #undef GWP_ASAN_OPTION #endif // GWP_ASAN_HOOKS } static const char *getCompileDefinitionScudoDefaultOptions() { #ifdef SCUDO_DEFAULT_OPTIONS return STRINGIFY(SCUDO_DEFAULT_OPTIONS); #else return ""; #endif } static const char *getScudoDefaultOptions() { return (&__scudo_default_options) ? __scudo_default_options() : ""; } void initFlags() { Flags *F = getFlags(); F->setDefaults(); FlagParser Parser; registerFlags(&Parser, F); Parser.parseString(getCompileDefinitionScudoDefaultOptions()); Parser.parseString(getScudoDefaultOptions()); Parser.parseString(getEnv("SCUDO_OPTIONS")); if (const char *V = getEnv("SCUDO_ALLOCATION_RING_BUFFER_SIZE")) { Parser.parseStringPair("allocation_ring_buffer_size", V); } } } // namespace scudo