-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[BOLT][print] Add option '--print-only-file' (NFC) #168023
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Summary: With this option we can pass to BOLT names of function to be printed through a file instead of having them specified on command line.
|
@llvm/pr-subscribers-bolt Author: YongKang Zhu (yozhu) ChangesWith this option we can pass to BOLT names of functions to be printed through a file instead of specifying those functions all on command line. Full diff: https://github.com/llvm/llvm-project/pull/168023.diff 5 Files Affected:
diff --git a/bolt/include/bolt/Rewrite/RewriteInstance.h b/bolt/include/bolt/Rewrite/RewriteInstance.h
index 0fe2e32b61933..35abf6b4d4ddd 100644
--- a/bolt/include/bolt/Rewrite/RewriteInstance.h
+++ b/bolt/include/bolt/Rewrite/RewriteInstance.h
@@ -139,6 +139,9 @@ class RewriteInstance {
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();
diff --git a/bolt/lib/Core/BinaryFunction.cpp b/bolt/lib/Core/BinaryFunction.cpp
index a0d8385aa3824..a5fdf79a737f5 100644
--- a/bolt/lib/Core/BinaryFunction.cpp
+++ b/bolt/lib/Core/BinaryFunction.cpp
@@ -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"),
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
index 8d6731e7540a8..0e100bec01ca6 100644
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
@@ -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);
diff --git a/bolt/lib/Utils/CommandLineOpts.cpp b/bolt/lib/Utils/CommandLineOpts.cpp
index 5be04d2ceea94..b7eb209af8aca 100644
--- a/bolt/lib/Utils/CommandLineOpts.cpp
+++ b/bolt/lib/Utils/CommandLineOpts.cpp
@@ -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));
diff --git a/bolt/test/print-only.test b/bolt/test/print-only.test
new file mode 100644
index 0000000000000..1c2ce49de3669
--- /dev/null
+++ b/bolt/test/print-only.test
@@ -0,0 +1,25 @@
+# Verify if `--print-only` and `--print-only-files` work fine.
+
+# REQURIES: 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
|
paschalis-mpeis
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks YongKang, looks good!
bolt/test/print-only.test
Outdated
| @@ -0,0 +1,25 @@ | |||
| # Verify if `--print-only` and `--print-only-files` work fine. | |||
|
|
|||
| # REQURIES: system-linux | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
typo:
| # REQURIES: system-linux | |
| # REQUIRES: system-linux |
|
Thanks for the review, Paschalis! |
With this option we can pass to BOLT names of functions to be printed through a file instead of specifying those functions all on command line.