aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj/arm64/asm7.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2024-11-05 13:33:17 -0500
committerRuss Cox <rsc@golang.org>2024-11-07 12:17:10 +0000
commit5b20eec8a0eb3bd4681e315c0c4023c5164ea7b9 (patch)
tree184613d170d137337c65c238153caafe4ececa21 /src/cmd/internal/obj/arm64/asm7.go
parent4ce8c0604ee1c36c221b1a3d767dfa131d5cce8c (diff)
downloadgo-5b20eec8a0eb3bd4681e315c0c4023c5164ea7b9.tar.xz
cmd/internal/obj: replace obj.Addrel func with LSym.AddRel method
The old API was to do r := obj.AddRel(sym) r.Type = this r.Off = that etc The new API is: sym.AddRel(ctxt, obj.Reloc{Type: this: Off: that, etc}) This new API is more idiomatic and avoids ever having relocations that are only partially constructed. Most importantly, it sets up for sym.AddRel being able to check relocation validity in the future. (Passing ctxt is for use in validity checking.) Passes golang.org/x/tools/cmd/toolstash/buildall. Change-Id: I042ea76e61bb3bf6402f98ca11291a13f4799972 Reviewed-on: https://go-review.googlesource.com/c/go/+/625616 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Cherry Mui <cherryyz@google.com>
Diffstat (limited to 'src/cmd/internal/obj/arm64/asm7.go')
-rw-r--r--src/cmd/internal/obj/arm64/asm7.go164
1 files changed, 88 insertions, 76 deletions
diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go
index dc46de9bec..37de7706e8 100644
--- a/src/cmd/internal/obj/arm64/asm7.go
+++ b/src/cmd/internal/obj/arm64/asm7.go
@@ -3580,21 +3580,22 @@ func (c *ctxt7) asmout(p *obj.Prog, out []uint32) (count int) {
break
}
- rel := obj.Addrel(c.cursym)
- rel.Off = int32(c.pc)
- rel.Siz = 4
- rel.Sym = p.To.Sym
- rel.Add = p.To.Offset
- rel.Type = objabi.R_CALLARM64
+ c.cursym.AddRel(c.ctxt, obj.Reloc{
+ Type: objabi.R_CALLARM64,
+ Off: int32(c.pc),
+ Siz: 4,
+ Sym: p.To.Sym,
+ Add: p.To.Offset,
+ })
case 6: /* b ,O(R); bl ,O(R) */
o1 = c.opbrr(p, p.As)
o1 |= uint32(p.To.Reg&31) << 5
if p.As == obj.ACALL {
- rel := obj.Addrel(c.cursym)
- rel.Off = int32(c.pc)
- rel.Siz = 0
- rel.Type = objabi.R_CALLIND
+ c.cursym.AddRel(c.ctxt, obj.Reloc{
+ Type: objabi.R_CALLIND,
+ Off: int32(c.pc),
+ })
}
case 7: /* beq s */
@@ -3660,12 +3661,13 @@ func (c *ctxt7) asmout(p *obj.Prog, out []uint32) (count int) {
o1 = uint32(c.instoffset)
o2 = uint32(c.instoffset >> 32)
if p.To.Sym != nil {
- rel := obj.Addrel(c.cursym)
- rel.Off = int32(c.pc)
- rel.Siz = 8
- rel.Sym = p.To.Sym
- rel.Add = p.To.Offset
- rel.Type = objabi.R_ADDR
+ c.cursym.AddRel(c.ctxt, obj.Reloc{
+ Type: objabi.R_ADDR,
+ Off: int32(c.pc),
+ Siz: 8,
+ Sym: p.To.Sym,
+ Add: p.To.Offset,
+ })
o2 = 0
o1 = o2
}
@@ -3736,13 +3738,13 @@ func (c *ctxt7) asmout(p *obj.Prog, out []uint32) (count int) {
if p.To.Sym != nil {
// This case happens with words generated
// in the PC stream as part of the literal pool.
- rel := obj.Addrel(c.cursym)
-
- rel.Off = int32(c.pc)
- rel.Siz = 4
- rel.Sym = p.To.Sym
- rel.Add = p.To.Offset
- rel.Type = objabi.R_ADDR
+ c.cursym.AddRel(c.ctxt, obj.Reloc{
+ Type: objabi.R_ADDR,
+ Off: int32(c.pc),
+ Siz: 4,
+ Sym: p.To.Sym,
+ Add: p.To.Offset,
+ })
o1 = 0
}
@@ -4659,37 +4661,43 @@ func (c *ctxt7) asmout(p *obj.Prog, out []uint32) (count int) {
c.ctxt.Diag("cannot use REGTMP as source: %v\n", p)
}
o1 = ADR(1, 0, REGTMP)
- rel := obj.Addrel(c.cursym)
- rel.Off = int32(c.pc)
- rel.Siz = 8
- rel.Sym = p.To.Sym
- rel.Add = p.To.Offset
+ var typ objabi.RelocType
// For unaligned access, fall back to adrp + add + movT R, (REGTMP).
if o.size(c.ctxt, p) != 8 {
o2 = c.opirr(p, AADD) | REGTMP&31<<5 | REGTMP&31
o3 = c.olsr12u(p, c.opstr(p, p.As), 0, REGTMP, p.From.Reg)
- rel.Type = objabi.R_ADDRARM64
- break
+ typ = objabi.R_ADDRARM64
+ } else {
+ o2 = c.olsr12u(p, c.opstr(p, p.As), 0, REGTMP, p.From.Reg)
+ typ = c.addrRelocType(p)
}
- o2 = c.olsr12u(p, c.opstr(p, p.As), 0, REGTMP, p.From.Reg)
- rel.Type = c.addrRelocType(p)
+ c.cursym.AddRel(c.ctxt, obj.Reloc{
+ Type: typ,
+ Off: int32(c.pc),
+ Siz: 8,
+ Sym: p.To.Sym,
+ Add: p.To.Offset,
+ })
case 65: /* movT addr,R -> adrp + movT (REGTMP), R */
o1 = ADR(1, 0, REGTMP)
- rel := obj.Addrel(c.cursym)
- rel.Off = int32(c.pc)
- rel.Siz = 8
- rel.Sym = p.From.Sym
- rel.Add = p.From.Offset
+ var typ objabi.RelocType
// For unaligned access, fall back to adrp + add + movT (REGTMP), R.
if o.size(c.ctxt, p) != 8 {
o2 = c.opirr(p, AADD) | REGTMP&31<<5 | REGTMP&31
o3 = c.olsr12u(p, c.opldr(p, p.As), 0, REGTMP, p.To.Reg)
- rel.Type = objabi.R_ADDRARM64
- break
+ typ = objabi.R_ADDRARM64
+ } else {
+ o2 = c.olsr12u(p, c.opldr(p, p.As), 0, REGTMP, p.To.Reg)
+ typ = c.addrRelocType(p)
}
- o2 = c.olsr12u(p, c.opldr(p, p.As), 0, REGTMP, p.To.Reg)
- rel.Type = c.addrRelocType(p)
+ c.cursym.AddRel(c.ctxt, obj.Reloc{
+ Type: typ,
+ Off: int32(c.pc),
+ Siz: 8,
+ Sym: p.From.Sym,
+ Add: p.From.Offset,
+ })
case 66: /* ldp O(R)!, (r1, r2); ldp (R)O!, (r1, r2) */
rf, rt1, rt2 := p.From.Reg, p.To.Reg, int16(p.To.Offset)
@@ -4721,21 +4729,23 @@ func (c *ctxt7) asmout(p *obj.Prog, out []uint32) (count int) {
}
o1 = ADR(1, 0, uint32(p.To.Reg))
o2 = c.opirr(p, AADD) | uint32(p.To.Reg&31)<<5 | uint32(p.To.Reg&31)
- rel := obj.Addrel(c.cursym)
- rel.Off = int32(c.pc)
- rel.Siz = 8
- rel.Sym = p.From.Sym
- rel.Add = p.From.Offset
- rel.Type = objabi.R_ADDRARM64
+ c.cursym.AddRel(c.ctxt, obj.Reloc{
+ Type: objabi.R_ADDRARM64,
+ Off: int32(c.pc),
+ Siz: 8,
+ Sym: p.From.Sym,
+ Add: p.From.Offset,
+ })
case 69: /* LE model movd $tlsvar, reg -> movz reg, 0 + reloc */
o1 = c.opirr(p, AMOVZ)
o1 |= uint32(p.To.Reg & 31)
- rel := obj.Addrel(c.cursym)
- rel.Off = int32(c.pc)
- rel.Siz = 4
- rel.Sym = p.From.Sym
- rel.Type = objabi.R_ARM64_TLS_LE
+ c.cursym.AddRel(c.ctxt, obj.Reloc{
+ Type: objabi.R_ARM64_TLS_LE,
+ Off: int32(c.pc),
+ Siz: 4,
+ Sym: p.From.Sym,
+ })
if p.From.Offset != 0 {
c.ctxt.Diag("invalid offset on MOVW $tlsvar")
}
@@ -4743,12 +4753,12 @@ func (c *ctxt7) asmout(p *obj.Prog, out []uint32) (count int) {
case 70: /* IE model movd $tlsvar, reg -> adrp REGTMP, 0; ldr reg, [REGTMP, #0] + relocs */
o1 = ADR(1, 0, REGTMP)
o2 = c.olsr12u(p, c.opldr(p, AMOVD), 0, REGTMP, p.To.Reg)
- rel := obj.Addrel(c.cursym)
- rel.Off = int32(c.pc)
- rel.Siz = 8
- rel.Sym = p.From.Sym
- rel.Add = 0
- rel.Type = objabi.R_ARM64_TLS_IE
+ c.cursym.AddRel(c.ctxt, obj.Reloc{
+ Type: objabi.R_ARM64_TLS_IE,
+ Off: int32(c.pc),
+ Siz: 8,
+ Sym: p.From.Sym,
+ })
if p.From.Offset != 0 {
c.ctxt.Diag("invalid offset on MOVW $tlsvar")
}
@@ -4756,12 +4766,12 @@ func (c *ctxt7) asmout(p *obj.Prog, out []uint32) (count int) {
case 71: /* movd sym@GOT, reg -> adrp REGTMP, #0; ldr reg, [REGTMP, #0] + relocs */
o1 = ADR(1, 0, REGTMP)
o2 = c.olsr12u(p, c.opldr(p, AMOVD), 0, REGTMP, p.To.Reg)
- rel := obj.Addrel(c.cursym)
- rel.Off = int32(c.pc)
- rel.Siz = 8
- rel.Sym = p.From.Sym
- rel.Add = 0
- rel.Type = objabi.R_ARM64_GOTPCREL
+ c.cursym.AddRel(c.ctxt, obj.Reloc{
+ Type: objabi.R_ARM64_GOTPCREL,
+ Off: int32(c.pc),
+ Siz: 8,
+ Sym: p.From.Sym,
+ })
case 72: /* vaddp/vand/vcmeq/vorr/vadd/veor/vfmla/vfmls/vbit/vbsl/vcmtst/vsub/vbif/vuzip1/vuzip2/vrax1 Vm.<T>, Vn.<T>, Vd.<T> */
af := int((p.From.Reg >> 5) & 15)
@@ -5295,24 +5305,26 @@ func (c *ctxt7) asmout(p *obj.Prog, out []uint32) (count int) {
}
o1 = ADR(1, 0, REGTMP)
o2 = c.opirr(p, AADD) | REGTMP&31<<5 | REGTMP&31
- rel := obj.Addrel(c.cursym)
- rel.Off = int32(c.pc)
- rel.Siz = 8
- rel.Sym = p.To.Sym
- rel.Add = p.To.Offset
- rel.Type = objabi.R_ADDRARM64
+ c.cursym.AddRel(c.ctxt, obj.Reloc{
+ Type: objabi.R_ADDRARM64,
+ Off: int32(c.pc),
+ Siz: 8,
+ Sym: p.To.Sym,
+ Add: p.To.Offset,
+ })
o3 = c.opldpstp(p, o, 0, REGTMP, rf1, rf2, 0)
case 88: /* ldp addr(SB), (r,r) -> adrp + add + ldp */
rt1, rt2 := p.To.Reg, int16(p.To.Offset)
o1 = ADR(1, 0, REGTMP)
o2 = c.opirr(p, AADD) | REGTMP&31<<5 | REGTMP&31
- rel := obj.Addrel(c.cursym)
- rel.Off = int32(c.pc)
- rel.Siz = 8
- rel.Sym = p.From.Sym
- rel.Add = p.From.Offset
- rel.Type = objabi.R_ADDRARM64
+ c.cursym.AddRel(c.ctxt, obj.Reloc{
+ Type: objabi.R_ADDRARM64,
+ Off: int32(c.pc),
+ Siz: 8,
+ Sym: p.From.Sym,
+ Add: p.From.Offset,
+ })
o3 = c.opldpstp(p, o, 0, REGTMP, rt1, rt2, 1)
case 89: /* vadd/vsub Vm, Vn, Vd */