diff --git a/llvm/tools/llvm-cov/CoverageExporterJson.cpp b/llvm/tools/llvm-cov/CoverageExporterJson.cpp --- a/llvm/tools/llvm-cov/CoverageExporterJson.cpp +++ b/llvm/tools/llvm-cov/CoverageExporterJson.cpp @@ -48,6 +48,7 @@ #include "llvm/Support/ThreadPool.h" #include "llvm/Support/Threading.h" #include +#include #include #include @@ -61,14 +62,19 @@ namespace { +int64_t clamp_uint64_to_int64(uint64_t u) { + uint64_t int64_max = static_cast(std::numeric_limits::max()); + return u > int64_max ? int64_max : u; +} + json::Array renderSegment(const coverage::CoverageSegment &Segment) { - return json::Array({Segment.Line, Segment.Col, int64_t(Segment.Count), + return json::Array({Segment.Line, Segment.Col, clamp_uint64_to_int64(Segment.Count), Segment.HasCount, Segment.IsRegionEntry}); } json::Array renderRegion(const coverage::CountedRegion &Region) { return json::Array({Region.LineStart, Region.ColumnStart, Region.LineEnd, - Region.ColumnEnd, int64_t(Region.ExecutionCount), + Region.ColumnEnd, clamp_uint64_to_int64(Region.ExecutionCount), Region.FileID, Region.ExpandedFileID, int64_t(Region.Kind)}); } @@ -182,7 +188,7 @@ for (const auto &F : Functions) FunctionArray.push_back( json::Object({{"name", F.Name}, - {"count", int64_t(F.ExecutionCount)}, + {"count", clamp_uint64_to_int64(F.ExecutionCount)}, {"regions", renderRegions(F.CountedRegions)}, {"filenames", json::Array(F.Filenames)}})); return FunctionArray;