aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/cover
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2025-02-18 12:02:15 +0100
committerTaras Madan <tarasmadan@google.com>2025-02-28 13:35:55 +0000
commita32cfd24f5f44c6c4ad9960549b824ee6b5a75f6 (patch)
tree77613a238083df3b0c064a5f220ff8835d31c349 /pkg/cover
parent17d36e51d0fc3e756c450827100222e1f09eb2f0 (diff)
pkg/cover: use frame pointers instead
Diffstat (limited to 'pkg/cover')
-rw-r--r--pkg/cover/backend/backend.go4
-rw-r--r--pkg/cover/backend/dwarf.go14
-rw-r--r--pkg/cover/backend/gvisor.go16
-rw-r--r--pkg/cover/report.go2
4 files changed, 18 insertions, 18 deletions
diff --git a/pkg/cover/backend/backend.go b/pkg/cover/backend/backend.go
index a660d02e4..7e8e7f8b8 100644
--- a/pkg/cover/backend/backend.go
+++ b/pkg/cover/backend/backend.go
@@ -14,8 +14,8 @@ import (
type Impl struct {
Units []*CompileUnit
Symbols []*Symbol
- Frames []Frame
- Symbolize func(pcs map[*vminfo.KernelModule][]uint64) ([]Frame, error)
+ Frames []*Frame
+ Symbolize func(pcs map[*vminfo.KernelModule][]uint64) ([]*Frame, error)
CallbackPoints []uint64
PreciseCoverage bool
}
diff --git a/pkg/cover/backend/dwarf.go b/pkg/cover/backend/dwarf.go
index 7fc91413f..a6045b91e 100644
--- a/pkg/cover/backend/dwarf.go
+++ b/pkg/cover/backend/dwarf.go
@@ -243,7 +243,7 @@ func makeDWARFUnsafe(params *dwarfParams) (*Impl, error) {
impl := &Impl{
Units: allUnits,
Symbols: allSymbols,
- Symbolize: func(pcs map[*vminfo.KernelModule][]uint64) ([]Frame, error) {
+ Symbolize: func(pcs map[*vminfo.KernelModule][]uint64) ([]*Frame, error) {
return symbolize(target, &interner, objDir, srcDir, buildDir, splitBuildDelimiters, pcs)
},
CallbackPoints: allCoverPoints[0],
@@ -402,7 +402,7 @@ func readTextRanges(debugInfo *dwarf.Data, module *vminfo.KernelModule, pcFix pc
}
func symbolizeModule(target *targets.Target, interner *symbolizer.Interner, objDir, srcDir, buildDir string,
- splitBuildDelimiters []string, mod *vminfo.KernelModule, pcs []uint64) ([]Frame, error) {
+ splitBuildDelimiters []string, mod *vminfo.KernelModule, pcs []uint64) ([]*Frame, error) {
procs := min(runtime.GOMAXPROCS(0)/2, len(pcs)/1000)
const (
minProcs = 1
@@ -446,7 +446,7 @@ func symbolizeModule(target *targets.Target, interner *symbolizer.Interner, objD
}
close(pcchan)
var err0 error
- var frames []Frame
+ var frames []*Frame
for p := 0; p < procs; p++ {
res := <-symbolizerC
if res.err != nil {
@@ -458,7 +458,7 @@ func symbolizeModule(target *targets.Target, interner *symbolizer.Interner, objD
if mod.Name != "" {
pc = frame.PC + mod.Addr
}
- frames = append(frames, Frame{
+ frames = append(frames, &Frame{
Module: mod,
PC: pc,
Name: interner.Do(name),
@@ -481,10 +481,10 @@ func symbolizeModule(target *targets.Target, interner *symbolizer.Interner, objD
}
func symbolize(target *targets.Target, interner *symbolizer.Interner, objDir, srcDir, buildDir string,
- splitBuildDelimiters []string, pcs map[*vminfo.KernelModule][]uint64) ([]Frame, error) {
- var frames []Frame
+ splitBuildDelimiters []string, pcs map[*vminfo.KernelModule][]uint64) ([]*Frame, error) {
+ var frames []*Frame
type frameResult struct {
- frames []Frame
+ frames []*Frame
err error
}
frameC := make(chan frameResult, len(pcs))
diff --git a/pkg/cover/backend/gvisor.go b/pkg/cover/backend/gvisor.go
index 56a36a5dc..fb188e784 100644
--- a/pkg/cover/backend/gvisor.go
+++ b/pkg/cover/backend/gvisor.go
@@ -54,7 +54,7 @@ func makeGvisor(target *targets.Target, objDir, srcDir, buildDir string, modules
return impl, nil
}
-func gvisorSymbolize(bin, srcDir string) ([]Frame, error) {
+func gvisorSymbolize(bin, srcDir string) ([]*Frame, error) {
cmd := osutil.Command(bin, "symbolize", "-all")
stdout, err := cmd.StdoutPipe()
if err != nil {
@@ -66,7 +66,7 @@ func gvisorSymbolize(bin, srcDir string) ([]Frame, error) {
}
defer cmd.Wait()
defer cmd.Process.Kill()
- var frames []Frame
+ var frames []*Frame
s := bufio.NewScanner(stdout)
for s.Scan() {
frame, err := gvisorParseLine(s)
@@ -93,27 +93,27 @@ func gvisorSymbolize(bin, srcDir string) ([]Frame, error) {
return frames, nil
}
-func gvisorParseLine(s *bufio.Scanner) (Frame, error) {
+func gvisorParseLine(s *bufio.Scanner) (*Frame, error) {
pc, err := strconv.ParseUint(s.Text(), 0, 64)
if err != nil {
- return Frame{}, fmt.Errorf("read pc %q, but no line info", pc)
+ return nil, fmt.Errorf("read pc %q, but no line info", pc)
}
if !s.Scan() {
- return Frame{}, fmt.Errorf("read pc %q, but no line info", pc)
+ return nil, fmt.Errorf("read pc %q, but no line info", pc)
}
match := gvisorLineRe.FindStringSubmatch(s.Text())
if match == nil {
- return Frame{}, fmt.Errorf("failed to parse line: %q", s.Text())
+ return nil, fmt.Errorf("failed to parse line: %q", s.Text())
}
var ints [4]int
for i := range ints {
x, err := strconv.ParseUint(match[i+3], 0, 32)
if err != nil {
- return Frame{}, fmt.Errorf("failed to parse number %q: %w", match[i+3], err)
+ return nil, fmt.Errorf("failed to parse number %q: %w", match[i+3], err)
}
ints[i] = int(x)
}
- frame := Frame{
+ frame := &Frame{
PC: pc,
Name: match[2],
Range: Range{
diff --git a/pkg/cover/report.go b/pkg/cover/report.go
index 7c9b8078b..3802f7b39 100644
--- a/pkg/cover/report.go
+++ b/pkg/cover/report.go
@@ -108,7 +108,7 @@ func (rg *ReportGenerator) prepareFileMap(progs []Prog, force, debug bool) (file
}
matchedPC := false
for _, frame := range rg.Frames {
- f := fileByFrame(files, &frame)
+ f := fileByFrame(files, frame)
ln := f.lines[frame.StartLine]
coveredBy := pcToProgs[frame.PC]
if len(coveredBy) == 0 {