[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
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user