aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/cover/report.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/cover/report.go')
-rw-r--r--pkg/cover/report.go67
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