aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/asm
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2015-09-17 10:37:07 -0700
committerRob Pike <r@golang.org>2015-09-18 18:08:52 +0000
commit49580db149b177b0bbebb9fc61094b1e6c5a38d2 (patch)
tree850ac8856ee314e95da3e5ab36de74026cddfd7b /src/cmd/asm
parent8bd222f046e15353ea389ffe2f5f503fa14b188c (diff)
downloadgo-49580db149b177b0bbebb9fc61094b1e6c5a38d2.tar.xz
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 <aram@mgk.ro>
Diffstat (limited to 'src/cmd/asm')
-rw-r--r--src/cmd/asm/internal/asm/parse.go15
1 files changed, 9 insertions, 6 deletions
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(')')