1*68d75effSDimitry Andric //===-- flags.cpp -----------------------------------------------*- C++ -*-===// 2*68d75effSDimitry Andric // 3*68d75effSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*68d75effSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*68d75effSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*68d75effSDimitry Andric // 7*68d75effSDimitry Andric //===----------------------------------------------------------------------===// 8*68d75effSDimitry Andric 9*68d75effSDimitry Andric #include "flags.h" 10*68d75effSDimitry Andric #include "common.h" 11*68d75effSDimitry Andric #include "flags_parser.h" 12*68d75effSDimitry Andric #include "interface.h" 13*68d75effSDimitry Andric 14*68d75effSDimitry Andric namespace scudo { 15*68d75effSDimitry Andric 16*68d75effSDimitry Andric Flags *getFlags() { 17*68d75effSDimitry Andric static Flags F; 18*68d75effSDimitry Andric return &F; 19*68d75effSDimitry Andric } 20*68d75effSDimitry Andric 21*68d75effSDimitry Andric void Flags::setDefaults() { 22*68d75effSDimitry Andric #define SCUDO_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; 23*68d75effSDimitry Andric #include "flags.inc" 24*68d75effSDimitry Andric #undef SCUDO_FLAG 25*68d75effSDimitry Andric } 26*68d75effSDimitry Andric 27*68d75effSDimitry Andric void registerFlags(FlagParser *Parser, Flags *F) { 28*68d75effSDimitry Andric #define SCUDO_FLAG(Type, Name, DefaultValue, Description) \ 29*68d75effSDimitry Andric Parser->registerFlag(#Name, Description, FlagType::FT_##Type, \ 30*68d75effSDimitry Andric reinterpret_cast<void *>(&F->Name)); 31*68d75effSDimitry Andric #include "flags.inc" 32*68d75effSDimitry Andric #undef SCUDO_FLAG 33*68d75effSDimitry Andric } 34*68d75effSDimitry Andric 35*68d75effSDimitry Andric static const char *getCompileDefinitionScudoDefaultOptions() { 36*68d75effSDimitry Andric #ifdef SCUDO_DEFAULT_OPTIONS 37*68d75effSDimitry Andric return STRINGIFY(SCUDO_DEFAULT_OPTIONS); 38*68d75effSDimitry Andric #else 39*68d75effSDimitry Andric return ""; 40*68d75effSDimitry Andric #endif 41*68d75effSDimitry Andric } 42*68d75effSDimitry Andric 43*68d75effSDimitry Andric static const char *getScudoDefaultOptions() { 44*68d75effSDimitry Andric return (&__scudo_default_options) ? __scudo_default_options() : ""; 45*68d75effSDimitry Andric } 46*68d75effSDimitry Andric 47*68d75effSDimitry Andric void initFlags() { 48*68d75effSDimitry Andric Flags *F = getFlags(); 49*68d75effSDimitry Andric F->setDefaults(); 50*68d75effSDimitry Andric FlagParser Parser; 51*68d75effSDimitry Andric registerFlags(&Parser, F); 52*68d75effSDimitry Andric Parser.parseString(getCompileDefinitionScudoDefaultOptions()); 53*68d75effSDimitry Andric Parser.parseString(getScudoDefaultOptions()); 54*68d75effSDimitry Andric Parser.parseString(getEnv("SCUDO_OPTIONS")); 55*68d75effSDimitry Andric } 56*68d75effSDimitry Andric 57*68d75effSDimitry Andric } // namespace scudo 58