From f766b68023c7fa4076d61824d631b3fe2cc697d2 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 30 Apr 2019 14:00:07 -0400 Subject: [PATCH] cmd/asm: accept TEXT f+0(SB) in -gensymabis mode 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 --- src/cmd/asm/internal/asm/operand_test.go | 9 +++++---- src/cmd/asm/internal/asm/parse.go | 13 ++++++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/cmd/asm/internal/asm/operand_test.go b/src/cmd/asm/internal/asm/operand_test.go index 2ba3fd73df..f187d0b166 100644 --- a/src/cmd/asm/internal/asm/operand_test.go +++ b/src/cmd/asm/internal/asm/operand_test.go @@ -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) diff --git a/src/cmd/asm/internal/asm/parse.go b/src/cmd/asm/internal/asm/parse.go index 346976ef48..17d40ee415 100644 --- a/src/cmd/asm/internal/asm/parse.go +++ b/src/cmd/asm/internal/asm/parse.go @@ -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" { -- 2.50.0