summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-profdata/llvm-profdata.cpp
diff options
context:
space:
mode:
authorNathan Slingerland <slingn@gmail.com>2015-11-17 22:08:53 +0000
committerNathan Slingerland <slingn@gmail.com>2015-11-17 22:08:53 +0000
commite6e30d5e884af25e8fbe842c2480d5bdf529cfd0 (patch)
treeb7e5832bd21cfc212859cdaef794c6b43e444d81 /llvm/tools/llvm-profdata/llvm-profdata.cpp
parenta2afcc99116ee4be3b8cf2283f975421462e76fc (diff)
downloadbcm5719-llvm-e6e30d5e884af25e8fbe842c2480d5bdf529cfd0.tar.gz
bcm5719-llvm-e6e30d5e884af25e8fbe842c2480d5bdf529cfd0.zip
[llvm-profdata] Improve error messaging when merging mismatched profile data
Summary: This change tries to make the root cause of instrumented profile data merge failures clearer. Previous: $ llvm-profdata merge test_0.profraw test_1.profraw -o test_merged.profdata test_1.profraw: foo: Function count mismatch test_1.profraw: bar: Function count mismatch test_1.profraw: baz: Function count mismatch ... Changed: $ llvm-profdata merge test_0.profraw test_1.profraw -o test_merged.profdata test_1.profraw: foo: Function basic block count change detected (counter mismatch) Make sure that all profile data to be merged is generated from the same binary. test_1.profraw: bar: Function basic block count change detected (counter mismatch) test_1.profraw: baz: Function basic block count change detected (counter mismatch) ... Reviewers: dnovillo, davidxl, bogner Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D14739 llvm-svn: 253384
Diffstat (limited to 'llvm/tools/llvm-profdata/llvm-profdata.cpp')
-rw-r--r--llvm/tools/llvm-profdata/llvm-profdata.cpp42
1 files changed, 38 insertions, 4 deletions
diff --git a/llvm/tools/llvm-profdata/llvm-profdata.cpp b/llvm/tools/llvm-profdata/llvm-profdata.cpp
index 1cd47dd5e84..f8499c30f66 100644
--- a/llvm/tools/llvm-profdata/llvm-profdata.cpp
+++ b/llvm/tools/llvm-profdata/llvm-profdata.cpp
@@ -27,6 +27,8 @@
#include "llvm/Support/Signals.h"
#include "llvm/Support/raw_ostream.h"
+#include <set>
+
using namespace llvm;
static void exitWithError(const Twine &Message,
@@ -41,7 +43,8 @@ static void exitWithError(const Twine &Message,
::exit(1);
}
-static void exitWithErrorCode(const std::error_code &Error, StringRef Whence = "") {
+static void exitWithErrorCode(const std::error_code &Error,
+ StringRef Whence = "") {
if (Error.category() == instrprof_category()) {
instrprof_error instrError = static_cast<instrprof_error>(Error.value());
if (instrError == instrprof_error::unrecognized_format) {
@@ -57,6 +60,32 @@ namespace {
enum ProfileKinds { instr, sample };
}
+static void handleMergeWriterError(std::error_code &Error,
+ StringRef WhenceFile = "",
+ StringRef WhenceFunction = "",
+ bool ShowHint = true)
+{
+ if (!WhenceFile.empty())
+ errs() << WhenceFile << ": ";
+ if (!WhenceFunction.empty())
+ errs() << WhenceFunction << ": ";
+ errs() << Error.message() << "\n";
+
+ if (ShowHint) {
+ StringRef Hint = "";
+ if (Error.category() == instrprof_category()) {
+ instrprof_error instrError = static_cast<instrprof_error>(Error.value());
+ if (instrError == instrprof_error::count_mismatch) {
+ Hint = "Make sure that all profile data to be merged is generated " \
+ "from the same binary.";
+ }
+ }
+
+ if (!Hint.empty())
+ errs() << Hint << "\n";
+ }
+}
+
static void mergeInstrProfile(const cl::list<std::string> &Inputs,
StringRef OutputFilename) {
if (OutputFilename.compare("-") == 0)
@@ -68,15 +97,20 @@ static void mergeInstrProfile(const cl::list<std::string> &Inputs,
exitWithErrorCode(EC, OutputFilename);
InstrProfWriter Writer;
+ std::set<std::error_code> WriterErrorCodes;
for (const auto &Filename : Inputs) {
auto ReaderOrErr = InstrProfReader::create(Filename);
if (std::error_code ec = ReaderOrErr.getError())
exitWithErrorCode(ec, Filename);
auto Reader = std::move(ReaderOrErr.get());
- for (auto &I : *Reader)
- if (std::error_code EC = Writer.addRecord(std::move(I)))
- errs() << Filename << ": " << I.Name << ": " << EC.message() << "\n";
+ for (auto &I : *Reader) {
+ if (std::error_code EC = Writer.addRecord(std::move(I))) {
+ // Only show hint the first time an error occurs.
+ bool firstTime = WriterErrorCodes.insert(EC).second;
+ handleMergeWriterError(EC, Filename, I.Name, firstTime);
+ }
+ }
if (Reader->hasError())
exitWithErrorCode(Reader->getError(), Filename);
}
OpenPOWER on IntegriCloud