Commit 09ce5d38 authored by Rob Pike's avatar Rob Pike

[dev.cc] cmd/asm: fix build: handle g in register lists on ARM

Handle the special name of R10 on the ARM - it's g - when it appears
in a register list [R0, g, R3]. Also simplify the pseudo-register parsing
a little.

Should fix the ARM build.

Change-Id: Ifcafc8195dcd3622653b43663ced6e4a144a3e51
Reviewed-on: https://go-review.googlesource.com/4965Reviewed-by: default avatarRuss Cox <rsc@golang.org>
parent 201b1249
...@@ -494,39 +494,32 @@ func (p *Parser) symbolReference(a *obj.Addr, name string, prefix rune) { ...@@ -494,39 +494,32 @@ func (p *Parser) symbolReference(a *obj.Addr, name string, prefix rune) {
p.get('(') p.get('(')
reg := p.get(scanner.Ident).String() reg := p.get(scanner.Ident).String()
p.get(')') p.get(')')
// On some machines, SP is a real register, on some it's pseudo. Make sure p.setPseudoRegister(a, reg, isStatic != 0, prefix)
// setPseudoRegister sees the pseudo always.
// TODO: Set up a pseudo-register map analogous to the register map in arch?
r := p.arch.Registers[reg]
if reg == "SP" {
r = arch.RSP
}
p.setPseudoRegister(a, reg, r, isStatic != 0, prefix)
} }
// setPseudoRegister sets the NAME field of addr for a pseudo-register reference such as (SB). // setPseudoRegister sets the NAME field of addr for a pseudo-register reference such as (SB).
func (p *Parser) setPseudoRegister(addr *obj.Addr, name string, reg int16, isStatic bool, prefix rune) { func (p *Parser) setPseudoRegister(addr *obj.Addr, reg string, isStatic bool, prefix rune) {
if addr.Reg != 0 { if addr.Reg != 0 {
p.errorf("internal error: reg %s already set in pseudo", name) p.errorf("internal error: reg %s already set in pseudo", reg)
} }
switch reg { switch reg {
case arch.RFP: case "FP":
addr.Name = obj.NAME_PARAM addr.Name = obj.NAME_PARAM
case arch.RPC: case "PC":
// Fine as is. // Fine as is.
if prefix != 0 { if prefix != 0 {
p.errorf("illegal addressing mode for PC") p.errorf("illegal addressing mode for PC")
} }
addr.Reg = arch.RPC // Tells asmJump how to interpret this address. addr.Reg = arch.RPC // Tells asmJump how to interpret this address.
case arch.RSB: case "SB":
addr.Name = obj.NAME_EXTERN addr.Name = obj.NAME_EXTERN
if isStatic { if isStatic {
addr.Name = obj.NAME_STATIC addr.Name = obj.NAME_STATIC
} }
case arch.RSP: case "SP":
addr.Name = obj.NAME_AUTO // The pseudo-stack. addr.Name = obj.NAME_AUTO // The pseudo-stack.
default: default:
p.errorf("expected pseudo-register; found %s", name) p.errorf("expected pseudo-register; found %s", reg)
} }
if prefix == '$' { if prefix == '$' {
addr.Type = obj.TYPE_ADDR addr.Type = obj.TYPE_ADDR
...@@ -554,7 +547,7 @@ func (p *Parser) registerIndirect(a *obj.Addr, prefix rune) { ...@@ -554,7 +547,7 @@ func (p *Parser) registerIndirect(a *obj.Addr, prefix rune) {
p.errorf("cannot use pseudo-register in pair") p.errorf("cannot use pseudo-register in pair")
return return
} }
p.setPseudoRegister(a, name, r1, false, prefix) p.setPseudoRegister(a, name, false, prefix)
return return
} }
a.Reg = r1 a.Reg = r1
...@@ -641,7 +634,11 @@ func (p *Parser) registerNumber(name string) uint16 { ...@@ -641,7 +634,11 @@ func (p *Parser) registerNumber(name string) uint16 {
p.errorf("expected register; found %s", name) p.errorf("expected register; found %s", name)
} }
// Register must be of the form R0 through R15. // Register must be of the form R0 through R15.
if name[0] != 'R' && name != "g" { // On ARM, g is register 10.
if p.arch.Thechar == '5' && name == "g" {
return 10
}
if name[0] != 'R' {
p.errorf("expected g or R0 through R15; found %s", name) p.errorf("expected g or R0 through R15; found %s", name)
} }
num, err := strconv.ParseUint(name[1:], 10, 8) num, err := strconv.ParseUint(name[1:], 10, 8)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment