go/analysis/passes/asmdecl: add support for ABI selector clauses

Accept ABI selector clauses for function definitions. The assembler
allows these clauses when compiling the runtime, so the checker needs
to be able to digest them as well.

Updates golang/go#40724

Change-Id: I49ea4d87450c498bdfe10a8c441b48fcf70bea7c
Reviewed-on: https://go-review.googlesource.com/c/tools/+/262197
Trust: Than McIntosh <thanm@google.com>
Run-TryBot: Than McIntosh <thanm@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
diff --git a/go/analysis/passes/asmdecl/asmdecl.go b/go/analysis/passes/asmdecl/asmdecl.go
index e6bfe71..d63855b 100644
--- a/go/analysis/passes/asmdecl/asmdecl.go
+++ b/go/analysis/passes/asmdecl/asmdecl.go
@@ -137,6 +137,7 @@
 	asmSP        = re(`[^+\-0-9](([0-9]+)\(([A-Z0-9]+)\))`)
 	asmOpcode    = re(`^\s*(?:[A-Z0-9a-z_]+:)?\s*([A-Z]+)\s*([^,]*)(?:,\s*(.*))?`)
 	ppc64Suff    = re(`([BHWD])(ZU|Z|U|BR)?$`)
+	abiSuff      = re(`^(.+)<ABI.+>$`)
 )
 
 func run(pass *analysis.Pass) (interface{}, error) {
@@ -200,6 +201,13 @@
 			}
 			retLine = nil
 		}
+		trimABI := func(fnName string) string {
+			m := abiSuff.FindStringSubmatch(fnName)
+			if m != nil {
+				return m[1]
+			}
+			return fnName
+		}
 		for lineno, line := range lines {
 			lineno++
 
@@ -268,6 +276,8 @@
 						continue
 					}
 				}
+				// Trim off optional ABI selector.
+				fnName := trimABI(fnName)
 				flag := m[3]
 				fn = knownFunc[fnName][arch]
 				if fn != nil {
diff --git a/go/analysis/passes/asmdecl/testdata/src/a/asm.go b/go/analysis/passes/asmdecl/testdata/src/a/asm.go
index ebe5d33..27470c5 100644
--- a/go/analysis/passes/asmdecl/testdata/src/a/asm.go
+++ b/go/analysis/passes/asmdecl/testdata/src/a/asm.go
@@ -47,3 +47,7 @@
 func noframe2(x int32)
 
 func fvariadic(int, ...int)
+
+func pickStableABI(x int)
+func pickInternalABI(x int)
+func pickFutureABI(x int)
diff --git a/go/analysis/passes/asmdecl/testdata/src/a/asm1.s b/go/analysis/passes/asmdecl/testdata/src/a/asm1.s
index b39130f..8fa0401 100644
--- a/go/analysis/passes/asmdecl/testdata/src/a/asm1.s
+++ b/go/analysis/passes/asmdecl/testdata/src/a/asm1.s
@@ -330,3 +330,18 @@
 	MOVQ	x_0_1+8(FP), AX
 	MOVQ	x_1_1+24(FP), CX
 	RET
+
+// ABI selector
+TEXT ·pickStableABI<ABI0>(SB), NOSPLIT, $32
+	MOVQ	x+0(FP), AX
+	RET
+
+// ABI selector
+TEXT ·pickInternalABI<ABIInternal>(SB), NOSPLIT, $32
+	MOVQ	x+0(FP), AX
+	RET
+
+// ABI selector
+TEXT ·pickFutureABI<ABISomethingNotyetInvented>(SB), NOSPLIT, $32
+	MOVQ	x+0(FP), AX
+	RET