diff options
Diffstat (limited to 'pkg/cover')
| -rw-r--r-- | pkg/cover/report.go | 67 |
1 files changed, 39 insertions, 28 deletions
diff --git a/pkg/cover/report.go b/pkg/cover/report.go index f147eedd0..056021739 100644 --- a/pkg/cover/report.go +++ b/pkg/cover/report.go @@ -105,34 +105,9 @@ func (rg *ReportGenerator) prepareFileMap(progs []Prog, force, debug bool) (file } } } - matchedPC := false - for _, frame := range rg.Frames { - f := fileByFrame(files, frame) - ln := f.lines[frame.StartLine] - coveredBy := pcToProgs[frame.PC] - if len(coveredBy) == 0 { - f.uncovered = append(f.uncovered, frame.Range) - continue - } - // Covered frame. - f.covered = append(f.covered, frame.Range) - matchedPC = true - if ln.progCount == nil { - ln.progCount = make(map[int]bool) - ln.pcProgCount = make(map[uint64]int) - ln.progIndex = -1 - } - for progIndex := range coveredBy { - ln.progCount[progIndex] = true - if ln.progIndex == -1 || len(progs[progIndex].Data) < len(progs[ln.progIndex].Data) { - ln.progIndex = progIndex - } - ln.pcProgCount[frame.PC]++ - } - f.lines[frame.StartLine] = ln - } - if !matchedPC { - return nil, fmt.Errorf("coverage doesn't match any coverage callbacks") + err := rg.frame2line(files, pcToProgs, progs) + if err != nil { + return nil, err } // If the backend provided coverage callback locations for the binaries, use them to // verify data returned by kcov. @@ -168,6 +143,42 @@ func (rg *ReportGenerator) prepareFileMap(progs []Prog, force, debug bool) (file return files, nil } +func (rg *ReportGenerator) frame2line(files fileMap, pcToProgs map[uint64]map[int]bool, progs []Prog) error { + matchedPC := false + for _, frame := range rg.Frames { + if frame.StartLine < 0 { + continue + } + f := fileByFrame(files, frame) + ln := f.lines[frame.StartLine] + coveredBy := pcToProgs[frame.PC] + if len(coveredBy) == 0 { + f.uncovered = append(f.uncovered, frame.Range) + continue + } + // Covered frame. + f.covered = append(f.covered, frame.Range) + matchedPC = true + if ln.progCount == nil { + ln.progCount = make(map[int]bool) + ln.pcProgCount = make(map[uint64]int) + ln.progIndex = -1 + } + for progIndex := range coveredBy { + ln.progCount[progIndex] = true + if ln.progIndex == -1 || len(progs[progIndex].Data) < len(progs[ln.progIndex].Data) { + ln.progIndex = progIndex + } + ln.pcProgCount[frame.PC]++ + } + f.lines[frame.StartLine] = ln + } + if !matchedPC { + return fmt.Errorf("coverage doesn't match any coverage callbacks") + } + return nil +} + func contains(pcs []uint64, pc uint64) bool { idx := sort.Search(len(pcs), func(i int) bool { return pcs[i] >= pc }) return idx < len(pcs) && pcs[idx] == pc |
