168d75effSDimitry Andric //===-- flags.cpp -----------------------------------------------*- C++ -*-===// 268d75effSDimitry Andric // 368d75effSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 468d75effSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 568d75effSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 668d75effSDimitry Andric // 768d75effSDimitry Andric //===----------------------------------------------------------------------===// 868d75effSDimitry Andric 968d75effSDimitry Andric #include "flags.h" 1068d75effSDimitry Andric #include "common.h" 1168d75effSDimitry Andric #include "flags_parser.h" 1268d75effSDimitry Andric #include "interface.h" 1368d75effSDimitry Andric 1468d75effSDimitry Andric namespace scudo { 1568d75effSDimitry Andric 1668d75effSDimitry Andric Flags *getFlags() { 1768d75effSDimitry Andric static Flags F; 1868d75effSDimitry Andric return &F; 1968d75effSDimitry Andric } 2068d75effSDimitry Andric 2168d75effSDimitry Andric void Flags::setDefaults() { 2268d75effSDimitry Andric #define SCUDO_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; 2368d75effSDimitry Andric #include "flags.inc" 2468d75effSDimitry Andric #undef SCUDO_FLAG 25*480093f4SDimitry Andric 26*480093f4SDimitry Andric #ifdef GWP_ASAN_HOOKS 27*480093f4SDimitry Andric #define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \ 28*480093f4SDimitry Andric GWP_ASAN_##Name = DefaultValue; 29*480093f4SDimitry Andric #include "gwp_asan/options.inc" 30*480093f4SDimitry Andric #undef GWP_ASAN_OPTION 31*480093f4SDimitry Andric #endif // GWP_ASAN_HOOKS 3268d75effSDimitry Andric } 3368d75effSDimitry Andric 3468d75effSDimitry Andric void registerFlags(FlagParser *Parser, Flags *F) { 3568d75effSDimitry Andric #define SCUDO_FLAG(Type, Name, DefaultValue, Description) \ 3668d75effSDimitry Andric Parser->registerFlag(#Name, Description, FlagType::FT_##Type, \ 3768d75effSDimitry Andric reinterpret_cast<void *>(&F->Name)); 3868d75effSDimitry Andric #include "flags.inc" 3968d75effSDimitry Andric #undef SCUDO_FLAG 40*480093f4SDimitry Andric 41*480093f4SDimitry Andric #ifdef GWP_ASAN_HOOKS 42*480093f4SDimitry Andric #define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \ 43*480093f4SDimitry Andric Parser->registerFlag("GWP_ASAN_" #Name, Description, FlagType::FT_##Type, \ 44*480093f4SDimitry Andric reinterpret_cast<void *>(&F->GWP_ASAN_##Name)); 45*480093f4SDimitry Andric #include "gwp_asan/options.inc" 46*480093f4SDimitry Andric #undef GWP_ASAN_OPTION 47*480093f4SDimitry Andric #endif // GWP_ASAN_HOOKS 4868d75effSDimitry Andric } 4968d75effSDimitry Andric 5068d75effSDimitry Andric static const char *getCompileDefinitionScudoDefaultOptions() { 5168d75effSDimitry Andric #ifdef SCUDO_DEFAULT_OPTIONS 5268d75effSDimitry Andric return STRINGIFY(SCUDO_DEFAULT_OPTIONS); 5368d75effSDimitry Andric #else 5468d75effSDimitry Andric return ""; 5568d75effSDimitry Andric #endif 5668d75effSDimitry Andric } 5768d75effSDimitry Andric 5868d75effSDimitry Andric static const char *getScudoDefaultOptions() { 5968d75effSDimitry Andric return (&__scudo_default_options) ? __scudo_default_options() : ""; 6068d75effSDimitry Andric } 6168d75effSDimitry Andric 6268d75effSDimitry Andric void initFlags() { 6368d75effSDimitry Andric Flags *F = getFlags(); 6468d75effSDimitry Andric F->setDefaults(); 6568d75effSDimitry Andric FlagParser Parser; 6668d75effSDimitry Andric registerFlags(&Parser, F); 6768d75effSDimitry Andric Parser.parseString(getCompileDefinitionScudoDefaultOptions()); 6868d75effSDimitry Andric Parser.parseString(getScudoDefaultOptions()); 6968d75effSDimitry Andric Parser.parseString(getEnv("SCUDO_OPTIONS")); 7068d75effSDimitry Andric } 7168d75effSDimitry Andric 7268d75effSDimitry Andric } // namespace scudo 73