From c86aca3f01de03aaadc6ef5006846bbba1e5a154 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Tue, 16 Mar 2021 17:18:58 +0100 Subject: pkg/cover: use symbols to split PCs by module We already find symbol for every PC in lazySymbolize. We can just use that to map PCs to modules instead of the additional modules sorting/searching. --- pkg/cover/report.go | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) (limited to 'pkg/cover/report.go') diff --git a/pkg/cover/report.go b/pkg/cover/report.go index 651bc62f2..b622af4a4 100644 --- a/pkg/cover/report.go +++ b/pkg/cover/report.go @@ -110,11 +110,7 @@ func (rg *ReportGenerator) prepareFileMap(progs []Prog) (map[string]*file, error for _, frame := range rg.Frames { f := getFile(files, frame.Name, frame.Path) ln := f.lines[frame.StartLine] - pc := frame.PC - if frame.Module.Name != "" { - pc += frame.Module.Addr - } - coveredBy := progPCs[pc] + coveredBy := progPCs[frame.PC] if len(coveredBy) == 0 { f.uncovered = append(f.uncovered, frame.Range) continue @@ -172,7 +168,7 @@ func (rg *ReportGenerator) lazySymbolize(progs []Prog) error { } symbolize := make(map[*backend.Symbol]bool) uniquePCs := make(map[uint64]bool) - var pcs []uint64 + pcs := make(map[*backend.Module][]uint64) for _, prog := range progs { for _, pc := range prog.PCs { if uniquePCs[pc] { @@ -180,21 +176,16 @@ func (rg *ReportGenerator) lazySymbolize(progs []Prog) error { } uniquePCs[pc] = true sym := rg.findSymbol(pc) - if sym == nil { + if sym == nil || (sym.Symbolized || symbolize[sym]) { continue } - if !sym.Symbolized && !symbolize[sym] { - symbolize[sym] = true - pcs = append(pcs, sym.PCs...) - } + symbolize[sym] = true + pcs[sym.Module] = append(pcs[sym.Module], sym.PCs...) } } if len(uniquePCs) == 0 { return fmt.Errorf("no coverage collected so far") } - if len(pcs) == 0 { - return nil - } frames, err := rg.Symbolize(pcs) if err != nil { return err -- cgit mrf-deployment