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