diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2021-03-16 13:36:59 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2021-03-18 09:17:51 +0100 |
| commit | 8833b464504c55a0726372a352528f0a6b3d8d24 (patch) | |
| tree | 4ba44d96b9bac34f2b4645b4cfdaa1bd2ee0ed3b /pkg/cover/report.go | |
| parent | 2649114619f2c83ca9beb0e122445b1820cc1646 (diff) | |
pkg/cover: pass modules as []host.KernelModule
Pass modules as []host.KernelModule to cover.MakeReportGenerator.
This avoids make(map) in callers that don't pass modules.
Store modules as []*KernelModule.
This avoids clumsy assignments to the map to update Path
and allows to store modules as *KernelModule rather than by name
(we are not scripting, pointer is more flexible and handy representation).
Diffstat (limited to 'pkg/cover/report.go')
| -rw-r--r-- | pkg/cover/report.go | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/pkg/cover/report.go b/pkg/cover/report.go index b838d5f5f..222bcdfa6 100644 --- a/pkg/cover/report.go +++ b/pkg/cover/report.go @@ -5,9 +5,11 @@ package cover import ( "fmt" + "path/filepath" "sort" "github.com/google/syzkaller/pkg/cover/backend" + "github.com/google/syzkaller/pkg/host" "github.com/google/syzkaller/pkg/mgrconfig" "github.com/google/syzkaller/sys/targets" ) @@ -15,7 +17,6 @@ import ( type ReportGenerator struct { target *targets.Target srcDir string - objDir string buildDir string subsystem []mgrconfig.Subsystem *backend.Impl @@ -29,8 +30,23 @@ type Prog struct { var RestorePC = backend.RestorePC func MakeReportGenerator(target *targets.Target, vm, objDir, srcDir, buildDir string, subsystem []mgrconfig.Subsystem, - moduleObj []string, modules map[string]backend.KernelModule) (*ReportGenerator, error) { - impl, err := backend.Make(target, vm, objDir, srcDir, buildDir, moduleObj, modules) + moduleObj []string, hostModules []host.KernelModule) (*ReportGenerator, error) { + if objDir == "" { + return nil, fmt.Errorf("kernel obj directory is not specified") + } + moduleObj = append([]string{objDir}, moduleObj...) + modules := []*backend.KernelModule{ + { + Path: filepath.Join(objDir, target.KernelObject), + }, + } + for _, mod := range hostModules { + modules = append(modules, &backend.KernelModule{ + Name: mod.Name, + Addr: mod.Addr, + }) + } + impl, err := backend.Make(target, vm, srcDir, buildDir, moduleObj, modules) if err != nil { return nil, err } @@ -41,7 +57,6 @@ func MakeReportGenerator(target *targets.Target, vm, objDir, srcDir, buildDir st rg := &ReportGenerator{ target: target, srcDir: srcDir, - objDir: objDir, buildDir: buildDir, subsystem: subsystem, Impl: impl, @@ -95,11 +110,9 @@ 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] - var pc uint64 - if frame.Module == "" { - pc = frame.PC - } else { - pc = frame.PC + rg.Modules[frame.Module].Addr + pc := frame.PC + if frame.Module.Name != "" { + pc += frame.Module.Addr } coveredBy := progPCs[pc] if len(coveredBy) == 0 { @@ -182,17 +195,16 @@ func (rg *ReportGenerator) lazySymbolize(progs []Prog) error { if len(pcs) == 0 { return nil } - groupPCs := backend.GroupPCsByModule(pcs, rg.Modules) - for name, pcs := range groupPCs { + for mod, pcs := range backend.GroupPCsByModule(pcs, rg.Modules) { if len(pcs) == 0 { continue } - frames, err := rg.Symbolize(pcs, rg.Modules[name].Path) + frames, err := rg.Symbolize(pcs, mod.Path) if err != nil { return err } for i := range frames { - frames[i].Module = name + frames[i].Module = mod } rg.Frames = append(rg.Frames, frames...) } |
