Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions bolt/include/bolt/Rewrite/RewriteInstance.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
10 changes: 2 additions & 8 deletions bolt/lib/Core/BinaryFunction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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"),
Expand Down
27 changes: 18 additions & 9 deletions bolt/lib/Rewrite/RewriteInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -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);
Expand Down
10 changes: 10 additions & 0 deletions bolt/lib/Utils/CommandLineOpts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
25 changes: 25 additions & 0 deletions bolt/test/print-only.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Verify if `--print-only` and `--print-only-files` work fine.

# REQURIES: system-linux
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo:

Suggested change
# REQURIES: system-linux
# 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
Loading