77 lines · cpp
1//===-- flags.cpp -----------------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "flags.h"10#include "common.h"11#include "flags_parser.h"12 13#include "scudo/interface.h"14 15namespace scudo {16 17Flags *getFlags() {18 static Flags F;19 return &F;20}21 22void Flags::setDefaults() {23#define SCUDO_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;24#include "flags.inc"25#undef SCUDO_FLAG26 27#ifdef GWP_ASAN_HOOKS28#define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \29 GWP_ASAN_##Name = DefaultValue;30#include "gwp_asan/options.inc"31#undef GWP_ASAN_OPTION32#endif // GWP_ASAN_HOOKS33}34 35void registerFlags(FlagParser *Parser, Flags *F) {36#define SCUDO_FLAG(Type, Name, DefaultValue, Description) \37 Parser->registerFlag(#Name, Description, FlagType::FT_##Type, \38 reinterpret_cast<void *>(&F->Name));39#include "flags.inc"40#undef SCUDO_FLAG41 42#ifdef GWP_ASAN_HOOKS43#define GWP_ASAN_OPTION(Type, Name, DefaultValue, Description) \44 Parser->registerFlag("GWP_ASAN_" #Name, Description, FlagType::FT_##Type, \45 reinterpret_cast<void *>(&F->GWP_ASAN_##Name));46#include "gwp_asan/options.inc"47#undef GWP_ASAN_OPTION48#endif // GWP_ASAN_HOOKS49}50 51static const char *getCompileDefinitionScudoDefaultOptions() {52#ifdef SCUDO_DEFAULT_OPTIONS53 return STRINGIFY(SCUDO_DEFAULT_OPTIONS);54#else55 return "";56#endif57}58 59static const char *getScudoDefaultOptions() {60 return (&__scudo_default_options) ? __scudo_default_options() : "";61}62 63void initFlags() {64 Flags *F = getFlags();65 F->setDefaults();66 FlagParser Parser;67 registerFlags(&Parser, F);68 Parser.parseString(getCompileDefinitionScudoDefaultOptions());69 Parser.parseString(getScudoDefaultOptions());70 Parser.parseString(getEnv("SCUDO_OPTIONS"));71 if (const char *V = getEnv("SCUDO_ALLOCATION_RING_BUFFER_SIZE")) {72 Parser.parseStringPair("allocation_ring_buffer_size", V);73 }74}75 76} // namespace scudo77