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 EnableBAT; extern cl::opt Instrument; +extern cl::list PrintOnly; +extern cl::opt PrintOnlyFile; extern cl::opt StrictMode; extern cl::opt UpdateDebugSections; extern cl::opt Verbosity; @@ -133,14 +135,6 @@ PrintDynoStatsOnly("print-dyno-stats-only", cl::Hidden, cl::cat(BoltCategory)); -static cl::list -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 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 Hugify; extern cl::opt Instrument; extern cl::opt KeepNops; extern cl::opt Lite; +extern cl::list PrintOnly; +extern cl::opt PrintOnlyFile; extern cl::list ReorderData; extern cl::opt ReorderFunctions; extern cl::opt 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 &FunctionNamesFile, + cl::list &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 &FunctionNamesFile, - cl::list &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 PrintCacheMetrics( cl::desc("calculate and print various metrics for instruction cache"), cl::cat(BoltOptCategory)); +cl::list 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 + PrintOnlyFile("print-only-file", + cl::desc("file with list of functions to print"), cl::Hidden, + cl::cat(BoltCategory)); + cl::opt 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..5e8bcd0e77378 --- /dev/null +++ b/bolt/test/print-only.test @@ -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