xref: /llvm-project/compiler-rt/lib/memprof/memprof_flags.cpp (revision 2e33ed9ecc52fcec27eac2efb2615d1efcf6fd32)
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