//===-- memprof_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 // //===----------------------------------------------------------------------===// // // This file is a part of MemProfiler, a memory profiler. // // MemProf flag parsing logic. //===----------------------------------------------------------------------===// #include "memprof_flags.h" #include "memprof_interface_internal.h" #include "memprof_stack.h" #include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_flag_parser.h" #include "sanitizer_common/sanitizer_flags.h" namespace __memprof { Flags memprof_flags_dont_use_directly; // use via flags(). static const char *MaybeUseMemprofDefaultOptionsCompileDefinition() { #ifdef MEMPROF_DEFAULT_OPTIONS return SANITIZER_STRINGIFY(MEMPROF_DEFAULT_OPTIONS); #else return ""; #endif } void Flags::SetDefaults() { #define MEMPROF_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; #include "memprof_flags.inc" #undef MEMPROF_FLAG } static void RegisterMemprofFlags(FlagParser *parser, Flags *f) { #define MEMPROF_FLAG(Type, Name, DefaultValue, Description) \ RegisterFlag(parser, #Name, Description, &f->Name); #include "memprof_flags.inc" #undef MEMPROF_FLAG } void InitializeFlags() { // Set the default values and prepare for parsing MemProf and common flags. SetCommonFlagsDefaults(); { CommonFlags cf; cf.CopyFrom(*common_flags()); cf.external_symbolizer_path = GetEnv("MEMPROF_SYMBOLIZER_PATH"); cf.malloc_context_size = kDefaultMallocContextSize; cf.intercept_tls_get_addr = true; cf.exitcode = 1; OverrideCommonFlags(cf); } Flags *f = flags(); f->SetDefaults(); FlagParser memprof_parser; RegisterMemprofFlags(&memprof_parser, f); RegisterCommonFlags(&memprof_parser); // Override from MemProf compile definition. const char *memprof_compile_def = MaybeUseMemprofDefaultOptionsCompileDefinition(); memprof_parser.ParseString(memprof_compile_def); // Override from user-specified string. const char *memprof_default_options = __memprof_default_options(); memprof_parser.ParseString(memprof_default_options); // Override from command line. memprof_parser.ParseStringFromEnv("MEMPROF_OPTIONS"); InitializeCommonFlags(); if (Verbosity()) ReportUnrecognizedFlags(); if (common_flags()->help) { memprof_parser.PrintFlagDescriptions(); } CHECK_LE((uptr)common_flags()->malloc_context_size, kStackTraceMax); } } // namespace __memprof SANITIZER_INTERFACE_WEAK_DEF(const char *, __memprof_default_options, void) { return ""; }