aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-12-12 08:45:06 +0100
committerDmitry Vyukov <dvyukov@google.com>2020-12-13 18:56:36 +0100
commitd0d624444f8c925c99f29ff0deff2a2ce8c951d9 (patch)
tree9606d07b815f7caecb9b3671745ffba5844c8b42 /pkg
parent69bc3eaa35c92378b58e5785e092b66b4b17e586 (diff)
pkg/cover: provide ReportGenerator.RestorePC
Better encapsulate all of this logic instead of exposing raw .text offset and a bunch of functions. Also allows to support gvisor coverage where PCs don't need to be rewound to previous instruction.
Diffstat (limited to 'pkg')
-rw-r--r--pkg/cover/backend/backend.go10
-rw-r--r--pkg/cover/backend/elf.go8
-rw-r--r--pkg/cover/backend/pc.go (renamed from pkg/cover/pc.go)6
-rw-r--r--pkg/cover/cover.go4
-rw-r--r--pkg/cover/report.go5
5 files changed, 20 insertions, 13 deletions
diff --git a/pkg/cover/backend/backend.go b/pkg/cover/backend/backend.go
index 7da6abfc5..405cbaa3f 100644
--- a/pkg/cover/backend/backend.go
+++ b/pkg/cover/backend/backend.go
@@ -9,11 +9,11 @@ import (
)
type Impl struct {
- Units []*CompileUnit
- Symbols []*Symbol
- Frames []symbolizer.Frame
- TextOffset uint32 // high 32 bits of PCs
- Symbolize func(pcs []uint64) ([]symbolizer.Frame, error)
+ Units []*CompileUnit
+ Symbols []*Symbol
+ Frames []symbolizer.Frame
+ Symbolize func(pcs []uint64) ([]symbolizer.Frame, error)
+ RestorePC func(pc uint32) uint64
}
type CompileUnit struct {
diff --git a/pkg/cover/backend/elf.go b/pkg/cover/backend/elf.go
index 0821f331a..c8e0879b0 100644
--- a/pkg/cover/backend/elf.go
+++ b/pkg/cover/backend/elf.go
@@ -74,12 +74,14 @@ func makeELF(target *targets.Target, objDir string) (*Impl, error) {
return nil, fmt.Errorf("failed to parse DWARF (set CONFIG_DEBUG_INFO=y?)")
}
impl := &Impl{
- Units: units,
- Symbols: symbols,
- TextOffset: uint32(textAddr >> 32),
+ Units: units,
+ Symbols: symbols,
Symbolize: func(pcs []uint64) ([]symbolizer.Frame, error) {
return symbolize(target, kernelObject, pcs)
},
+ RestorePC: func(pc uint32) uint64 {
+ return PreviousInstructionPC(target, RestorePC(pc, uint32(textAddr>>32)))
+ },
}
return impl, nil
}
diff --git a/pkg/cover/pc.go b/pkg/cover/backend/pc.go
index 5987e8846..ae92f9298 100644
--- a/pkg/cover/pc.go
+++ b/pkg/cover/backend/pc.go
@@ -1,7 +1,7 @@
// Copyright 2020 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
-package cover
+package backend
import (
"fmt"
@@ -9,6 +9,10 @@ import (
"github.com/google/syzkaller/sys/targets"
)
+func RestorePC(pc, base uint32) uint64 {
+ return uint64(base)<<32 + uint64(pc)
+}
+
func PreviousInstructionPC(target *targets.Target, pc uint64) uint64 {
offset := instructionLen(target.Arch)
pc -= offset
diff --git a/pkg/cover/cover.go b/pkg/cover/cover.go
index 40c806fd7..814ae4fb6 100644
--- a/pkg/cover/cover.go
+++ b/pkg/cover/cover.go
@@ -43,7 +43,3 @@ func (cov Cover) Serialize() []uint32 {
}
return res
}
-
-func RestorePC(pc, base uint32) uint64 {
- return uint64(base)<<32 + uint64(pc)
-}
diff --git a/pkg/cover/report.go b/pkg/cover/report.go
index 9b515905f..14c0b7422 100644
--- a/pkg/cover/report.go
+++ b/pkg/cover/report.go
@@ -26,6 +26,11 @@ type Prog struct {
PCs []uint64
}
+var (
+ RestorePC = backend.RestorePC
+ PreviousInstructionPC = backend.PreviousInstructionPC
+)
+
func MakeReportGenerator(target *targets.Target, vm, objDir, srcDir, buildDir string) (*ReportGenerator, error) {
impl, err := backend.Make(target, vm, objDir)
if err != nil {