13d4bba30STeresa Johnson //===-- memprof_flags.cpp --------------------------------------*- C++ -*-===// 23d4bba30STeresa Johnson // 33d4bba30STeresa Johnson // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43d4bba30STeresa Johnson // See https://llvm.org/LICENSE.txt for license information. 53d4bba30STeresa Johnson // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63d4bba30STeresa Johnson // 73d4bba30STeresa Johnson //===----------------------------------------------------------------------===// 83d4bba30STeresa Johnson // 93d4bba30STeresa Johnson // This file is a part of MemProfiler, a memory profiler. 103d4bba30STeresa Johnson // 113d4bba30STeresa Johnson // MemProf flag parsing logic. 123d4bba30STeresa Johnson //===----------------------------------------------------------------------===// 133d4bba30STeresa Johnson 143d4bba30STeresa Johnson #include "memprof_flags.h" 153d4bba30STeresa Johnson #include "memprof_interface_internal.h" 163d4bba30STeresa Johnson #include "memprof_stack.h" 173d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_common.h" 183d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_flag_parser.h" 193d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_flags.h" 203d4bba30STeresa Johnson 213d4bba30STeresa Johnson namespace __memprof { 223d4bba30STeresa Johnson 233d4bba30STeresa Johnson Flags memprof_flags_dont_use_directly; // use via flags(). 243d4bba30STeresa Johnson 253d4bba30STeresa Johnson static const char *MaybeUseMemprofDefaultOptionsCompileDefinition() { 263d4bba30STeresa Johnson #ifdef MEMPROF_DEFAULT_OPTIONS 273d4bba30STeresa Johnson return SANITIZER_STRINGIFY(MEMPROF_DEFAULT_OPTIONS); 283d4bba30STeresa Johnson #else 293d4bba30STeresa Johnson return ""; 303d4bba30STeresa Johnson #endif 313d4bba30STeresa Johnson } 323d4bba30STeresa Johnson 333d4bba30STeresa Johnson void Flags::SetDefaults() { 343d4bba30STeresa Johnson #define MEMPROF_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; 353d4bba30STeresa Johnson #include "memprof_flags.inc" 363d4bba30STeresa Johnson #undef MEMPROF_FLAG 373d4bba30STeresa Johnson } 383d4bba30STeresa Johnson 393d4bba30STeresa Johnson static void RegisterMemprofFlags(FlagParser *parser, Flags *f) { 403d4bba30STeresa Johnson #define MEMPROF_FLAG(Type, Name, DefaultValue, Description) \ 413d4bba30STeresa Johnson RegisterFlag(parser, #Name, Description, &f->Name); 423d4bba30STeresa Johnson #include "memprof_flags.inc" 433d4bba30STeresa Johnson #undef MEMPROF_FLAG 443d4bba30STeresa Johnson } 453d4bba30STeresa Johnson 463d4bba30STeresa Johnson void InitializeFlags() { 473d4bba30STeresa Johnson // Set the default values and prepare for parsing MemProf and common flags. 483d4bba30STeresa Johnson SetCommonFlagsDefaults(); 493d4bba30STeresa Johnson { 503d4bba30STeresa Johnson CommonFlags cf; 513d4bba30STeresa Johnson cf.CopyFrom(*common_flags()); 523d4bba30STeresa Johnson cf.external_symbolizer_path = GetEnv("MEMPROF_SYMBOLIZER_PATH"); 533d4bba30STeresa Johnson cf.malloc_context_size = kDefaultMallocContextSize; 543d4bba30STeresa Johnson cf.intercept_tls_get_addr = true; 553d4bba30STeresa Johnson cf.exitcode = 1; 563d4bba30STeresa Johnson OverrideCommonFlags(cf); 573d4bba30STeresa Johnson } 583d4bba30STeresa Johnson Flags *f = flags(); 593d4bba30STeresa Johnson f->SetDefaults(); 603d4bba30STeresa Johnson 613d4bba30STeresa Johnson FlagParser memprof_parser; 623d4bba30STeresa Johnson RegisterMemprofFlags(&memprof_parser, f); 633d4bba30STeresa Johnson RegisterCommonFlags(&memprof_parser); 643d4bba30STeresa Johnson 653d4bba30STeresa Johnson // Override from MemProf compile definition. 663d4bba30STeresa Johnson const char *memprof_compile_def = 673d4bba30STeresa Johnson MaybeUseMemprofDefaultOptionsCompileDefinition(); 683d4bba30STeresa Johnson memprof_parser.ParseString(memprof_compile_def); 693d4bba30STeresa Johnson 703d4bba30STeresa Johnson // Override from user-specified string. 713d4bba30STeresa Johnson const char *memprof_default_options = __memprof_default_options(); 723d4bba30STeresa Johnson memprof_parser.ParseString(memprof_default_options); 733d4bba30STeresa Johnson 743d4bba30STeresa Johnson // Override from command line. 753d4bba30STeresa Johnson memprof_parser.ParseStringFromEnv("MEMPROF_OPTIONS"); 763d4bba30STeresa Johnson 773d4bba30STeresa Johnson InitializeCommonFlags(); 783d4bba30STeresa Johnson 793d4bba30STeresa Johnson if (Verbosity()) 803d4bba30STeresa Johnson ReportUnrecognizedFlags(); 813d4bba30STeresa Johnson 823d4bba30STeresa Johnson if (common_flags()->help) { 833d4bba30STeresa Johnson memprof_parser.PrintFlagDescriptions(); 843d4bba30STeresa Johnson } 853d4bba30STeresa Johnson 863d4bba30STeresa Johnson CHECK_LE((uptr)common_flags()->malloc_context_size, kStackTraceMax); 873d4bba30STeresa Johnson } 883d4bba30STeresa Johnson 893d4bba30STeresa Johnson } // namespace __memprof 903d4bba30STeresa Johnson 913d4bba30STeresa Johnson SANITIZER_INTERFACE_WEAK_DEF(const char *, __memprof_default_options, void) { 92*2e33ed9eSEllis Hoag return __memprof_default_options_str; 933d4bba30STeresa Johnson } 94