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