mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: set/unset base register for better assembly print
For address of an auto or arg, on all non-x86 architectures the assembler backend encodes the actual SP offset in the instruction but leaves the offset in Prog unchanged. When the assembly is printed in compile -S, it shows an offset relative to pseudo FP/SP with an actual hardware SP base register (e.g. R13 on ARM). This is confusing. Unset the base register if it is indeed SP, so the assembly output is consistent. If the base register isn't SP, it should be an error and the error output contains the actual base register. For address loading instructions, the base register isn't set in the compiler on non-x86 architectures. Set it. Normally it is SP and will be unset in the change mentioned above for printing. If it is not, it will be an error and the error output contains the actual base register. No change in generated binary, only printed assembly. Passes "go build -a -toolexec 'toolstash -cmp' std cmd" on all architectures. Fixes #21064. Change-Id: Ifafe8d5f9b437efbe824b63b3cbc2f5f6cdc1fd5 Reviewed-on: https://go-review.googlesource.com/49432 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
623e2c4603
commit
f20944de78
11 changed files with 128 additions and 6 deletions
|
|
@ -464,6 +464,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
case ssa.OpARMMOVWaddr:
|
case ssa.OpARMMOVWaddr:
|
||||||
p := s.Prog(arm.AMOVW)
|
p := s.Prog(arm.AMOVW)
|
||||||
p.From.Type = obj.TYPE_ADDR
|
p.From.Type = obj.TYPE_ADDR
|
||||||
|
p.From.Reg = v.Args[0].Reg()
|
||||||
p.To.Type = obj.TYPE_REG
|
p.To.Type = obj.TYPE_REG
|
||||||
p.To.Reg = v.Reg()
|
p.To.Reg = v.Reg()
|
||||||
|
|
||||||
|
|
@ -485,7 +486,6 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
case nil:
|
case nil:
|
||||||
// No sym, just MOVW $off(SP), R
|
// No sym, just MOVW $off(SP), R
|
||||||
wantreg = "SP"
|
wantreg = "SP"
|
||||||
p.From.Reg = arm.REGSP
|
|
||||||
p.From.Offset = v.AuxInt
|
p.From.Offset = v.AuxInt
|
||||||
}
|
}
|
||||||
if reg := v.Args[0].RegName(); reg != wantreg {
|
if reg := v.Args[0].RegName(); reg != wantreg {
|
||||||
|
|
|
||||||
|
|
@ -260,6 +260,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
case ssa.OpARM64MOVDaddr:
|
case ssa.OpARM64MOVDaddr:
|
||||||
p := s.Prog(arm64.AMOVD)
|
p := s.Prog(arm64.AMOVD)
|
||||||
p.From.Type = obj.TYPE_ADDR
|
p.From.Type = obj.TYPE_ADDR
|
||||||
|
p.From.Reg = v.Args[0].Reg()
|
||||||
p.To.Type = obj.TYPE_REG
|
p.To.Type = obj.TYPE_REG
|
||||||
p.To.Reg = v.Reg()
|
p.To.Reg = v.Reg()
|
||||||
|
|
||||||
|
|
@ -281,7 +282,6 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
case nil:
|
case nil:
|
||||||
// No sym, just MOVD $off(SP), R
|
// No sym, just MOVD $off(SP), R
|
||||||
wantreg = "SP"
|
wantreg = "SP"
|
||||||
p.From.Reg = arm64.REGSP
|
|
||||||
p.From.Offset = v.AuxInt
|
p.From.Offset = v.AuxInt
|
||||||
}
|
}
|
||||||
if reg := v.Args[0].RegName(); reg != wantreg {
|
if reg := v.Args[0].RegName(); reg != wantreg {
|
||||||
|
|
|
||||||
|
|
@ -898,6 +898,17 @@ var linuxAMD64Tests = []*asmTest{
|
||||||
}`,
|
}`,
|
||||||
[]string{"\tCMPL\t[A-Z]"},
|
[]string{"\tCMPL\t[A-Z]"},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// make sure assembly output has matching offset and base register.
|
||||||
|
`
|
||||||
|
func f72(a, b int) int {
|
||||||
|
var x [16]byte // use some frame
|
||||||
|
_ = x
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
[]string{"b\\+40\\(SP\\)"},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var linux386Tests = []*asmTest{
|
var linux386Tests = []*asmTest{
|
||||||
|
|
@ -1302,6 +1313,17 @@ var linuxARMTests = []*asmTest{
|
||||||
`,
|
`,
|
||||||
[]string{"\tCLZ\t"},
|
[]string{"\tCLZ\t"},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// make sure assembly output has matching offset and base register.
|
||||||
|
`
|
||||||
|
func f13(a, b int) int {
|
||||||
|
var x [16]byte // use some frame
|
||||||
|
_ = x
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
[]string{"b\\+4\\(FP\\)"},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var linuxARM64Tests = []*asmTest{
|
var linuxARM64Tests = []*asmTest{
|
||||||
|
|
@ -1473,7 +1495,7 @@ var linuxARM64Tests = []*asmTest{
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
[]string{"\tMOVD\t\"\"\\.a\\+[0-9]+\\(RSP\\), R[0-9]+", "\tMOVD\tR[0-9]+, \"\"\\.b\\+[0-9]+\\(RSP\\)"},
|
[]string{"\tMOVD\t\"\"\\.a\\+[0-9]+\\(FP\\), R[0-9]+", "\tMOVD\tR[0-9]+, \"\"\\.b\\+[0-9]+\\(FP\\)"},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -273,6 +273,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
case ssa.OpMIPSMOVWaddr:
|
case ssa.OpMIPSMOVWaddr:
|
||||||
p := s.Prog(mips.AMOVW)
|
p := s.Prog(mips.AMOVW)
|
||||||
p.From.Type = obj.TYPE_ADDR
|
p.From.Type = obj.TYPE_ADDR
|
||||||
|
p.From.Reg = v.Args[0].Reg()
|
||||||
var wantreg string
|
var wantreg string
|
||||||
// MOVW $sym+off(base), R
|
// MOVW $sym+off(base), R
|
||||||
// the assembler expands it as the following:
|
// the assembler expands it as the following:
|
||||||
|
|
@ -291,7 +292,6 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
case nil:
|
case nil:
|
||||||
// No sym, just MOVW $off(SP), R
|
// No sym, just MOVW $off(SP), R
|
||||||
wantreg = "SP"
|
wantreg = "SP"
|
||||||
p.From.Reg = mips.REGSP
|
|
||||||
p.From.Offset = v.AuxInt
|
p.From.Offset = v.AuxInt
|
||||||
}
|
}
|
||||||
if reg := v.Args[0].RegName(); reg != wantreg {
|
if reg := v.Args[0].RegName(); reg != wantreg {
|
||||||
|
|
|
||||||
|
|
@ -247,6 +247,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
case ssa.OpMIPS64MOVVaddr:
|
case ssa.OpMIPS64MOVVaddr:
|
||||||
p := s.Prog(mips.AMOVV)
|
p := s.Prog(mips.AMOVV)
|
||||||
p.From.Type = obj.TYPE_ADDR
|
p.From.Type = obj.TYPE_ADDR
|
||||||
|
p.From.Reg = v.Args[0].Reg()
|
||||||
var wantreg string
|
var wantreg string
|
||||||
// MOVV $sym+off(base), R
|
// MOVV $sym+off(base), R
|
||||||
// the assembler expands it as the following:
|
// the assembler expands it as the following:
|
||||||
|
|
@ -265,7 +266,6 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
case nil:
|
case nil:
|
||||||
// No sym, just MOVV $off(SP), R
|
// No sym, just MOVV $off(SP), R
|
||||||
wantreg = "SP"
|
wantreg = "SP"
|
||||||
p.From.Reg = mips.REGSP
|
|
||||||
p.From.Offset = v.AuxInt
|
p.From.Offset = v.AuxInt
|
||||||
}
|
}
|
||||||
if reg := v.Args[0].RegName(); reg != wantreg {
|
if reg := v.Args[0].RegName(); reg != wantreg {
|
||||||
|
|
|
||||||
|
|
@ -638,6 +638,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
case ssa.OpPPC64MOVDaddr:
|
case ssa.OpPPC64MOVDaddr:
|
||||||
p := s.Prog(ppc64.AMOVD)
|
p := s.Prog(ppc64.AMOVD)
|
||||||
p.From.Type = obj.TYPE_ADDR
|
p.From.Type = obj.TYPE_ADDR
|
||||||
|
p.From.Reg = v.Args[0].Reg()
|
||||||
p.To.Type = obj.TYPE_REG
|
p.To.Type = obj.TYPE_REG
|
||||||
p.To.Reg = v.Reg()
|
p.To.Reg = v.Reg()
|
||||||
|
|
||||||
|
|
@ -660,7 +661,6 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
||||||
case nil:
|
case nil:
|
||||||
// No sym, just MOVD $off(SP), R
|
// No sym, just MOVD $off(SP), R
|
||||||
wantreg = "SP"
|
wantreg = "SP"
|
||||||
p.From.Reg = ppc64.REGSP
|
|
||||||
p.From.Offset = v.AuxInt
|
p.From.Offset = v.AuxInt
|
||||||
}
|
}
|
||||||
if reg := v.Args[0].RegName(); reg != wantreg {
|
if reg := v.Args[0].RegName(); reg != wantreg {
|
||||||
|
|
|
||||||
|
|
@ -1167,6 +1167,11 @@ func (c *ctxt5) aclass(a *obj.Addr) int {
|
||||||
return C_ADDR
|
return C_ADDR
|
||||||
|
|
||||||
case obj.NAME_AUTO:
|
case obj.NAME_AUTO:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-SP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = c.autosize + a.Offset
|
c.instoffset = c.autosize + a.Offset
|
||||||
if t := immaddr(int32(c.instoffset)); t != 0 {
|
if t := immaddr(int32(c.instoffset)); t != 0 {
|
||||||
if immhalf(int32(c.instoffset)) {
|
if immhalf(int32(c.instoffset)) {
|
||||||
|
|
@ -1185,6 +1190,11 @@ func (c *ctxt5) aclass(a *obj.Addr) int {
|
||||||
return C_LAUTO
|
return C_LAUTO
|
||||||
|
|
||||||
case obj.NAME_PARAM:
|
case obj.NAME_PARAM:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-FP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = c.autosize + a.Offset + 4
|
c.instoffset = c.autosize + a.Offset + 4
|
||||||
if t := immaddr(int32(c.instoffset)); t != 0 {
|
if t := immaddr(int32(c.instoffset)); t != 0 {
|
||||||
if immhalf(int32(c.instoffset)) {
|
if immhalf(int32(c.instoffset)) {
|
||||||
|
|
@ -1285,10 +1295,20 @@ func (c *ctxt5) aclass(a *obj.Addr) int {
|
||||||
return C_LCONADDR
|
return C_LCONADDR
|
||||||
|
|
||||||
case obj.NAME_AUTO:
|
case obj.NAME_AUTO:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-SP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = c.autosize + a.Offset
|
c.instoffset = c.autosize + a.Offset
|
||||||
return c.aconsize()
|
return c.aconsize()
|
||||||
|
|
||||||
case obj.NAME_PARAM:
|
case obj.NAME_PARAM:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-FP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = c.autosize + a.Offset + 4
|
c.instoffset = c.autosize + a.Offset + 4
|
||||||
return c.aconsize()
|
return c.aconsize()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1149,10 +1149,20 @@ func (c *ctxt7) aclass(a *obj.Addr) int {
|
||||||
return C_GOTADDR
|
return C_GOTADDR
|
||||||
|
|
||||||
case obj.NAME_AUTO:
|
case obj.NAME_AUTO:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-SP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset
|
c.instoffset = int64(c.autosize) + a.Offset
|
||||||
return autoclass(c.instoffset)
|
return autoclass(c.instoffset)
|
||||||
|
|
||||||
case obj.NAME_PARAM:
|
case obj.NAME_PARAM:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-FP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset + 8
|
c.instoffset = int64(c.autosize) + a.Offset + 8
|
||||||
return autoclass(c.instoffset)
|
return autoclass(c.instoffset)
|
||||||
|
|
||||||
|
|
@ -1228,10 +1238,20 @@ func (c *ctxt7) aclass(a *obj.Addr) int {
|
||||||
return C_VCONADDR
|
return C_VCONADDR
|
||||||
|
|
||||||
case obj.NAME_AUTO:
|
case obj.NAME_AUTO:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-SP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset
|
c.instoffset = int64(c.autosize) + a.Offset
|
||||||
goto aconsize
|
goto aconsize
|
||||||
|
|
||||||
case obj.NAME_PARAM:
|
case obj.NAME_PARAM:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-FP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset + 8
|
c.instoffset = int64(c.autosize) + a.Offset + 8
|
||||||
goto aconsize
|
goto aconsize
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -556,6 +556,11 @@ func (c *ctxt0) aclass(a *obj.Addr) int {
|
||||||
return C_LEXT
|
return C_LEXT
|
||||||
|
|
||||||
case obj.NAME_AUTO:
|
case obj.NAME_AUTO:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-SP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset
|
c.instoffset = int64(c.autosize) + a.Offset
|
||||||
if c.instoffset >= -BIG && c.instoffset < BIG {
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||||||
return C_SAUTO
|
return C_SAUTO
|
||||||
|
|
@ -563,6 +568,11 @@ func (c *ctxt0) aclass(a *obj.Addr) int {
|
||||||
return C_LAUTO
|
return C_LAUTO
|
||||||
|
|
||||||
case obj.NAME_PARAM:
|
case obj.NAME_PARAM:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-FP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
||||||
if c.instoffset >= -BIG && c.instoffset < BIG {
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||||||
return C_SAUTO
|
return C_SAUTO
|
||||||
|
|
@ -616,6 +626,11 @@ func (c *ctxt0) aclass(a *obj.Addr) int {
|
||||||
return C_LECON
|
return C_LECON
|
||||||
|
|
||||||
case obj.NAME_AUTO:
|
case obj.NAME_AUTO:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-SP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset
|
c.instoffset = int64(c.autosize) + a.Offset
|
||||||
if c.instoffset >= -BIG && c.instoffset < BIG {
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||||||
return C_SACON
|
return C_SACON
|
||||||
|
|
@ -623,6 +638,11 @@ func (c *ctxt0) aclass(a *obj.Addr) int {
|
||||||
return C_LACON
|
return C_LACON
|
||||||
|
|
||||||
case obj.NAME_PARAM:
|
case obj.NAME_PARAM:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-FP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
||||||
if c.instoffset >= -BIG && c.instoffset < BIG {
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||||||
return C_SACON
|
return C_SACON
|
||||||
|
|
|
||||||
|
|
@ -758,6 +758,11 @@ func (c *ctxt9) aclass(a *obj.Addr) int {
|
||||||
return C_GOTADDR
|
return C_GOTADDR
|
||||||
|
|
||||||
case obj.NAME_AUTO:
|
case obj.NAME_AUTO:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-SP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset
|
c.instoffset = int64(c.autosize) + a.Offset
|
||||||
if c.instoffset >= -BIG && c.instoffset < BIG {
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||||||
return C_SAUTO
|
return C_SAUTO
|
||||||
|
|
@ -765,6 +770,11 @@ func (c *ctxt9) aclass(a *obj.Addr) int {
|
||||||
return C_LAUTO
|
return C_LAUTO
|
||||||
|
|
||||||
case obj.NAME_PARAM:
|
case obj.NAME_PARAM:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-FP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
||||||
if c.instoffset >= -BIG && c.instoffset < BIG {
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||||||
return C_SAUTO
|
return C_SAUTO
|
||||||
|
|
@ -817,6 +827,11 @@ func (c *ctxt9) aclass(a *obj.Addr) int {
|
||||||
return C_LCON
|
return C_LCON
|
||||||
|
|
||||||
case obj.NAME_AUTO:
|
case obj.NAME_AUTO:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-SP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset
|
c.instoffset = int64(c.autosize) + a.Offset
|
||||||
if c.instoffset >= -BIG && c.instoffset < BIG {
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||||||
return C_SACON
|
return C_SACON
|
||||||
|
|
@ -824,6 +839,11 @@ func (c *ctxt9) aclass(a *obj.Addr) int {
|
||||||
return C_LACON
|
return C_LACON
|
||||||
|
|
||||||
case obj.NAME_PARAM:
|
case obj.NAME_PARAM:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-FP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
||||||
if c.instoffset >= -BIG && c.instoffset < BIG {
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||||||
return C_SACON
|
return C_SACON
|
||||||
|
|
|
||||||
|
|
@ -505,6 +505,11 @@ func (c *ctxtz) aclass(a *obj.Addr) int {
|
||||||
return C_GOTADDR
|
return C_GOTADDR
|
||||||
|
|
||||||
case obj.NAME_AUTO:
|
case obj.NAME_AUTO:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-SP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset
|
c.instoffset = int64(c.autosize) + a.Offset
|
||||||
if c.instoffset >= -BIG && c.instoffset < BIG {
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||||||
return C_SAUTO
|
return C_SAUTO
|
||||||
|
|
@ -512,6 +517,11 @@ func (c *ctxtz) aclass(a *obj.Addr) int {
|
||||||
return C_LAUTO
|
return C_LAUTO
|
||||||
|
|
||||||
case obj.NAME_PARAM:
|
case obj.NAME_PARAM:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-FP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
||||||
if c.instoffset >= -BIG && c.instoffset < BIG {
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||||||
return C_SAUTO
|
return C_SAUTO
|
||||||
|
|
@ -567,6 +577,11 @@ func (c *ctxtz) aclass(a *obj.Addr) int {
|
||||||
return C_SYMADDR
|
return C_SYMADDR
|
||||||
|
|
||||||
case obj.NAME_AUTO:
|
case obj.NAME_AUTO:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-SP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset
|
c.instoffset = int64(c.autosize) + a.Offset
|
||||||
if c.instoffset >= -BIG && c.instoffset < BIG {
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||||||
return C_SACON
|
return C_SACON
|
||||||
|
|
@ -574,6 +589,11 @@ func (c *ctxtz) aclass(a *obj.Addr) int {
|
||||||
return C_LACON
|
return C_LACON
|
||||||
|
|
||||||
case obj.NAME_PARAM:
|
case obj.NAME_PARAM:
|
||||||
|
if a.Reg == REGSP {
|
||||||
|
// unset base register for better printing, since
|
||||||
|
// a.Offset is still relative to pseudo-FP.
|
||||||
|
a.Reg = obj.REG_NONE
|
||||||
|
}
|
||||||
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
|
||||||
if c.instoffset >= -BIG && c.instoffset < BIG {
|
if c.instoffset >= -BIG && c.instoffset < BIG {
|
||||||
return C_SACON
|
return C_SACON
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue