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