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