mirror of
https://github.com/intel/llvm.git
synced 2026-01-12 18:27:07 +08:00
[BOLT][print] Add option '--print-only-file' (NFC) (#168023)
With this option we can pass to BOLT names of functions to be printed through a file instead of specifying them all on command line.
This commit is contained in:
@@ -139,6 +139,9 @@ private:
|
||||
void handleRelocation(const object::SectionRef &RelocatedSection,
|
||||
const RelocationRef &Rel);
|
||||
|
||||
/// Collect functions that are specified to be bumped.
|
||||
void selectFunctionsToPrint();
|
||||
|
||||
/// Mark functions that are not meant for processing as ignored.
|
||||
void selectFunctionsToProcess();
|
||||
|
||||
|
||||
@@ -61,6 +61,8 @@ extern cl::OptionCategory BoltOptCategory;
|
||||
|
||||
extern cl::opt<bool> EnableBAT;
|
||||
extern cl::opt<bool> Instrument;
|
||||
extern cl::list<std::string> PrintOnly;
|
||||
extern cl::opt<std::string> PrintOnlyFile;
|
||||
extern cl::opt<bool> StrictMode;
|
||||
extern cl::opt<bool> UpdateDebugSections;
|
||||
extern cl::opt<unsigned> Verbosity;
|
||||
@@ -133,14 +135,6 @@ PrintDynoStatsOnly("print-dyno-stats-only",
|
||||
cl::Hidden,
|
||||
cl::cat(BoltCategory));
|
||||
|
||||
static cl::list<std::string>
|
||||
PrintOnly("print-only",
|
||||
cl::CommaSeparated,
|
||||
cl::desc("list of functions to print"),
|
||||
cl::value_desc("func1,func2,func3,..."),
|
||||
cl::Hidden,
|
||||
cl::cat(BoltCategory));
|
||||
|
||||
cl::opt<bool>
|
||||
TimeBuild("time-build",
|
||||
cl::desc("print time spent constructing binary functions"),
|
||||
|
||||
@@ -82,6 +82,8 @@ extern cl::opt<bool> Hugify;
|
||||
extern cl::opt<bool> Instrument;
|
||||
extern cl::opt<bool> KeepNops;
|
||||
extern cl::opt<bool> Lite;
|
||||
extern cl::list<std::string> PrintOnly;
|
||||
extern cl::opt<std::string> PrintOnlyFile;
|
||||
extern cl::list<std::string> ReorderData;
|
||||
extern cl::opt<bolt::ReorderFunctions::ReorderType> ReorderFunctions;
|
||||
extern cl::opt<bool> TerminalHLT;
|
||||
@@ -730,6 +732,8 @@ Error RewriteInstance::run() {
|
||||
<< "\n";
|
||||
BC->outs() << "BOLT-INFO: BOLT version: " << BoltRevision << "\n";
|
||||
|
||||
selectFunctionsToPrint();
|
||||
|
||||
if (Error E = discoverStorage())
|
||||
return E;
|
||||
if (Error E = readSpecialSections())
|
||||
@@ -3100,17 +3104,22 @@ static BinaryFunction *getInitFunctionIfStaticBinary(BinaryContext &BC) {
|
||||
return BC.getBinaryFunctionAtAddress(BD->getAddress());
|
||||
}
|
||||
|
||||
static void populateFunctionNames(cl::opt<std::string> &FunctionNamesFile,
|
||||
cl::list<std::string> &FunctionNames) {
|
||||
if (FunctionNamesFile.empty())
|
||||
return;
|
||||
std::ifstream FuncsFile(FunctionNamesFile, std::ios::in);
|
||||
std::string FuncName;
|
||||
while (std::getline(FuncsFile, FuncName))
|
||||
FunctionNames.push_back(FuncName);
|
||||
}
|
||||
|
||||
void RewriteInstance::selectFunctionsToPrint() {
|
||||
populateFunctionNames(opts::PrintOnlyFile, opts::PrintOnly);
|
||||
}
|
||||
|
||||
void RewriteInstance::selectFunctionsToProcess() {
|
||||
// Extend the list of functions to process or skip from a file.
|
||||
auto populateFunctionNames = [](cl::opt<std::string> &FunctionNamesFile,
|
||||
cl::list<std::string> &FunctionNames) {
|
||||
if (FunctionNamesFile.empty())
|
||||
return;
|
||||
std::ifstream FuncsFile(FunctionNamesFile, std::ios::in);
|
||||
std::string FuncName;
|
||||
while (std::getline(FuncsFile, FuncName))
|
||||
FunctionNames.push_back(FuncName);
|
||||
};
|
||||
populateFunctionNames(opts::FunctionNamesFile, opts::ForceFunctionNames);
|
||||
populateFunctionNames(opts::SkipFunctionNamesFile, opts::SkipFunctionNames);
|
||||
populateFunctionNames(opts::FunctionNamesFileNR, opts::ForceFunctionNamesNR);
|
||||
|
||||
@@ -245,6 +245,16 @@ cl::opt<bool> PrintCacheMetrics(
|
||||
cl::desc("calculate and print various metrics for instruction cache"),
|
||||
cl::cat(BoltOptCategory));
|
||||
|
||||
cl::list<std::string> PrintOnly("print-only", cl::CommaSeparated,
|
||||
cl::desc("list of functions to print"),
|
||||
cl::value_desc("func1,func2,func3,..."),
|
||||
cl::Hidden, cl::cat(BoltCategory));
|
||||
|
||||
cl::opt<std::string>
|
||||
PrintOnlyFile("print-only-file",
|
||||
cl::desc("file with list of functions to print"), cl::Hidden,
|
||||
cl::cat(BoltCategory));
|
||||
|
||||
cl::opt<bool> PrintSections("print-sections",
|
||||
cl::desc("print all registered sections"),
|
||||
cl::Hidden, cl::cat(BoltCategory));
|
||||
|
||||
25
bolt/test/print-only.test
Normal file
25
bolt/test/print-only.test
Normal file
@@ -0,0 +1,25 @@
|
||||
# Verify if `--print-only` and `--print-only-files` work fine.
|
||||
|
||||
# REQUIRES: system-linux
|
||||
|
||||
# RUN: %clang %cflags -x c %p/Inputs/bolt_icf.cpp -o %t -Wl,-q
|
||||
# RUN: llvm-bolt %t -o %t.bolt --icf=none --print-cfg \
|
||||
# RUN: --print-only=foo.*,bar.*,main.* 2>&1 | FileCheck %s
|
||||
|
||||
# RUN: echo "bar.*" > %t.pof
|
||||
# RUN: echo "main.*" >> %t.pof
|
||||
# RUN: llvm-bolt %t -o %t.bolt --icf=none --print-cfg \
|
||||
# RUN: --print-only=foo.* --print-only-file=%t.pof \
|
||||
# RUN: 2>&1 | FileCheck %s
|
||||
|
||||
# RUN: echo "foo.*" >> %t.pof
|
||||
# RUN: llvm-bolt %t -o %t.bolt --icf=none --print-cfg \
|
||||
# RUN: --print-only-file=%t.pof 2>&1 | FileCheck %s
|
||||
|
||||
# CHECK-NOT: Binary Function "fiz" after building cfg
|
||||
# CHECK-NOT: Binary Function "faz" after building cfg
|
||||
# CHECK-NOT: Binary Function "zip" after building cfg
|
||||
# CHECK-NOT: Binary Function "zap" after building cfg
|
||||
# CHECK: Binary Function "foo" after building cfg
|
||||
# CHECK: Binary Function "bar" after building cfg
|
||||
# CHECK: Binary Function "main" after building cfg
|
||||
Reference in New Issue
Block a user