X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FProfileData%2FCoverageMappingReader.cpp;h=c8108d4ce9945e9759c38c71e0559261cff5d3ff;hb=165897841bdb651c9d10f4b078f5804b2ca8c30c;hp=83c707fa43d0877cfc2de45d10456aacd56518fe;hpb=65b3fca21f445abb2a01b4c7381ebb5f0f037a32;p=oota-llvm.git diff --git a/lib/ProfileData/CoverageMappingReader.cpp b/lib/ProfileData/CoverageMappingReader.cpp index 83c707fa43d..c8108d4ce99 100644 --- a/lib/ProfileData/CoverageMappingReader.cpp +++ b/lib/ProfileData/CoverageMappingReader.cpp @@ -123,7 +123,7 @@ static const unsigned EncodingExpansionRegionBit = 1 << Counter::EncodingTagBits; /// \brief Read the sub-array of regions for the given inferred file id. -/// \param NumFileIDs: the number of file ids that are defined for this +/// \param NumFileIDs the number of file ids that are defined for this /// function. std::error_code RawCoverageMappingReader::readMappingRegionsSubArray( std::vector &MappingRegions, unsigned InferredFileID, @@ -160,9 +160,6 @@ std::error_code RawCoverageMappingReader::readMappingRegionsSubArray( case CounterMappingRegion::CodeRegion: // Don't do anything when we have a code region with a zero counter. break; - case CounterMappingRegion::EmptyRegion: - Kind = CounterMappingRegion::EmptyRegion; - break; case CounterMappingRegion::SkippedRegion: Kind = CounterMappingRegion::SkippedRegion; break; @@ -173,13 +170,17 @@ std::error_code RawCoverageMappingReader::readMappingRegionsSubArray( } // Read the source range. - uint64_t LineStartDelta, ColumnStart, NumLines, ColumnEnd; + uint64_t LineStartDelta, CodeBeforeColumnStart, NumLines, ColumnEnd; if (auto Err = readIntMax(LineStartDelta, std::numeric_limits::max())) return Err; - if (auto Err = - readIntMax(ColumnStart, std::numeric_limits::max())) + if (auto Err = readULEB128(CodeBeforeColumnStart)) return Err; + bool HasCodeBefore = CodeBeforeColumnStart & 1; + uint64_t ColumnStart = CodeBeforeColumnStart >> + CounterMappingRegion::EncodingHasCodeBeforeBits; + if (ColumnStart > std::numeric_limits::max()) + return error(instrprof_error::malformed); if (auto Err = readIntMax(NumLines, std::numeric_limits::max())) return Err; if (auto Err = readIntMax(ColumnEnd, std::numeric_limits::max())) @@ -197,9 +198,9 @@ std::error_code RawCoverageMappingReader::readMappingRegionsSubArray( ColumnStart = 1; ColumnEnd = std::numeric_limits::max(); } - MappingRegions.push_back( - CounterMappingRegion(C, InferredFileID, LineStart, ColumnStart, - LineStart + NumLines, ColumnEnd, Kind)); + MappingRegions.push_back(CounterMappingRegion( + C, InferredFileID, LineStart, ColumnStart, LineStart + NumLines, + ColumnEnd, HasCodeBefore, Kind)); MappingRegions.back().ExpandedFileID = ExpandedFileID; } return success(); @@ -254,15 +255,19 @@ std::error_code RawCoverageMappingReader::read(CoverageMappingRecord &Record) { // from the expanded file. // Perform multiple passes to correctly propagate the counters through // all the nested expansion regions. + SmallVector FileIDExpansionRegionMapping; + FileIDExpansionRegionMapping.resize(VirtualFileMapping.size(), nullptr); for (unsigned Pass = 1, S = VirtualFileMapping.size(); Pass < S; ++Pass) { - for (auto &I : MappingRegions) { - if (I.Kind == CounterMappingRegion::ExpansionRegion) { - for (const auto &J : MappingRegions) { - if (J.FileID == I.ExpandedFileID) { - I.Count = J.Count; - break; - } - } + for (auto &R : MappingRegions) { + if (R.Kind != CounterMappingRegion::ExpansionRegion) + continue; + assert(!FileIDExpansionRegionMapping[R.ExpandedFileID]); + FileIDExpansionRegionMapping[R.ExpandedFileID] = &R; + } + for (auto &R : MappingRegions) { + if (FileIDExpansionRegionMapping[R.FileID]) { + FileIDExpansionRegionMapping[R.FileID]->Count = R.Count; + FileIDExpansionRegionMapping[R.FileID] = nullptr; } } } @@ -281,7 +286,7 @@ ObjectFileCoverageMappingReader::ObjectFileCoverageMappingReader( if (!File) error(File.getError()); else - Object.reset(File.get()); + Object = std::move(File.get()); } ObjectFileCoverageMappingReader::ObjectFileCoverageMappingReader( @@ -291,7 +296,7 @@ ObjectFileCoverageMappingReader::ObjectFileCoverageMappingReader( if (!File) error(File.getError()); else - Object.reset(File.get()); + Object = std::move(File.get()); } namespace {