| From 2a42f7f72a138db541fd3f5c0f14998f197d406d Mon Sep 17 00:00:00 2001 |
| From: Yi Kong <yikong@google.com> |
| Date: Tue, 31 May 2022 21:14:31 +0800 |
| Subject: [PATCH] [BOLT] Allow merge-fdata to take a directory as input |
| |
| and recursively merge all files under said directory. This is similar |
| to `llvm-profdata merge`. |
| |
| Differential Revision: https://reviews.llvm.org/D126695 |
| --- |
| bolt/tools/merge-fdata/merge-fdata.cpp | 29 ++++++++++++++++++++++---- |
| 1 file changed, 25 insertions(+), 4 deletions(-) |
| |
| diff --git a/bolt/tools/merge-fdata/merge-fdata.cpp b/bolt/tools/merge-fdata/merge-fdata.cpp |
| index b28ac91e1d55..bea503f43e73 100644 |
| --- a/bolt/tools/merge-fdata/merge-fdata.cpp |
| +++ b/bolt/tools/merge-fdata/merge-fdata.cpp |
| @@ -15,6 +15,7 @@ |
| #include "bolt/Profile/ProfileYAMLMapping.h" |
| #include "llvm/ADT/StringMap.h" |
| #include "llvm/Support/CommandLine.h" |
| +#include "llvm/Support/FileSystem.h" |
| #include "llvm/Support/ManagedStatic.h" |
| #include "llvm/Support/PrettyStackTrace.h" |
| #include "llvm/Support/Signals.h" |
| @@ -235,7 +236,7 @@ bool isYAML(const StringRef Filename) { |
| return false; |
| } |
| |
| -void mergeLegacyProfiles(const cl::list<std::string> &Filenames) { |
| +void mergeLegacyProfiles(const SmallVectorImpl<std::string> &Filenames) { |
| errs() << "Using legacy profile format.\n"; |
| bool BoltedCollection = false; |
| bool First = true; |
| @@ -305,8 +306,28 @@ int main(int argc, char **argv) { |
| |
| ToolName = argv[0]; |
| |
| - if (!isYAML(opts::InputDataFilenames.front())) { |
| - mergeLegacyProfiles(opts::InputDataFilenames); |
| + // Recursively expand input directories into input file lists. |
| + SmallVector<std::string> Inputs; |
| + for (std::string &InputDataFilename : opts::InputDataFilenames) { |
| + if (!llvm::sys::fs::exists(InputDataFilename)) |
| + report_error(InputDataFilename, |
| + std::make_error_code(std::errc::no_such_file_or_directory)); |
| + if (llvm::sys::fs::is_regular_file(InputDataFilename)) |
| + Inputs.emplace_back(InputDataFilename); |
| + else if (llvm::sys::fs::is_directory(InputDataFilename)) { |
| + std::error_code EC; |
| + for (llvm::sys::fs::recursive_directory_iterator F(InputDataFilename, EC), |
| + E; |
| + F != E && !EC; F.increment(EC)) |
| + if (llvm::sys::fs::is_regular_file(F->path())) |
| + Inputs.emplace_back(F->path()); |
| + if (EC) |
| + report_error(InputDataFilename, EC); |
| + } |
| + } |
| + |
| + if (!isYAML(Inputs.front())) { |
| + mergeLegacyProfiles(Inputs); |
| return 0; |
| } |
| |
| @@ -317,7 +338,7 @@ int main(int argc, char **argv) { |
| // Merged information for all functions. |
| StringMap<BinaryFunctionProfile> MergedBFs; |
| |
| - for (std::string &InputDataFilename : opts::InputDataFilenames) { |
| + for (std::string &InputDataFilename : Inputs) { |
| ErrorOr<std::unique_ptr<MemoryBuffer>> MB = |
| MemoryBuffer::getFileOrSTDIN(InputDataFilename); |
| if (std::error_code EC = MB.getError()) |
| -- |
| 2.36.1.255.ge46751e96f-goog |
| |