InstrProf: Make CoverageMapping testable and add a basic unit test

Make CoverageMapping easier to create, so that we can write targeted
unit tests for its internals, and add a some infrastructure to write
these tests. Finally, add a simple unit test for basic functionality.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229709 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Justin Bogner
2015-02-18 18:01:14 +00:00
parent 2032d755e7
commit 94da968134
4 changed files with 110 additions and 13 deletions

View File

@ -27,7 +27,7 @@
namespace llvm {
namespace coverage {
class ObjectFileCoverageMappingReader;
class CoverageMappingReader;
/// \brief Coverage mapping information for a single function.
struct CoverageMappingRecord {
@ -41,15 +41,14 @@ struct CoverageMappingRecord {
/// \brief A file format agnostic iterator over coverage mapping data.
class CoverageMappingIterator
: public std::iterator<std::input_iterator_tag, CoverageMappingRecord> {
ObjectFileCoverageMappingReader *Reader;
CoverageMappingReader *Reader;
CoverageMappingRecord Record;
void increment();
public:
CoverageMappingIterator() : Reader(nullptr) {}
CoverageMappingIterator(ObjectFileCoverageMappingReader *Reader)
: Reader(Reader) {
CoverageMappingIterator(CoverageMappingReader *Reader) : Reader(Reader) {
increment();
}
@ -67,6 +66,14 @@ public:
CoverageMappingRecord *operator->() { return &Record; }
};
class CoverageMappingReader {
public:
virtual std::error_code readNextRecord(CoverageMappingRecord &Record) = 0;
CoverageMappingIterator begin() { return CoverageMappingIterator(this); }
CoverageMappingIterator end() { return CoverageMappingIterator(); }
virtual ~CoverageMappingReader() {}
};
/// \brief Base class for the raw coverage mapping and filenames data readers.
class RawCoverageReader {
protected:
@ -135,7 +142,7 @@ private:
/// \brief Reader for the coverage mapping data that is emitted by the
/// frontend and stored in an object file.
class ObjectFileCoverageMappingReader {
class ObjectFileCoverageMappingReader : public CoverageMappingReader {
public:
struct ProfileMappingRecord {
CoverageMappingVersion Version;
@ -184,11 +191,7 @@ public:
sys::fs::file_magic Type = sys::fs::file_magic::unknown);
std::error_code readHeader();
std::error_code readNextRecord(CoverageMappingRecord &Record);
/// Iterator over profile data.
CoverageMappingIterator begin() { return CoverageMappingIterator(this); }
CoverageMappingIterator end() { return CoverageMappingIterator(); }
std::error_code readNextRecord(CoverageMappingRecord &Record) override;
/// \brief Return true if the reader has finished reading the profile data.
bool isEOF() { return LastError == instrprof_error::eof; }