From 5e3bc74104143da1d2584bf2bf312ae277caf756 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Fri, 3 Jan 2020 09:58:46 +0100 Subject: pkg/cover: support out-of-tree linux build Looks for source files in object dir. This is required for out-of-tree linux builds. E.g. security/selinux/flask.h contains some sources with coverage callbacks, but it's auto-generated and located in the build dir. --- pkg/cover/report.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'pkg') diff --git a/pkg/cover/report.go b/pkg/cover/report.go index 15c14ad6b..b92c5e982 100644 --- a/pkg/cover/report.go +++ b/pkg/cover/report.go @@ -24,6 +24,7 @@ import ( type ReportGenerator struct { srcDir string buildDir string + objDir string symbols []symbol pcs map[uint64][]symbolizer.Frame } @@ -42,6 +43,7 @@ func MakeReportGenerator(vmlinux, srcDir, buildDir, arch string) (*ReportGenerat rg := &ReportGenerator{ srcDir: srcDir, buildDir: buildDir, + objDir: filepath.Dir(vmlinux), pcs: make(map[uint64][]symbolizer.Frame), } errc := make(chan error) @@ -159,13 +161,19 @@ func (rg *ReportGenerator) generate(w io.Writer, progs []Prog, files map[string] Root: new(templateDir), } for fname, file := range files { - if !strings.HasPrefix(fname, rg.buildDir) { - return fmt.Errorf("path '%s' doesn't match build dir '%s'", fname, rg.buildDir) + remain := "" + switch { + case strings.HasPrefix(fname, rg.objDir): + // Assume the file was built there. + remain = filepath.Clean(strings.TrimPrefix(fname, rg.objDir)) + case strings.HasPrefix(fname, rg.buildDir): + // Assume the file was moved from buildDir to srcDir. + remain = filepath.Clean(strings.TrimPrefix(fname, rg.buildDir)) + fname = filepath.Join(rg.srcDir, remain) + default: + return fmt.Errorf("path %q doesn't match build dir %q nor obj dir %q", + fname, rg.buildDir, rg.objDir) } - // Trim the existing build dir - remain := filepath.Clean(strings.TrimPrefix(fname, rg.buildDir)) - // Add the current kernel source dir - fname = filepath.Join(rg.srcDir, remain) pos := d.Root path := "" for { -- cgit mrf-deployment