diff options
author | Nathan Slingerland <slingn@gmail.com> | 2015-11-12 18:06:18 +0000 |
---|---|---|
committer | Nathan Slingerland <slingn@gmail.com> | 2015-11-12 18:06:18 +0000 |
commit | f0e107e38ad1acdf800216d877a82686cfc20143 (patch) | |
tree | a118835d23409631ffe3c00284c8f95ec869e467 /llvm/lib/ProfileData/SampleProfReader.cpp | |
parent | 4b6bdb538efa13179b7862dba11a0a07fc35e304 (diff) | |
download | llvm-f0e107e38ad1acdf800216d877a82686cfc20143.zip llvm-f0e107e38ad1acdf800216d877a82686cfc20143.tar.gz llvm-f0e107e38ad1acdf800216d877a82686cfc20143.tar.bz2 |
[llvm-profdata] Add check for text profile formats and improve error reporting
Summary:
This change addresses two possible instances of user error / confusion when
merging sampled profile data.
Previously any input that didn't match the raw or processed instrumented format
would automatically be interpreted as instrumented profile text format data.
No error would be reported during the merge.
Example:
If foo-sampled.profdata and bar-sampled.profdata are binary sampled profiles:
Old behavior:
$ llvm-profdata merge foo-sampled.profdata bar-sampled.profdata -output foobar-sampled.profdata
$ llvm-profdata show -sample foobar-sampled.profdata
error: foobar-sampled.profdata:1: Expected 'mangled_name:NUM:NUM', found lprofi
This change adds basic checks for valid input data when assuming text input.
It also makes error messages related to file format validity more specific about
the assumbed profile data type.
New behavior:
$ llvm-profdata merge foo-sampled.profdata bar-sampled.profdata -o foobar-sampled.profdata
error: foo.profdata: Unrecognized instrumentation profile encoding format
Perhaps you forgot to use the -sample option?
Reviewers: bogner, davidxl, dnovillo
Subscribers: davidxl, llvm-commits
Differential Revision: http://reviews.llvm.org/D14558
llvm-svn: 252916
Diffstat (limited to 'llvm/lib/ProfileData/SampleProfReader.cpp')
-rw-r--r-- | llvm/lib/ProfileData/SampleProfReader.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/llvm/lib/ProfileData/SampleProfReader.cpp b/llvm/lib/ProfileData/SampleProfReader.cpp index a5d0008..0bed4f0 100644 --- a/llvm/lib/ProfileData/SampleProfReader.cpp +++ b/llvm/lib/ProfileData/SampleProfReader.cpp @@ -222,6 +222,22 @@ std::error_code SampleProfileReaderText::read() { return sampleprof_error::success; } +bool SampleProfileReaderText::hasFormat(const MemoryBuffer &Buffer) { + bool result = false; + + // Check that the first non-comment line is a valid function header. + line_iterator LineIt(Buffer, /*SkipBlanks=*/true, '#'); + if (!LineIt.is_at_eof()) { + if ((*LineIt)[0] != ' ') { + uint64_t NumSamples, NumHeadSamples; + StringRef FName; + result = ParseHead(*LineIt, FName, NumSamples, NumHeadSamples); + } + } + + return result; +} + template <typename T> ErrorOr<T> SampleProfileReaderBinary::readNumber() { unsigned NumBytesRead = 0; std::error_code EC; @@ -685,8 +701,10 @@ SampleProfileReader::create(StringRef Filename, LLVMContext &C) { Reader.reset(new SampleProfileReaderBinary(std::move(Buffer), C)); else if (SampleProfileReaderGCC::hasFormat(*Buffer)) Reader.reset(new SampleProfileReaderGCC(std::move(Buffer), C)); - else + else if (SampleProfileReaderText::hasFormat(*Buffer)) Reader.reset(new SampleProfileReaderText(std::move(Buffer), C)); + else + return sampleprof_error::unrecognized_format; if (std::error_code EC = Reader->readHeader()) return EC; |