From: Rob Pike Date: Thu, 17 Sep 2015 17:37:07 +0000 (-0700) Subject: asm: give error message for unadorned symbol reference X-Git-Tag: go1.6beta1~1035 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=49580db149b177b0bbebb9fc61094b1e6c5a38d2;p=gostls13.git asm: give error message for unadorned symbol reference On amd64, the program TEXT foo0(SB),7,$-8 ADDQ R520, R1 RET used to trigger this error because R520 was being passed through to obj: asm: doasm: notfound ft=23 tt=23 00000 (x.s:2) ADDQ 0, 0 23 23 Now it gets this one, as it is indeed a parse error: x.s:2: illegal addressing mode for symbol R520 This couldn't be fixed until #12632 had been fixed for arm64. Fixes #12470. Change-Id: I19830c4ae9337887b93f85d9a239e2b89dbb2219 Reviewed-on: https://go-review.googlesource.com/14691 Reviewed-by: Aram Hăvărneanu --- diff --git a/src/cmd/asm/internal/asm/parse.go b/src/cmd/asm/internal/asm/parse.go index b38b53db70..9a42838be9 100644 --- a/src/cmd/asm/internal/asm/parse.go +++ b/src/cmd/asm/internal/asm/parse.go @@ -38,6 +38,7 @@ type Parser struct { firstProg *obj.Prog lastProg *obj.Prog dataAddr map[string]int64 // Most recent address for DATA for this symbol. + isJump bool // Instruction being assembled is a jump. errorWriter io.Writer } @@ -197,15 +198,15 @@ func (p *Parser) line() bool { func (p *Parser) instruction(op int, word, cond string, operands [][]lex.Token) { p.addr = p.addr[0:0] - isJump := p.arch.IsJump(word) + p.isJump = p.arch.IsJump(word) for _, op := range operands { addr := p.address(op) - if !isJump && addr.Reg < 0 { // Jumps refer to PC, a pseudo. + if !p.isJump && addr.Reg < 0 { // Jumps refer to PC, a pseudo. p.errorf("illegal use of pseudo-register in %s", word) } p.addr = append(p.addr, addr) } - if isJump { + if p.isJump { p.asmJump(op, cond, p.addr) return } @@ -575,12 +576,14 @@ func (p *Parser) symbolReference(a *obj.Addr, name string, prefix rune) { } a.Sym = obj.Linklookup(p.ctxt, name, isStatic) if p.peek() == scanner.EOF { - if prefix != 0 { - p.errorf("illegal addressing mode for symbol %s", name) + if prefix == 0 && p.isJump { + // Symbols without prefix or suffix are jump labels. + return } + p.errorf("illegal or missing addressing mode for symbol %s", name) return } - // Expect (SB) or (FP), (PC), (SB), or (SP) + // Expect (SB), (FP), (PC), or (SP) p.get('(') reg := p.get(scanner.Ident).String() p.get(')')