aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorJoey Jiao <quic_jiangenj@quicinc.com>2024-05-14 13:31:11 +0800
committerAleksandr Nogikh <nogikh@google.com>2024-06-17 08:56:33 +0000
commitc1349e08b8ce2abf7e86375364268d8f696d077c (patch)
treebbaa470c0f5ac9e0b273c9ee0b0088dedcfe07c1 /pkg
parent88722c0f8d981b97d57db71d7bafa3a2db6f2197 (diff)
all: use only one KernelModule struct
Diffstat (limited to 'pkg')
-rw-r--r--pkg/cover/backend/backend.go14
-rw-r--r--pkg/cover/backend/dwarf.go24
-rw-r--r--pkg/cover/backend/elf.go8
-rw-r--r--pkg/cover/backend/mach-o.go8
-rw-r--r--pkg/cover/backend/modules.go11
-rw-r--r--pkg/cover/report.go2
6 files changed, 31 insertions, 36 deletions
diff --git a/pkg/cover/backend/backend.go b/pkg/cover/backend/backend.go
index 631201480..fa4b8303a 100644
--- a/pkg/cover/backend/backend.go
+++ b/pkg/cover/backend/backend.go
@@ -13,26 +13,20 @@ type Impl struct {
Units []*CompileUnit
Symbols []*Symbol
Frames []Frame
- Symbolize func(pcs map[*Module][]uint64) ([]Frame, error)
+ Symbolize func(pcs map[*KernelModule][]uint64) ([]Frame, error)
CallbackPoints []uint64
PreciseCoverage bool
}
-type Module struct {
- Name string
- Path string
- Addr uint64
-}
-
type CompileUnit struct {
ObjectUnit
Path string
- Module *Module
+ Module *KernelModule
}
type Symbol struct {
ObjectUnit
- Module *Module
+ Module *KernelModule
Unit *CompileUnit
Start uint64
End uint64
@@ -47,7 +41,7 @@ type ObjectUnit struct {
}
type Frame struct {
- Module *Module
+ Module *KernelModule
PC uint64
Name string
FuncName string
diff --git a/pkg/cover/backend/dwarf.go b/pkg/cover/backend/dwarf.go
index 5378c1cd7..b01e8a0d1 100644
--- a/pkg/cover/backend/dwarf.go
+++ b/pkg/cover/backend/dwarf.go
@@ -31,10 +31,10 @@ type dwarfParams struct {
splitBuildDelimiters []string
moduleObj []string
hostModules []KernelModule
- readSymbols func(*Module, *symbolInfo) ([]*Symbol, error)
- readTextData func(*Module) ([]byte, error)
- readModuleCoverPoints func(*targets.Target, *Module, *symbolInfo) ([2][]uint64, error)
- readTextRanges func(*Module) ([]pcRange, []*CompileUnit, error)
+ readSymbols func(*KernelModule, *symbolInfo) ([]*Symbol, error)
+ readTextData func(*KernelModule) ([]byte, error)
+ readModuleCoverPoints func(*targets.Target, *KernelModule, *symbolInfo) ([2][]uint64, error)
+ readTextRanges func(*KernelModule) ([]pcRange, []*CompileUnit, error)
getCompilerVersion func(string) string
}
@@ -104,7 +104,7 @@ type Result struct {
Symbols []*Symbol
}
-func processModule(params *dwarfParams, module *Module, info *symbolInfo,
+func processModule(params *dwarfParams, module *KernelModule, info *symbolInfo,
target *targets.Target) (*Result, error) {
symbols, err := params.readSymbols(module, info)
if err != nil {
@@ -162,7 +162,7 @@ func makeDWARFUnsafe(params *dwarfParams) (*Impl, error) {
}
binC := make(chan binResult, len(modules))
for _, module := range modules {
- go func(m *Module) {
+ go func(m *KernelModule) {
info := &symbolInfo{
tracePC: make(map[uint64]bool),
traceCmp: make(map[uint64]bool),
@@ -234,7 +234,7 @@ func makeDWARFUnsafe(params *dwarfParams) (*Impl, error) {
impl := &Impl{
Units: allUnits,
Symbols: allSymbols,
- Symbolize: func(pcs map[*Module][]uint64) ([]Frame, error) {
+ Symbolize: func(pcs map[*KernelModule][]uint64) ([]Frame, error) {
return symbolize(target, &interner, objDir, srcDir, buildDir, splitBuildDelimiters, pcs)
},
CallbackPoints: allCoverPoints[0],
@@ -342,7 +342,7 @@ type pcRange struct {
type pcFixFn = (func([2]uint64) ([2]uint64, bool))
-func readTextRanges(debugInfo *dwarf.Data, module *Module, pcFix pcFixFn) (
+func readTextRanges(debugInfo *dwarf.Data, module *KernelModule, pcFix pcFixFn) (
[]pcRange, []*CompileUnit, error) {
var ranges []pcRange
var units []*CompileUnit
@@ -389,7 +389,7 @@ func readTextRanges(debugInfo *dwarf.Data, module *Module, pcFix pcFixFn) (
}
func symbolizeModule(target *targets.Target, interner *symbolizer.Interner, objDir, srcDir, buildDir string,
- splitBuildDelimiters []string, mod *Module, pcs []uint64) ([]Frame, error) {
+ splitBuildDelimiters []string, mod *KernelModule, pcs []uint64) ([]Frame, error) {
procs := runtime.GOMAXPROCS(0) / 2
if need := len(pcs) / 1000; procs > need {
procs = need
@@ -470,7 +470,7 @@ 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[*Module][]uint64) ([]Frame, error) {
+ splitBuildDelimiters []string, pcs map[*KernelModule][]uint64) ([]Frame, error) {
var frames []Frame
type frameResult struct {
frames []Frame
@@ -478,7 +478,7 @@ func symbolize(target *targets.Target, interner *symbolizer.Interner, objDir, sr
}
frameC := make(chan frameResult, len(pcs))
for mod, pcs1 := range pcs {
- go func(mod *Module, pcs []uint64) {
+ go func(mod *KernelModule, pcs []uint64) {
frames, err := symbolizeModule(target, interner, objDir, srcDir, buildDir, splitBuildDelimiters, mod, pcs)
frameC <- frameResult{frames: frames, err: err}
}(mod, pcs1)
@@ -602,7 +602,7 @@ func cleanPath(path, objDir, srcDir, buildDir string, splitBuildDelimiters []str
// objdump is an old, slow way of finding coverage points.
// amd64 uses faster option of parsing binary directly (readCoverPoints).
// TODO: use the faster approach for all other arches and drop this.
-func objdump(target *targets.Target, mod *Module) ([2][]uint64, error) {
+func objdump(target *targets.Target, mod *KernelModule) ([2][]uint64, error) {
var pcs [2][]uint64
cmd := osutil.Command(target.Objdump, "-d", "--no-show-raw-insn", mod.Path)
stdout, err := cmd.StdoutPipe()
diff --git a/pkg/cover/backend/elf.go b/pkg/cover/backend/elf.go
index 6d1147c0a..45c841a68 100644
--- a/pkg/cover/backend/elf.go
+++ b/pkg/cover/backend/elf.go
@@ -57,7 +57,7 @@ func getTraceCallbackType(name string) int {
return TraceCbNone
}
-func elfReadSymbols(module *Module, info *symbolInfo) ([]*Symbol, error) {
+func elfReadSymbols(module *KernelModule, info *symbolInfo) ([]*Symbol, error) {
file, err := elf.Open(module.Path)
if err != nil {
return nil, err
@@ -108,7 +108,7 @@ func elfReadSymbols(module *Module, info *symbolInfo) ([]*Symbol, error) {
return symbols, nil
}
-func elfReadTextRanges(module *Module) ([]pcRange, []*CompileUnit, error) {
+func elfReadTextRanges(module *KernelModule) ([]pcRange, []*CompileUnit, error) {
file, err := elf.Open(module.Path)
if err != nil {
return nil, nil, err
@@ -152,7 +152,7 @@ func elfReadTextRanges(module *Module) ([]pcRange, []*CompileUnit, error) {
return readTextRanges(debugInfo, module, pcFix)
}
-func elfReadTextData(module *Module) ([]byte, error) {
+func elfReadTextData(module *KernelModule) ([]byte, error) {
file, err := elf.Open(module.Path)
if err != nil {
return nil, err
@@ -165,7 +165,7 @@ func elfReadTextData(module *Module) ([]byte, error) {
return text.Data()
}
-func elfReadModuleCoverPoints(target *targets.Target, module *Module, info *symbolInfo) ([2][]uint64, error) {
+func elfReadModuleCoverPoints(target *targets.Target, module *KernelModule, info *symbolInfo) ([2][]uint64, error) {
var pcs [2][]uint64
file, err := elf.Open(module.Path)
if err != nil {
diff --git a/pkg/cover/backend/mach-o.go b/pkg/cover/backend/mach-o.go
index 0d3546cec..d56cf010f 100644
--- a/pkg/cover/backend/mach-o.go
+++ b/pkg/cover/backend/mach-o.go
@@ -29,7 +29,7 @@ func makeMachO(target *targets.Target, objDir, srcDir, buildDir string,
})
}
-func machoReadSymbols(module *Module, info *symbolInfo) ([]*Symbol, error) {
+func machoReadSymbols(module *KernelModule, info *symbolInfo) ([]*Symbol, error) {
file, err := macho.Open(module.Path)
if err != nil {
return nil, err
@@ -87,7 +87,7 @@ func machoReadSymbols(module *Module, info *symbolInfo) ([]*Symbol, error) {
return symbols, nil
}
-func machoReadTextRanges(module *Module) ([]pcRange, []*CompileUnit, error) {
+func machoReadTextRanges(module *KernelModule) ([]pcRange, []*CompileUnit, error) {
dir, kernel := filepath.Split(module.Path)
dSYMPath := filepath.Join(dir, fmt.Sprintf(
"%[1]s.dSYM/Contents/Resources/DWARF/%[1]s", kernel))
@@ -102,7 +102,7 @@ func machoReadTextRanges(module *Module) ([]pcRange, []*CompileUnit, error) {
return readTextRanges(debugInfo, module, nil)
}
-func machoReadTextData(module *Module) ([]byte, error) {
+func machoReadTextData(module *KernelModule) ([]byte, error) {
file, err := macho.Open(module.Path)
if err != nil {
return nil, err
@@ -114,7 +114,7 @@ func machoReadTextData(module *Module) ([]byte, error) {
return text.Data()
}
-func machoReadModuleCoverPoints(target *targets.Target, module *Module, info *symbolInfo) ([2][]uint64, error) {
+func machoReadModuleCoverPoints(target *targets.Target, module *KernelModule, info *symbolInfo) ([2][]uint64, error) {
// TODO: Linux/ELF supports module symbols. We should probably also do that
// for XNU/Mach-O. To maximize code re-use we already have a lot of the
// plumbing for module support. I think we mainly miss an equivalent to
diff --git a/pkg/cover/backend/modules.go b/pkg/cover/backend/modules.go
index 2d0e3c330..6fe3c6fcc 100644
--- a/pkg/cover/backend/modules.go
+++ b/pkg/cover/backend/modules.go
@@ -19,12 +19,13 @@ type KernelModule struct {
Name string
Addr uint64
Size uint64
+ Path string
}
func discoverModules(target *targets.Target, objDir string, moduleObj []string,
hostModules []KernelModule) (
- []*Module, error) {
- modules := []*Module{
+ []*KernelModule, error) {
+ modules := []*KernelModule{
// A dummy module representing the kernel itself.
{Path: filepath.Join(objDir, target.KernelObject)},
}
@@ -41,12 +42,12 @@ func discoverModules(target *targets.Target, objDir string, moduleObj []string,
return modules, nil
}
-func discoverModulesLinux(dirs []string, hostModules []KernelModule) ([]*Module, error) {
+func discoverModulesLinux(dirs []string, hostModules []KernelModule) ([]*KernelModule, error) {
paths, err := locateModules(dirs)
if err != nil {
return nil, err
}
- var modules []*Module
+ var modules []*KernelModule
for _, mod := range hostModules {
path := paths[mod.Name]
if path == "" {
@@ -54,7 +55,7 @@ func discoverModulesLinux(dirs []string, hostModules []KernelModule) ([]*Module,
continue
}
log.Logf(0, "module %v -> %v", mod.Name, path)
- modules = append(modules, &Module{
+ modules = append(modules, &KernelModule{
Name: mod.Name,
Addr: mod.Addr,
Path: path,
diff --git a/pkg/cover/report.go b/pkg/cover/report.go
index 06c1e13f5..2e1403cfe 100644
--- a/pkg/cover/report.go
+++ b/pkg/cover/report.go
@@ -202,7 +202,7 @@ func (rg *ReportGenerator) symbolizePCs(PCs []uint64) error {
return nil
}
symbolize := make(map[*backend.Symbol]bool)
- pcs := make(map[*backend.Module][]uint64)
+ pcs := make(map[*backend.KernelModule][]uint64)
for _, pc := range PCs {
sym := rg.findSymbol(pc)
if sym == nil || sym.Symbolized || symbolize[sym] {