diff options
Diffstat (limited to 'pkg/cover/backend')
| -rw-r--r-- | pkg/cover/backend/dwarf.go | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/pkg/cover/backend/dwarf.go b/pkg/cover/backend/dwarf.go index 35ddd27a6..b90bf0cc4 100644 --- a/pkg/cover/backend/dwarf.go +++ b/pkg/cover/backend/dwarf.go @@ -136,28 +136,6 @@ func processModule(params *dwarfParams, module *Module, info *symbolInfo, return result, nil } -// Regexps to parse compiler version string in IsKcovBrokenInCompiler. -// Some targets (e.g. NetBSD) use g++ instead of gcc. -var gccRE = regexp.MustCompile(`gcc|GCC|g\+\+`) -var gccVersionRE = regexp.MustCompile(`(gcc|GCC|g\+\+).* ([0-9]{1,2})\.[0-9]+\.[0-9]+`) - -// GCC < 14 incorrectly tail-calls kcov callbacks, which does not let syzkaller -// verify that collected coverage points have matching callbacks. -// See https://github.com/google/syzkaller/issues/4447 for more information. -func IsKcovBrokenInCompiler(versionStr string) bool { - if !gccRE.MatchString(versionStr) { - return false - } - groups := gccVersionRE.FindStringSubmatch(versionStr) - if len(groups) > 0 { - version, err := strconv.Atoi(groups[2]) - if err == nil { - return version < 14 - } - } - return true -} - func makeDWARFUnsafe(params *dwarfParams) (*Impl, error) { target := params.target objDir := params.objDir @@ -334,6 +312,28 @@ func buildSymbols(symbols []*Symbol, ranges []pcRange, coverPoints [2][]uint64) return symbols } +// Regexps to parse compiler version string in IsKcovBrokenInCompiler. +// Some targets (e.g. NetBSD) use g++ instead of gcc. +var gccRE = regexp.MustCompile(`gcc|GCC|g\+\+`) +var gccVersionRE = regexp.MustCompile(`(gcc|GCC|g\+\+).* ([0-9]{1,2})\.[0-9]+\.[0-9]+`) + +// GCC < 14 incorrectly tail-calls kcov callbacks, which does not let syzkaller +// verify that collected coverage points have matching callbacks. +// See https://github.com/google/syzkaller/issues/4447 for more information. +func IsKcovBrokenInCompiler(versionStr string) bool { + if !gccRE.MatchString(versionStr) { + return false + } + groups := gccVersionRE.FindStringSubmatch(versionStr) + if len(groups) > 0 { + version, err := strconv.Atoi(groups[2]) + if err == nil { + return version < 14 + } + } + return true +} + type symbolInfo struct { textAddr uint64 // Set of addresses that correspond to __sanitizer_cov_trace_pc or its trampolines. |
