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