diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2020-01-03 09:58:46 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2020-01-03 16:11:49 +0100 |
| commit | 5e3bc74104143da1d2584bf2bf312ae277caf756 (patch) | |
| tree | 59375e7812bc39a25800461c0d7513e97d339863 /pkg | |
| parent | 4e3e3c8d4bebc221a7a3dfb10ed427660e2e3e32 (diff) | |
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.
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/cover/report.go | 20 |
1 files changed, 14 insertions, 6 deletions
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 { |
