]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/asm: accept TEXT f+0(SB) in -gensymabis mode
authorRuss Cox <rsc@golang.org>
Tue, 30 Apr 2019 18:00:07 +0000 (14:00 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 9 May 2019 00:02:34 +0000 (00:02 +0000)
f+0(SB) is a non-standard but acceptable alias for f(SB).

Fixes #30968.

Change-Id: I499ccee4d3ff3ab4e47f75d99407aace858e59aa
Reviewed-on: https://go-review.googlesource.com/c/go/+/174537
Reviewed-by: Austin Clements <austin@google.com>
src/cmd/asm/internal/asm/operand_test.go
src/cmd/asm/internal/asm/parse.go

index 2ba3fd73df83c9db0e57b94750c9f7a06d56d51b..f187d0b16603c0d9ce861ef0586f127923f83f70 100644 (file)
@@ -145,17 +145,18 @@ func TestFuncAddress(t *testing.T) {
 
                                isFuncSym := strings.HasSuffix(test.input, "(SB)") &&
                                        // Ignore static symbols.
-                                       !strings.Contains(test.input, "<>") &&
-                                       // Ignore symbols with offsets.
-                                       !strings.Contains(test.input, "+")
+                                       !strings.Contains(test.input, "<>")
 
                                wantName := ""
                                if isFuncSym {
-                                       // Strip $|* and (SB).
+                                       // Strip $|* and (SB) and +Int.
                                        wantName = test.output[:len(test.output)-4]
                                        if strings.HasPrefix(wantName, "$") || strings.HasPrefix(wantName, "*") {
                                                wantName = wantName[1:]
                                        }
+                                       if i := strings.Index(wantName, "+"); i >= 0 {
+                                               wantName = wantName[:i]
+                                       }
                                }
                                if ok != isFuncSym || name != wantName {
                                        t.Errorf("fail at %s as function address: got %s, %v; expected %s, %v", test.input, name, ok, wantName, isFuncSym)
index 346976ef48b67b1d55d605e79f774c0b3ddd4fe7..17d40ee4156dee8833b2b41d4ca3cfd232cffeab 100644 (file)
@@ -800,9 +800,9 @@ func (p *Parser) setPseudoRegister(addr *obj.Addr, reg string, isStatic bool, pr
 
 // funcAddress parses an external function address. This is a
 // constrained form of the operand syntax that's always SB-based,
-// non-static, and has no additional offsets:
+// non-static, and has at most a simple integer offset:
 //
-//    [$|*]sym(SB)
+//    [$|*]sym[+Int](SB)
 func (p *Parser) funcAddress() (string, bool) {
        switch p.peek() {
        case '$', '*':
@@ -815,7 +815,14 @@ func (p *Parser) funcAddress() (string, bool) {
        if tok.ScanToken != scanner.Ident || p.atStartOfRegister(name) {
                return "", false
        }
-       if p.next().ScanToken != '(' {
+       tok = p.next()
+       if tok.ScanToken == '+' {
+               if p.next().ScanToken != scanner.Int {
+                       return "", false
+               }
+               tok = p.next()
+       }
+       if tok.ScanToken != '(' {
                return "", false
        }
        if reg := p.next(); reg.ScanToken != scanner.Ident || reg.String() != "SB" {