]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/vet: improve error message for cross-package assembly
authorJosh Bleecher Snyder <josharian@gmail.com>
Mon, 11 Jul 2016 22:20:43 +0000 (15:20 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Mon, 22 Aug 2016 15:42:45 +0000 (15:42 +0000)
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 <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
src/cmd/vet/asmdecl.go

index 17172ed71daffe409bce1a40cda8c25b361e87a5..cbb7686258e0785efd895f5b77289673927f636a 100644 (file)
@@ -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)
                                }