aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/asm
diff options
context:
space:
mode:
authorTal Shprecher <tshprecher@gmail.com>2016-02-19 16:02:54 -0800
committerRob Pike <r@golang.org>2016-02-25 00:21:14 +0000
commit45c4ebec5bdd387842868d38dbe495e2992302e1 (patch)
tree90a15ab02f0f9ff64d2346ae5baef49b22237712 /src/cmd/asm
parentd17727bdb4b925427dd03d6b235b586418e47f89 (diff)
downloadgo-45c4ebec5bdd387842868d38dbe495e2992302e1.tar.xz
cmd/asm: fix EOF message on operand parsing errors.
If the parsing of an operand completes but the parser thinks there is more to read, return an "expected end of operand" error message instead of "expected EOF." This also removes extra "asm: " prefixes in error strings since "asm: " is already set as the global log prefix. Fixes #14071 Change-Id: I7d621c1aea529a0eca3bcba032359bd25b3e1080 Reviewed-on: https://go-review.googlesource.com/19731 Reviewed-by: Rob Pike <r@golang.org>
Diffstat (limited to 'src/cmd/asm')
-rw-r--r--src/cmd/asm/internal/asm/parse.go25
-rw-r--r--src/cmd/asm/internal/asm/pseudo_test.go4
-rw-r--r--src/cmd/asm/internal/lex/input.go2
-rw-r--r--src/cmd/asm/internal/lex/lex.go2
-rw-r--r--src/cmd/asm/main.go4
5 files changed, 21 insertions, 16 deletions
diff --git a/src/cmd/asm/internal/asm/parse.go b/src/cmd/asm/internal/asm/parse.go
index 4258c5ce26..6c324ce3af 100644
--- a/src/cmd/asm/internal/asm/parse.go
+++ b/src/cmd/asm/internal/asm/parse.go
@@ -297,7 +297,7 @@ func (p *Parser) operand(a *obj.Addr) bool {
p.errorf("illegal use of register list")
}
p.registerList(a)
- p.expect(scanner.EOF)
+ p.expectOperandEnd()
return true
}
@@ -331,7 +331,7 @@ func (p *Parser) operand(a *obj.Addr) bool {
}
}
// fmt.Printf("REG %s\n", obj.Dconv(&emptyProg, 0, a))
- p.expect(scanner.EOF)
+ p.expectOperandEnd()
return true
}
@@ -363,7 +363,7 @@ func (p *Parser) operand(a *obj.Addr) bool {
a.Type = obj.TYPE_FCONST
a.Val = p.floatExpr()
// fmt.Printf("FCONST %s\n", obj.Dconv(&emptyProg, 0, a))
- p.expect(scanner.EOF)
+ p.expectOperandEnd()
return true
}
if p.have(scanner.String) {
@@ -378,7 +378,7 @@ func (p *Parser) operand(a *obj.Addr) bool {
a.Type = obj.TYPE_SCONST
a.Val = str
// fmt.Printf("SCONST %s\n", obj.Dconv(&emptyProg, 0, a))
- p.expect(scanner.EOF)
+ p.expectOperandEnd()
return true
}
a.Offset = int64(p.expr())
@@ -392,7 +392,7 @@ func (p *Parser) operand(a *obj.Addr) bool {
a.Type = obj.TYPE_MEM
}
// fmt.Printf("CONST %d %s\n", a.Offset, obj.Dconv(&emptyProg, 0, a))
- p.expect(scanner.EOF)
+ p.expectOperandEnd()
return true
}
// fmt.Printf("offset %d \n", a.Offset)
@@ -402,7 +402,7 @@ func (p *Parser) operand(a *obj.Addr) bool {
p.registerIndirect(a, prefix)
// fmt.Printf("DONE %s\n", p.arch.Dconv(&emptyProg, 0, a))
- p.expect(scanner.EOF)
+ p.expectOperandEnd()
return true
}
@@ -983,14 +983,19 @@ func (p *Parser) more() bool {
// get verifies that the next item has the expected type and returns it.
func (p *Parser) get(expected lex.ScanToken) lex.Token {
- p.expect(expected)
+ p.expect(expected, expected.String())
return p.next()
}
+// expectOperandEnd verifies that the parsing state is properly at the end of an operand.
+func (p *Parser) expectOperandEnd() {
+ p.expect(scanner.EOF, "end of operand")
+}
+
// expect verifies that the next item has the expected type. It does not consume it.
-func (p *Parser) expect(expected lex.ScanToken) {
- if p.peek() != expected {
- p.errorf("expected %s, found %s", expected, p.next())
+func (p *Parser) expect(expectedToken lex.ScanToken, expectedMessage string) {
+ if p.peek() != expectedToken {
+ p.errorf("expected %s, found %s", expectedMessage, p.next())
}
}
diff --git a/src/cmd/asm/internal/asm/pseudo_test.go b/src/cmd/asm/internal/asm/pseudo_test.go
index ee13b724eb..2e6d6c8154 100644
--- a/src/cmd/asm/internal/asm/pseudo_test.go
+++ b/src/cmd/asm/internal/asm/pseudo_test.go
@@ -35,8 +35,8 @@ func TestErroneous(t *testing.T) {
{"TEXT", "%", "expect two or three operands for TEXT"},
{"TEXT", "1, 1", "TEXT symbol \"<erroneous symbol>\" must be a symbol(SB)"},
{"TEXT", "$\"foo\", 0, $1", "TEXT symbol \"<erroneous symbol>\" must be a symbol(SB)"},
- {"TEXT", "$0É:0, 0, $1", "expected EOF, found É"}, // Issue #12467.
- {"TEXT", "$:0:(SB, 0, $1", "expected '(', found 0"}, // Issue 12468.
+ {"TEXT", "$0É:0, 0, $1", "expected end of operand, found É"}, // Issue #12467.
+ {"TEXT", "$:0:(SB, 0, $1", "expected '(', found 0"}, // Issue 12468.
{"FUNCDATA", "", "expect two operands for FUNCDATA"},
{"FUNCDATA", "(SB ", "expect two operands for FUNCDATA"},
{"DATA", "", "expect two operands for DATA"},
diff --git a/src/cmd/asm/internal/lex/input.go b/src/cmd/asm/internal/lex/input.go
index 33b9d8adea..4855daa892 100644
--- a/src/cmd/asm/internal/lex/input.go
+++ b/src/cmd/asm/internal/lex/input.go
@@ -30,7 +30,7 @@ type Input struct {
peekText string
}
-// NewInput returns a
+// NewInput returns an Input from the given path.
func NewInput(name string) *Input {
return &Input{
// include directories: look in source dir, then -I directories.
diff --git a/src/cmd/asm/internal/lex/lex.go b/src/cmd/asm/internal/lex/lex.go
index 6fce55f7f4..81339059b1 100644
--- a/src/cmd/asm/internal/lex/lex.go
+++ b/src/cmd/asm/internal/lex/lex.go
@@ -77,7 +77,7 @@ func NewLexer(name string, ctxt *obj.Link) TokenReader {
input := NewInput(name)
fd, err := os.Open(name)
if err != nil {
- log.Fatalf("asm: %s\n", err)
+ log.Fatalf("%s\n", err)
}
input.Push(NewTokenizer(name, fd, fd))
return input
diff --git a/src/cmd/asm/main.go b/src/cmd/asm/main.go
index f48050c137..4e450bec98 100644
--- a/src/cmd/asm/main.go
+++ b/src/cmd/asm/main.go
@@ -26,7 +26,7 @@ func main() {
architecture := arch.Set(GOARCH)
if architecture == nil {
- log.Fatalf("asm: unrecognized architecture %s", GOARCH)
+ log.Fatalf("unrecognized architecture %s", GOARCH)
}
flags.Parse()
@@ -66,7 +66,7 @@ func main() {
obj.Writeobjdirect(ctxt, output)
}
if !ok || diag {
- log.Printf("asm: assembly of %s failed", flag.Arg(0))
+ log.Printf("assembly of %s failed", flag.Arg(0))
os.Remove(*flags.OutputFile)
os.Exit(1)
}