1*3d4bba30STeresa Johnson //===-- memprof_flags.cpp --------------------------------------*- C++ -*-===//
2*3d4bba30STeresa Johnson //
3*3d4bba30STeresa Johnson // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*3d4bba30STeresa Johnson // See https://llvm.org/LICENSE.txt for license information.
5*3d4bba30STeresa Johnson // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*3d4bba30STeresa Johnson //
7*3d4bba30STeresa Johnson //===----------------------------------------------------------------------===//
8*3d4bba30STeresa Johnson //
9*3d4bba30STeresa Johnson // This file is a part of MemProfiler, a memory profiler.
10*3d4bba30STeresa Johnson //
11*3d4bba30STeresa Johnson // MemProf flag parsing logic.
12*3d4bba30STeresa Johnson //===----------------------------------------------------------------------===//
13*3d4bba30STeresa Johnson 
14*3d4bba30STeresa Johnson #include "memprof_flags.h"
15*3d4bba30STeresa Johnson #include "memprof_interface_internal.h"
16*3d4bba30STeresa Johnson #include "memprof_stack.h"
17*3d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_common.h"
18*3d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_flag_parser.h"
19*3d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_flags.h"
20*3d4bba30STeresa Johnson 
21*3d4bba30STeresa Johnson namespace __memprof {
22*3d4bba30STeresa Johnson 
23*3d4bba30STeresa Johnson Flags memprof_flags_dont_use_directly; // use via flags().
24*3d4bba30STeresa Johnson 
MaybeUseMemprofDefaultOptionsCompileDefinition()25*3d4bba30STeresa Johnson static const char *MaybeUseMemprofDefaultOptionsCompileDefinition() {
26*3d4bba30STeresa Johnson #ifdef MEMPROF_DEFAULT_OPTIONS
27*3d4bba30STeresa Johnson   return SANITIZER_STRINGIFY(MEMPROF_DEFAULT_OPTIONS);
28*3d4bba30STeresa Johnson #else
29*3d4bba30STeresa Johnson   return "";
30*3d4bba30STeresa Johnson #endif
31*3d4bba30STeresa Johnson }
32*3d4bba30STeresa Johnson 
SetDefaults()33*3d4bba30STeresa Johnson void Flags::SetDefaults() {
34*3d4bba30STeresa Johnson #define MEMPROF_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
35*3d4bba30STeresa Johnson #include "memprof_flags.inc"
36*3d4bba30STeresa Johnson #undef MEMPROF_FLAG
37*3d4bba30STeresa Johnson }
38*3d4bba30STeresa Johnson 
RegisterMemprofFlags(FlagParser * parser,Flags * f)39*3d4bba30STeresa Johnson static void RegisterMemprofFlags(FlagParser *parser, Flags *f) {
40*3d4bba30STeresa Johnson #define MEMPROF_FLAG(Type, Name, DefaultValue, Description)                    \
41*3d4bba30STeresa Johnson   RegisterFlag(parser, #Name, Description, &f->Name);
42*3d4bba30STeresa Johnson #include "memprof_flags.inc"
43*3d4bba30STeresa Johnson #undef MEMPROF_FLAG
44*3d4bba30STeresa Johnson }
45*3d4bba30STeresa Johnson 
InitializeFlags()46*3d4bba30STeresa Johnson void InitializeFlags() {
47*3d4bba30STeresa Johnson   // Set the default values and prepare for parsing MemProf and common flags.
48*3d4bba30STeresa Johnson   SetCommonFlagsDefaults();
49*3d4bba30STeresa Johnson   {
50*3d4bba30STeresa Johnson     CommonFlags cf;
51*3d4bba30STeresa Johnson     cf.CopyFrom(*common_flags());
52*3d4bba30STeresa Johnson     cf.external_symbolizer_path = GetEnv("MEMPROF_SYMBOLIZER_PATH");
53*3d4bba30STeresa Johnson     cf.malloc_context_size = kDefaultMallocContextSize;
54*3d4bba30STeresa Johnson     cf.intercept_tls_get_addr = true;
55*3d4bba30STeresa Johnson     cf.exitcode = 1;
56*3d4bba30STeresa Johnson     OverrideCommonFlags(cf);
57*3d4bba30STeresa Johnson   }
58*3d4bba30STeresa Johnson   Flags *f = flags();
59*3d4bba30STeresa Johnson   f->SetDefaults();
60*3d4bba30STeresa Johnson 
61*3d4bba30STeresa Johnson   FlagParser memprof_parser;
62*3d4bba30STeresa Johnson   RegisterMemprofFlags(&memprof_parser, f);
63*3d4bba30STeresa Johnson   RegisterCommonFlags(&memprof_parser);
64*3d4bba30STeresa Johnson 
65*3d4bba30STeresa Johnson   // Override from MemProf compile definition.
66*3d4bba30STeresa Johnson   const char *memprof_compile_def =
67*3d4bba30STeresa Johnson       MaybeUseMemprofDefaultOptionsCompileDefinition();
68*3d4bba30STeresa Johnson   memprof_parser.ParseString(memprof_compile_def);
69*3d4bba30STeresa Johnson 
70*3d4bba30STeresa Johnson   // Override from user-specified string.
71*3d4bba30STeresa Johnson   const char *memprof_default_options = __memprof_default_options();
72*3d4bba30STeresa Johnson   memprof_parser.ParseString(memprof_default_options);
73*3d4bba30STeresa Johnson 
74*3d4bba30STeresa Johnson   // Override from command line.
75*3d4bba30STeresa Johnson   memprof_parser.ParseStringFromEnv("MEMPROF_OPTIONS");
76*3d4bba30STeresa Johnson 
77*3d4bba30STeresa Johnson   InitializeCommonFlags();
78*3d4bba30STeresa Johnson 
79*3d4bba30STeresa Johnson   if (Verbosity())
80*3d4bba30STeresa Johnson     ReportUnrecognizedFlags();
81*3d4bba30STeresa Johnson 
82*3d4bba30STeresa Johnson   if (common_flags()->help) {
83*3d4bba30STeresa Johnson     memprof_parser.PrintFlagDescriptions();
84*3d4bba30STeresa Johnson   }
85*3d4bba30STeresa Johnson 
86*3d4bba30STeresa Johnson   CHECK_LE((uptr)common_flags()->malloc_context_size, kStackTraceMax);
87*3d4bba30STeresa Johnson }
88*3d4bba30STeresa Johnson 
89*3d4bba30STeresa Johnson } // namespace __memprof
90*3d4bba30STeresa Johnson 
SANITIZER_INTERFACE_WEAK_DEF(const char *,__memprof_default_options,void)91*3d4bba30STeresa Johnson SANITIZER_INTERFACE_WEAK_DEF(const char *, __memprof_default_options, void) {
92*3d4bba30STeresa Johnson   return "";
93*3d4bba30STeresa Johnson }
94