aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-01-03 09:58:46 +0100
committerDmitry Vyukov <dvyukov@google.com>2020-01-03 16:11:49 +0100
commit5e3bc74104143da1d2584bf2bf312ae277caf756 (patch)
tree59375e7812bc39a25800461c0d7513e97d339863 /pkg
parent4e3e3c8d4bebc221a7a3dfb10ed427660e2e3e32 (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.go20
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 {