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