xref: /llvm-project/bolt/lib/Utils/CommandLineOpts.cpp (revision bb5ab1ffe719f5e801ef08ac08be975546aa3266)
1 //===- bolt/Utils/CommandLineOpts.cpp - BOLT CLI options ------------------===//
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 // BOLT CLI options
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "bolt/Utils/CommandLineOpts.h"
14 #include "llvm/Support/VCSRevision.h"
15 
16 using namespace llvm;
17 
18 namespace llvm {
19 namespace bolt {
20 const char *BoltRevision =
21 #ifdef LLVM_REVISION
22     LLVM_REVISION;
23 #else
24     "<unknown>";
25 #endif
26 }
27 }
28 
29 namespace opts {
30 
31 bool HeatmapMode = false;
32 
33 cl::OptionCategory BoltCategory("BOLT generic options");
34 cl::OptionCategory BoltDiffCategory("BOLTDIFF generic options");
35 cl::OptionCategory BoltOptCategory("BOLT optimization options");
36 cl::OptionCategory BoltRelocCategory("BOLT options in relocation mode");
37 cl::OptionCategory BoltOutputCategory("Output options");
38 cl::OptionCategory AggregatorCategory("Data aggregation options");
39 cl::OptionCategory BoltInstrCategory("BOLT instrumentation options");
40 cl::OptionCategory HeatmapCategory("Heatmap options");
41 
42 cl::opt<unsigned> AlignText("align-text",
43                             cl::desc("alignment of .text section"), cl::Hidden,
44                             cl::cat(BoltCategory));
45 
46 cl::opt<unsigned> AlignFunctions(
47     "align-functions",
48     cl::desc("align functions at a given value (relocation mode)"),
49     cl::init(64), cl::cat(BoltOptCategory));
50 
51 cl::opt<bool>
52 AggregateOnly("aggregate-only",
53   cl::desc("exit after writing aggregated data file"),
54   cl::Hidden,
55   cl::cat(AggregatorCategory));
56 
57 cl::opt<unsigned>
58     BucketsPerLine("line-size",
59                    cl::desc("number of entries per line (default 256)"),
60                    cl::init(256), cl::Optional, cl::cat(HeatmapCategory));
61 
62 cl::opt<bool>
63 DiffOnly("diff-only",
64   cl::desc("stop processing once we have enough to compare two binaries"),
65   cl::Hidden,
66   cl::cat(BoltDiffCategory));
67 
68 cl::opt<bool>
69 EnableBAT("enable-bat",
70   cl::desc("write BOLT Address Translation tables"),
71   cl::init(false),
72   cl::ZeroOrMore,
73   cl::cat(BoltCategory));
74 
75 cl::opt<bool> EqualizeBBCounts(
76     "equalize-bb-counts",
77     cl::desc("use same count for BBs that should have equivalent count (used "
78              "in non-LBR and shrink wrapping)"),
79     cl::ZeroOrMore, cl::init(false), cl::Hidden, cl::cat(BoltOptCategory));
80 
81 cl::opt<bool> RemoveSymtab("remove-symtab", cl::desc("Remove .symtab section"),
82                            cl::cat(BoltCategory));
83 
84 cl::opt<unsigned>
85 ExecutionCountThreshold("execution-count-threshold",
86   cl::desc("perform profiling accuracy-sensitive optimizations only if "
87            "function execution count >= the threshold (default: 0)"),
88   cl::init(0),
89   cl::ZeroOrMore,
90   cl::Hidden,
91   cl::cat(BoltOptCategory));
92 
93 cl::opt<unsigned>
94     HeatmapBlock("block-size",
95                  cl::desc("size of a heat map block in bytes (default 64)"),
96                  cl::init(64), cl::cat(HeatmapCategory));
97 
98 cl::opt<unsigned long long> HeatmapMaxAddress(
99     "max-address", cl::init(0xffffffff),
100     cl::desc("maximum address considered valid for heatmap (default 4GB)"),
101     cl::Optional, cl::cat(HeatmapCategory));
102 
103 cl::opt<unsigned long long> HeatmapMinAddress(
104     "min-address", cl::init(0x0),
105     cl::desc("minimum address considered valid for heatmap (default 0)"),
106     cl::Optional, cl::cat(HeatmapCategory));
107 
108 cl::opt<bool> HotData("hot-data",
109                       cl::desc("hot data symbols support (relocation mode)"),
110                       cl::cat(BoltCategory));
111 
112 cl::opt<bool> HotFunctionsAtEnd(
113     "hot-functions-at-end",
114     cl::desc(
115         "if reorder-functions is used, order functions putting hottest last"),
116     cl::cat(BoltCategory));
117 
118 cl::opt<bool> HotText(
119     "hot-text",
120     cl::desc(
121         "Generate hot text symbols. Apply this option to a precompiled binary "
122         "that manually calls into hugify, such that at runtime hugify call "
123         "will put hot code into 2M pages. This requires relocation."),
124     cl::ZeroOrMore, cl::cat(BoltCategory));
125 
126 cl::opt<bool>
127     Instrument("instrument",
128                cl::desc("instrument code to generate accurate profile data"),
129                cl::cat(BoltOptCategory));
130 
131 cl::opt<bool> Lite("lite", cl::desc("skip processing of cold functions"),
132                    cl::cat(BoltCategory));
133 
134 cl::opt<bool>
135     MatchProfileWithFunctionHash("match-profile-with-function-hash",
136                                  cl::desc("Match profile with function hash"),
137                                  cl::Hidden, cl::cat(BoltCategory));
138 
139 cl::opt<std::string>
140 OutputFilename("o",
141   cl::desc("<output file>"),
142   cl::Optional,
143   cl::cat(BoltOutputCategory));
144 
145 cl::opt<std::string> PerfData("perfdata", cl::desc("<data file>"), cl::Optional,
146                               cl::cat(AggregatorCategory),
147                               cl::sub(cl::SubCommand::getAll()));
148 
149 static cl::alias
150 PerfDataA("p",
151   cl::desc("alias for -perfdata"),
152   cl::aliasopt(PerfData),
153   cl::cat(AggregatorCategory));
154 
155 cl::opt<bool> PrintCacheMetrics(
156     "print-cache-metrics",
157     cl::desc("calculate and print various metrics for instruction cache"),
158     cl::cat(BoltOptCategory));
159 
160 cl::opt<bool> PrintSections("print-sections",
161                             cl::desc("print all registered sections"),
162                             cl::Hidden, cl::cat(BoltCategory));
163 
164 cl::opt<ProfileFormatKind> ProfileFormat(
165     "profile-format",
166     cl::desc(
167         "format to dump profile output in aggregation mode, default is fdata"),
168     cl::init(PF_Fdata),
169     cl::values(clEnumValN(PF_Fdata, "fdata", "offset-based plaintext format"),
170                clEnumValN(PF_YAML, "yaml", "dense YAML representation")),
171     cl::ZeroOrMore, cl::Hidden, cl::cat(BoltCategory));
172 
173 cl::opt<std::string> SaveProfile("w",
174                                  cl::desc("save recorded profile to a file"),
175                                  cl::cat(BoltOutputCategory));
176 
177 cl::opt<bool> SplitEH("split-eh", cl::desc("split C++ exception handling code"),
178                       cl::Hidden, cl::cat(BoltOptCategory));
179 
180 cl::opt<bool>
181     StrictMode("strict",
182                cl::desc("trust the input to be from a well-formed source"),
183 
184                cl::cat(BoltCategory));
185 
186 cl::opt<bool> TimeOpts("time-opts",
187                        cl::desc("print time spent in each optimization"),
188                        cl::cat(BoltOptCategory));
189 
190 cl::opt<bool> TimeRewrite("time-rewrite",
191                           cl::desc("print time spent in rewriting passes"),
192                           cl::Hidden, cl::cat(BoltCategory));
193 
194 cl::opt<bool> UseOldText(
195     "use-old-text",
196     cl::desc("re-use space in old .text if possible (relocation mode)"),
197     cl::cat(BoltCategory));
198 
199 cl::opt<bool> UpdateDebugSections(
200     "update-debug-sections",
201     cl::desc("update DWARF debug sections of the executable"),
202     cl::cat(BoltCategory));
203 
204 cl::opt<unsigned>
205     Verbosity("v", cl::desc("set verbosity level for diagnostic output"),
206               cl::init(0), cl::ZeroOrMore, cl::cat(BoltCategory),
207               cl::sub(cl::SubCommand::getAll()));
208 
209 bool processAllFunctions() {
210   if (opts::AggregateOnly)
211     return false;
212 
213   if (UseOldText || StrictMode)
214     return true;
215 
216   return false;
217 }
218 
219 } // namespace opts
220