From: Josh Bleecher Snyder Date: Mon, 11 Jul 2016 22:20:43 +0000 (-0700) Subject: cmd/vet: improve error message for cross-package assembly X-Git-Tag: go1.8beta1~1732 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f410a668ee3f0a5c71e4d9d0bda83b826246ab5d;p=gostls13.git cmd/vet: improve error message for cross-package assembly bytes.Compare has its go prototype in package bytes, but its implementation in package runtime. vet used to complain that the prototype was missing. Now instead: runtime/asm_amd64.s:1483: [amd64] cannot check cross-package assembly function: Compare is in package bytes Updates #11041 Change-Id: Ied44fac10d0916d7a34e552c02d052e16fca0c8c Reviewed-on: https://go-review.googlesource.com/27153 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- diff --git a/src/cmd/vet/asmdecl.go b/src/cmd/vet/asmdecl.go index 17172ed71d..cbb7686258 100644 --- a/src/cmd/vet/asmdecl.go +++ b/src/cmd/vet/asmdecl.go @@ -98,7 +98,7 @@ func (a *asmArch) maxAlign() int { return int(a.sizes.MaxAlign) } var ( re = regexp.MustCompile asmPlusBuild = re(`//\s+\+build\s+([^\n]+)`) - asmTEXT = re(`\bTEXT\b.*·([^\(]+)\(SB\)(?:\s*,\s*([0-9A-Z|+]+))?(?:\s*,\s*\$(-?[0-9]+)(?:-([0-9]+))?)?`) + asmTEXT = re(`\bTEXT\b(.*)·([^\(]+)\(SB\)(?:\s*,\s*([0-9A-Z|+]+))?(?:\s*,\s*\$(-?[0-9]+)(?:-([0-9]+))?)?`) asmDATA = re(`\b(DATA|GLOBL)\b`) asmNamedFP = re(`([a-zA-Z0-9_\xFF-\x{10FFFF}]+)(?:\+([0-9]+))\(FP\)`) asmUnnamedFP = re(`[^+\-0-9](([0-9]+)\(FP\))`) @@ -205,21 +205,32 @@ Files: continue Files } } - fnName = m[1] - fn = knownFunc[m[1]][arch] + fnName = m[2] + if pkgName := strings.TrimSpace(m[1]); pkgName != "" { + pathParts := strings.Split(pkgName, "∕") + pkgName = pathParts[len(pathParts)-1] + if pkgName != f.pkg.path { + f.Warnf(token.NoPos, "%s:%d: [%s] cannot check cross-package assembly function: %s is in package %s", f.name, lineno, arch, fnName, pkgName) + fn = nil + fnName = "" + continue + } + } + fn = knownFunc[fnName][arch] if fn != nil { - size, _ := strconv.Atoi(m[4]) - if size != fn.size && (m[2] != "7" && !strings.Contains(m[2], "NOSPLIT") || size != 0) { + size, _ := strconv.Atoi(m[5]) + flag := m[3] + if size != fn.size && (flag != "7" && !strings.Contains(flag, "NOSPLIT") || size != 0) { badf("wrong argument size %d; expected $...-%d", size, fn.size) } } - localSize, _ = strconv.Atoi(m[3]) + localSize, _ = strconv.Atoi(m[4]) localSize += archDef.intSize() if archDef.lr { // Account for caller's saved LR localSize += archDef.intSize() } - argSize, _ = strconv.Atoi(m[4]) + argSize, _ = strconv.Atoi(m[5]) if fn == nil && !strings.Contains(fnName, "<>") { badf("function %s missing Go declaration", fnName) }