X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FProfileData%2FCoverageMapping.cpp;h=cf04fea8491da13e7fd0b7f35c91eab978dcc215;hb=bcd8e0aae7dc4eea0ff0a425ba164db10c4dcb71;hp=31213d7fb2d9568b26efa97eaa386e5c6ac6e186;hpb=c0c21334847550e55a375500c0a8433b0300cc7d;p=oota-llvm.git diff --git a/lib/ProfileData/CoverageMapping.cpp b/lib/ProfileData/CoverageMapping.cpp index 31213d7fb2d..cf04fea8491 100644 --- a/lib/ProfileData/CoverageMapping.cpp +++ b/lib/ProfileData/CoverageMapping.cpp @@ -19,7 +19,11 @@ #include "llvm/ProfileData/CoverageMappingReader.h" #include "llvm/ProfileData/InstrProfReader.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/Errc.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/raw_ostream.h" using namespace llvm; using namespace coverage; @@ -151,11 +155,11 @@ ErrorOr CounterMappingContext::evaluate(const Counter &C) const { return 0; case Counter::CounterValueReference: if (C.getCounterID() >= CounterValues.size()) - return std::make_error_code(std::errc::argument_out_of_domain); + return make_error_code(errc::argument_out_of_domain); return CounterValues[C.getCounterID()]; case Counter::Expression: { if (C.getExpressionID() >= Expressions.size()) - return std::make_error_code(std::errc::argument_out_of_domain); + return make_error_code(errc::argument_out_of_domain); const auto &E = Expressions[C.getExpressionID()]; ErrorOr LHS = evaluate(E.LHS); if (!LHS) @@ -177,6 +181,18 @@ void FunctionRecordIterator::skipOtherFiles() { *this = FunctionRecordIterator(); } +/// Get the function name from the record, removing the filename prefix if +/// necessary. +static StringRef getFuncNameWithoutPrefix(const CoverageMappingRecord &Record) { + StringRef FunctionName = Record.FunctionName; + if (Record.Filenames.empty()) + return FunctionName; + StringRef Filename = sys::path::filename(Record.Filenames[0]); + if (FunctionName.startswith(Filename)) + FunctionName = FunctionName.drop_front(Filename.size() + 1); + return FunctionName; +} + ErrorOr> CoverageMapping::load(CoverageMappingReader &CoverageReader, IndexedInstrProfReader &ProfileReader) { @@ -194,11 +210,13 @@ CoverageMapping::load(CoverageMappingReader &CoverageReader, continue; } else if (EC != instrprof_error::unknown_function) return EC; - } else - Ctx.setCounts(Counts); + Counts.assign(Record.MappingRegions.size(), 0); + } + Ctx.setCounts(Counts); assert(!Record.MappingRegions.empty() && "Function has no regions"); - FunctionRecord Function(Record.FunctionName, Record.Filenames); + + FunctionRecord Function(getFuncNameWithoutPrefix(Record), Record.Filenames); for (const auto &Region : Record.MappingRegions) { ErrorOr ExecutionCount = Ctx.evaluate(Region.Count); if (!ExecutionCount) @@ -217,12 +235,13 @@ CoverageMapping::load(CoverageMappingReader &CoverageReader, } ErrorOr> -CoverageMapping::load(StringRef ObjectFilename, StringRef ProfileFilename) { +CoverageMapping::load(StringRef ObjectFilename, StringRef ProfileFilename, + StringRef Arch) { auto CounterMappingBuff = MemoryBuffer::getFileOrSTDIN(ObjectFilename); if (std::error_code EC = CounterMappingBuff.getError()) return EC; auto CoverageReaderOrErr = - BinaryCoverageReader::create(CounterMappingBuff.get()); + BinaryCoverageReader::create(CounterMappingBuff.get(), Arch); if (std::error_code EC = CoverageReaderOrErr.getError()) return EC; auto CoverageReader = std::move(CoverageReaderOrErr.get()); @@ -479,3 +498,33 @@ CoverageMapping::getCoverageForExpansion(const ExpansionRecord &Expansion) { return ExpansionCoverage; } + +namespace { +class CoverageMappingErrorCategoryType : public std::error_category { + const char *name() const LLVM_NOEXCEPT override { return "llvm.coveragemap"; } + std::string message(int IE) const override { + auto E = static_cast(IE); + switch (E) { + case coveragemap_error::success: + return "Success"; + case coveragemap_error::eof: + return "End of File"; + case coveragemap_error::no_data_found: + return "No coverage data found"; + case coveragemap_error::unsupported_version: + return "Unsupported coverage format version"; + case coveragemap_error::truncated: + return "Truncated coverage data"; + case coveragemap_error::malformed: + return "Malformed coverage data"; + } + llvm_unreachable("A value of coveragemap_error has no message."); + } +}; +} + +static ManagedStatic ErrorCategory; + +const std::error_category &llvm::coveragemap_category() { + return *ErrorCategory; +}