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" 125ffd83dbSDimitry Andric 135ffd83dbSDimitry Andric #include "scudo/interface.h" 1468d75effSDimitry Andric 1568d75effSDimitry Andric namespace scudo { 1668d75effSDimitry Andric 1768d75effSDimitry Andric Flags *getFlags() { 1868d75effSDimitry Andric static Flags F; 1968d75effSDimitry Andric return &F; 2068d75effSDimitry Andric } 2168d75effSDimitry Andric 2268d75effSDimitry Andric void Flags::setDefaults() { 2368d75effSDimitry Andric #define SCUDO_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; 2468d75effSDimitry Andric #include "flags.inc" 2568d75effSDimitry Andric #undef SCUDO_FLAG 26fe6060f1SDimitry Andric 27fe6060f1SDimitry Andric #ifdef GWP_ASAN_HOOKS 28fe6060f1SDimitry Andric #define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \ 29fe6060f1SDimitry Andric GWP_ASAN_##Name = DefaultValue; 30fe6060f1SDimitry Andric #include "gwp_asan/options.inc" 31fe6060f1SDimitry Andric #undef GWP_ASAN_OPTION 32fe6060f1SDimitry Andric #endif // GWP_ASAN_HOOKS 3368d75effSDimitry Andric } 3468d75effSDimitry Andric 3568d75effSDimitry Andric void registerFlags(FlagParser *Parser, Flags *F) { 3668d75effSDimitry Andric #define SCUDO_FLAG(Type, Name, DefaultValue, Description) \ 3768d75effSDimitry Andric Parser->registerFlag(#Name, Description, FlagType::FT_##Type, \ 3868d75effSDimitry Andric reinterpret_cast<void *>(&F->Name)); 3968d75effSDimitry Andric #include "flags.inc" 4068d75effSDimitry Andric #undef SCUDO_FLAG 41fe6060f1SDimitry Andric 42fe6060f1SDimitry Andric #ifdef GWP_ASAN_HOOKS 43fe6060f1SDimitry Andric #define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \ 44fe6060f1SDimitry Andric Parser->registerFlag("GWP_ASAN_" #Name, Description, FlagType::FT_##Type, \ 45fe6060f1SDimitry Andric reinterpret_cast<void *>(&F->GWP_ASAN_##Name)); 46fe6060f1SDimitry Andric #include "gwp_asan/options.inc" 47fe6060f1SDimitry Andric #undef GWP_ASAN_OPTION 48fe6060f1SDimitry Andric #endif // GWP_ASAN_HOOKS 4968d75effSDimitry Andric } 5068d75effSDimitry Andric 5168d75effSDimitry Andric static const char *getCompileDefinitionScudoDefaultOptions() { 5268d75effSDimitry Andric #ifdef SCUDO_DEFAULT_OPTIONS 5368d75effSDimitry Andric return STRINGIFY(SCUDO_DEFAULT_OPTIONS); 5468d75effSDimitry Andric #else 5568d75effSDimitry Andric return ""; 5668d75effSDimitry Andric #endif 5768d75effSDimitry Andric } 5868d75effSDimitry Andric 5968d75effSDimitry Andric static const char *getScudoDefaultOptions() { 6068d75effSDimitry Andric return (&__scudo_default_options) ? __scudo_default_options() : ""; 6168d75effSDimitry Andric } 6268d75effSDimitry Andric 6368d75effSDimitry Andric void initFlags() { 6468d75effSDimitry Andric Flags *F = getFlags(); 6568d75effSDimitry Andric F->setDefaults(); 6668d75effSDimitry Andric FlagParser Parser; 6768d75effSDimitry Andric registerFlags(&Parser, F); 6868d75effSDimitry Andric Parser.parseString(getCompileDefinitionScudoDefaultOptions()); 6968d75effSDimitry Andric Parser.parseString(getScudoDefaultOptions()); 7068d75effSDimitry Andric Parser.parseString(getEnv("SCUDO_OPTIONS")); 71*5f757f3fSDimitry Andric if (const char *V = getEnv("SCUDO_ALLOCATION_RING_BUFFER_SIZE")) { 72*5f757f3fSDimitry Andric Parser.parseStringPair("allocation_ring_buffer_size", V); 73*5f757f3fSDimitry Andric } 7468d75effSDimitry Andric } 7568d75effSDimitry Andric 7668d75effSDimitry Andric } // namespace scudo 77