diff --git a/bolt/test/X86/merge-fdata-output.test b/bolt/test/X86/merge-fdata-output.test new file mode 100644 --- /dev/null +++ b/bolt/test/X86/merge-fdata-output.test @@ -0,0 +1,16 @@ +# Check merge-fdata tool correctly handles `-o` option. +RUN: merge-fdata %S/Inputs/bat_profile_1.fdata \ +RUN: %S/Inputs/bat_profile_2.fdata \ +RUN: | FileCheck %s + +RUN: merge-fdata %S/Inputs/bat_profile_1.fdata \ +RUN: %S/Inputs/bat_profile_2.fdata \ +RUN: -o - \ +RUN: | FileCheck %s + +RUN: merge-fdata %S/Inputs/bat_profile_1.fdata \ +RUN: %S/Inputs/bat_profile_2.fdata \ +RUN: -o %t +RUN: FileCheck %s < %t + +CHECK: 1 main 451 1 SolveCubic 0 0 302 \ No newline at end of file diff --git a/bolt/tools/merge-fdata/merge-fdata.cpp b/bolt/tools/merge-fdata/merge-fdata.cpp --- a/bolt/tools/merge-fdata/merge-fdata.cpp +++ b/bolt/tools/merge-fdata/merge-fdata.cpp @@ -64,6 +64,12 @@ cl::Optional, cl::cat(MergeFdataCategory)); +static cl::opt +OutputFilePath("o", + cl::value_desc("file"), + cl::desc("Write output to "), + cl::cat(MergeFdataCategory)); + } // namespace opts namespace { @@ -81,6 +87,18 @@ exit(1); } +static raw_fd_ostream &output() { + if (opts::OutputFilePath.empty() || opts::OutputFilePath == "-") + return outs(); + else { + std::error_code EC; + static raw_fd_ostream Output(opts::OutputFilePath, EC); + if (EC) + report_error(opts::OutputFilePath, EC); + return Output; + } +} + void mergeProfileHeaders(BinaryProfileHeader &MergedHeader, const BinaryProfileHeader &Header) { if (MergedHeader.FileName.empty()) @@ -283,9 +301,9 @@ } if (BoltedCollection) - outs() << "boltedcollection\n"; + output() << "boltedcollection\n"; for (const auto &Entry : Entries) - outs() << Entry.getKey() << " " << Entry.getValue() << "\n"; + output() << Entry.getKey() << " " << Entry.getValue() << "\n"; errs() << "Profile from " << Filenames.size() << " files merged.\n"; } @@ -375,7 +393,7 @@ } if (!opts::SuppressMergedDataOutput) { - yaml::Output YamlOut(outs()); + yaml::Output YamlOut(output()); BinaryProfile MergedProfile; MergedProfile.Header = MergedHeader;