diff --git a/pkg/cover/backend/backend.go b/pkg/cover/backend/backend.go index 5833a13fb20a..78b3682bcbff 100644 --- a/pkg/cover/backend/backend.go +++ b/pkg/cover/backend/backend.go @@ -75,7 +75,7 @@ func Make(cfg *mgrconfig.Config, modules []*vminfo.KernelModule) (*Impl, error) return nil, fmt.Errorf("kernel obj directory is not specified") } if target.OS == targets.Darwin { - return makeMachO(target, kernelDirs, moduleObj, modules) + return makeMachO(target, kernelDirs, moduleObj, modules, cfg.PreciseCoverage) } if vm == targets.GVisor { return makeGvisor(target, kernelDirs, modules) @@ -87,7 +87,7 @@ func Make(cfg *mgrconfig.Config, modules []*vminfo.KernelModule) (*Impl, error) // details. delimiters = []string{"/aosp/", "/private/"} } - return makeELF(target, kernelDirs, delimiters, moduleObj, modules) + return makeELF(target, kernelDirs, delimiters, moduleObj, modules, cfg.PreciseCoverage) } func GetPCBase(cfg *mgrconfig.Config) (uint64, error) { diff --git a/pkg/cover/backend/dwarf.go b/pkg/cover/backend/dwarf.go index 2ace50ce6135..c174dc982c63 100644 --- a/pkg/cover/backend/dwarf.go +++ b/pkg/cover/backend/dwarf.go @@ -37,6 +37,7 @@ type dwarfParams struct { readModuleCoverPoints func(*targets.Target, *vminfo.KernelModule, *symbolInfo) ([2][]uint64, error) readTextRanges func(*vminfo.KernelModule) ([]pcRange, []*CompileUnit, error) getCompilerVersion func(string) string + preciseCoverage bool } type Arch struct { @@ -141,6 +142,7 @@ func makeDWARFUnsafe(params *dwarfParams) (*Impl, error) { kernelDirs := params.kernelDirs splitBuildDelimiters := params.splitBuildDelimiters modules := params.hostModules + preciseCoverage := params.preciseCoverage // Here and below index 0 refers to coverage callbacks (__sanitizer_cov_trace_pc(_guard)) // and index 1 refers to comparison callbacks (__sanitizer_cov_trace_cmp*). @@ -148,7 +150,6 @@ func makeDWARFUnsafe(params *dwarfParams) (*Impl, error) { var allSymbols []*Symbol var allRanges []pcRange var allUnits []*CompileUnit - preciseCoverage := true type binResult struct { symbols []*Symbol coverPoints [2][]uint64 diff --git a/pkg/cover/backend/elf.go b/pkg/cover/backend/elf.go index 88b8302c4f2b..6f339f22f198 100644 --- a/pkg/cover/backend/elf.go +++ b/pkg/cover/backend/elf.go @@ -18,7 +18,7 @@ import ( ) func makeELF(target *targets.Target, kernelDirs *mgrconfig.KernelDirs, splitBuildDelimiters, moduleObj []string, - hostModules []*vminfo.KernelModule) (*Impl, error) { + hostModules []*vminfo.KernelModule, preciseCoverage bool) (*Impl, error) { return makeDWARF(&dwarfParams{ target: target, kernelDirs: kernelDirs, @@ -30,6 +30,7 @@ func makeELF(target *targets.Target, kernelDirs *mgrconfig.KernelDirs, splitBuil readModuleCoverPoints: elfReadModuleCoverPoints, readTextRanges: elfReadTextRanges, getCompilerVersion: elfGetCompilerVersion, + preciseCoverage: preciseCoverage, }) } diff --git a/pkg/cover/backend/mach-o.go b/pkg/cover/backend/mach-o.go index 37031cfded97..35834d09d066 100644 --- a/pkg/cover/backend/mach-o.go +++ b/pkg/cover/backend/mach-o.go @@ -16,7 +16,7 @@ import ( ) func makeMachO(target *targets.Target, kernelDirs *mgrconfig.KernelDirs, - moduleObj []string, hostModules []*vminfo.KernelModule) (*Impl, error) { + moduleObj []string, hostModules []*vminfo.KernelModule, preciseCoverage bool) (*Impl, error) { return makeDWARF(&dwarfParams{ target: target, kernelDirs: kernelDirs, @@ -26,6 +26,7 @@ func makeMachO(target *targets.Target, kernelDirs *mgrconfig.KernelDirs, readTextData: machoReadTextData, readModuleCoverPoints: machoReadModuleCoverPoints, readTextRanges: machoReadTextRanges, + preciseCoverage: preciseCoverage, }) } diff --git a/pkg/mgrconfig/config.go b/pkg/mgrconfig/config.go index 6bf88c5742b9..7f70241841f4 100644 --- a/pkg/mgrconfig/config.go +++ b/pkg/mgrconfig/config.go @@ -225,6 +225,9 @@ type Config struct { // More details can be found in pkg/asset/config.go. AssetStorage *asset.Config `json:"asset_storage"` + // Enable preciseCoverage or not, default to true. + PreciseCoverage bool `json:"preciseCoverage"` + // Experimental options. Experimental Experimental diff --git a/pkg/mgrconfig/load.go b/pkg/mgrconfig/load.go index 51aaa0657321..68c9355ca337 100644 --- a/pkg/mgrconfig/load.go +++ b/pkg/mgrconfig/load.go @@ -86,15 +86,16 @@ func LoadPartialFile(filename string) (*Config, error) { func defaultValues() *Config { return &Config{ - SSHUser: "root", - Cover: true, - Reproduce: true, - Sandbox: "none", - RPC: ":0", - MaxCrashLogs: 100, - Procs: 6, - PreserveCorpus: true, - RunFsck: true, + SSHUser: "root", + Cover: true, + Reproduce: true, + Sandbox: "none", + RPC: ":0", + MaxCrashLogs: 100, + Procs: 6, + PreserveCorpus: true, + RunFsck: true, + PreciseCoverage: true, Experimental: Experimental{ RemoteCover: true, CoverEdges: true,