diff options
| author | Russ Cox <rsc@golang.org> | 2024-11-05 13:33:17 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2024-11-07 12:17:10 +0000 |
| commit | 5b20eec8a0eb3bd4681e315c0c4023c5164ea7b9 (patch) | |
| tree | 184613d170d137337c65c238153caafe4ececa21 /src/cmd/internal/obj/ppc64 | |
| parent | 4ce8c0604ee1c36c221b1a3d767dfa131d5cce8c (diff) | |
| download | go-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/ppc64')
| -rw-r--r-- | src/cmd/internal/obj/ppc64/asm9.go | 106 | ||||
| -rw-r--r-- | src/cmd/internal/obj/ppc64/obj9.go | 11 |
2 files changed, 67 insertions, 50 deletions
diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index 7399106c74..a9ef420e3d 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -2409,7 +2409,8 @@ func (c *ctxt9) opform(insn uint32) int { // Encode instructions and create relocation for accessing s+d according to the // instruction op with source or destination (as appropriate) register reg. -func (c *ctxt9) symbolAccess(s *obj.LSym, d int64, reg int16, op uint32, reuse bool) (o1, o2 uint32, rel *obj.Reloc) { +// The caller must call c.cursym.AddRel(c.ctxt, rel) when finished editing rel. +func (c *ctxt9) symbolAccess(s *obj.LSym, d int64, reg int16, op uint32, reuse bool) (o1, o2 uint32, rel obj.Reloc) { if c.ctxt.Headtype == objabi.Haix { // Every symbol access must be made via a TOC anchor. c.ctxt.Diag("symbolAccess called for %s", s.Name) @@ -2430,27 +2431,29 @@ func (c *ctxt9) symbolAccess(s *obj.LSym, d int64, reg int16, op uint32, reuse b o1 = AOP_IRR(OP_ADDIS, uint32(reg), base, 0) o2 = AOP_IRR(op, uint32(reg), uint32(reg), 0) } - rel = obj.Addrel(c.cursym) - rel.Off = int32(c.pc) - rel.Siz = 8 - rel.Sym = s - rel.Add = d + var typ objabi.RelocType if c.ctxt.Flag_shared { switch form { case D_FORM: - rel.Type = objabi.R_ADDRPOWER_TOCREL + typ = objabi.R_ADDRPOWER_TOCREL case DS_FORM: - rel.Type = objabi.R_ADDRPOWER_TOCREL_DS + typ = objabi.R_ADDRPOWER_TOCREL_DS } - } else { switch form { case D_FORM: - rel.Type = objabi.R_ADDRPOWER + typ = objabi.R_ADDRPOWER case DS_FORM: - rel.Type = objabi.R_ADDRPOWER_DS + typ = objabi.R_ADDRPOWER_DS } } + rel = obj.Reloc{ + Type: typ, + Off: int32(c.pc), + Siz: 8, + Sym: s, + Add: d, + } return } @@ -2668,18 +2671,18 @@ func asmout(c *ctxt9, p *obj.Prog, o *Optab, out *[5]uint32) { o1 = OP_BR(c.opirr(p.As), uint32(v), 0) if p.To.Sym != nil { - rel := obj.Addrel(c.cursym) - rel.Off = int32(c.pc) - rel.Siz = 4 - rel.Sym = p.To.Sym v += int32(p.To.Offset) if v&03 != 0 { c.ctxt.Diag("odd branch target address\n%v", p) v &^= 03 } - - rel.Add = int64(v) - rel.Type = objabi.R_CALLPOWER + c.cursym.AddRel(c.ctxt, obj.Reloc{ + Type: objabi.R_CALLPOWER, + Off: int32(c.pc), + Siz: 4, + Sym: p.To.Sym, + Add: int64(v), + }) } o2 = NOP // nop, sometimes overwritten by ld r2, 24(r1) when dynamic linking @@ -3052,7 +3055,9 @@ func asmout(c *ctxt9, p *obj.Prog, o *Optab, out *[5]uint32) { switch p.From.Name { case obj.NAME_EXTERN, obj.NAME_STATIC: // Load a 32 bit constant, or relocation depending on if a symbol is attached - o1, o2, rel = c.symbolAccess(p.From.Sym, v, p.To.Reg, OP_ADDI, true) + var rel1 obj.Reloc + o1, o2, rel1 = c.symbolAccess(p.From.Sym, v, p.To.Reg, OP_ADDI, true) + rel = &rel1 default: // Add a 32 bit offset to a register. o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), uint32(r), uint32(high16adjusted(int32(v)))) @@ -3067,6 +3072,9 @@ func asmout(c *ctxt9, p *obj.Prog, o *Optab, out *[5]uint32) { rel.Type = objabi.R_ADDRPOWER_PCREL34 } } + if rel != nil { + c.cursym.AddRel(c.ctxt, *rel) + } case 27: /* subc ra,$simm,rd => subfic rd,ra,$simm */ v := c.regoff(p.GetFrom3()) @@ -3146,12 +3154,13 @@ func asmout(c *ctxt9, p *obj.Prog, o *Optab, out *[5]uint32) { } if p.From.Sym != nil { - 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_ADDR + c.cursym.AddRel(c.ctxt, obj.Reloc{ + Type: objabi.R_ADDR, + Off: int32(c.pc), + Siz: 8, + Sym: p.From.Sym, + Add: p.From.Offset, + }) o2 = 0 o1 = o2 } @@ -3537,12 +3546,12 @@ func asmout(c *ctxt9, p *obj.Prog, o *Optab, out *[5]uint32) { /* relocation operations */ case 74: - var rel *obj.Reloc v := c.vregoff(&p.To) // Offsets in DS form stores must be a multiple of 4 inst := c.opstore(p.As) // Can't reuse base for store instructions. + var rel obj.Reloc o1, o2, rel = c.symbolAccess(p.To.Sym, v, p.From.Reg, inst, false) // Rewrite as a prefixed store if supported. @@ -3552,13 +3561,14 @@ func asmout(c *ctxt9, p *obj.Prog, o *Optab, out *[5]uint32) { } else if c.opform(inst) == DS_FORM && v&0x3 != 0 { log.Fatalf("invalid offset for DS form load/store %v", p) } + c.cursym.AddRel(c.ctxt, rel) case 75: // 32 bit offset symbol loads (got/toc/addr) - var rel *obj.Reloc v := p.From.Offset // Offsets in DS form loads must be a multiple of 4 inst := c.opload(p.As) + var rel obj.Reloc switch p.From.Name { case obj.NAME_GOTREF, obj.NAME_TOCREF: if v != 0 { @@ -3566,7 +3576,6 @@ func asmout(c *ctxt9, p *obj.Prog, o *Optab, out *[5]uint32) { } o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0) o2 = AOP_IRR(inst, uint32(p.To.Reg), uint32(p.To.Reg), 0) - rel = obj.Addrel(c.cursym) rel.Off = int32(c.pc) rel.Siz = 8 rel.Sym = p.From.Sym @@ -3602,6 +3611,7 @@ func asmout(c *ctxt9, p *obj.Prog, o *Optab, out *[5]uint32) { } else if c.opform(inst) == DS_FORM && v&0x3 != 0 { log.Fatalf("invalid offset for DS form load/store %v", p) } + c.cursym.AddRel(c.ctxt, rel) o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0) @@ -3609,41 +3619,47 @@ func asmout(c *ctxt9, p *obj.Prog, o *Optab, out *[5]uint32) { if p.From.Offset != 0 { c.ctxt.Diag("invalid offset against tls var %v", p) } - rel := obj.Addrel(c.cursym) - rel.Off = int32(c.pc) - rel.Siz = 8 - rel.Sym = p.From.Sym + var typ objabi.RelocType if !o.ispfx { o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R13, 0) o2 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), uint32(p.To.Reg), 0) - rel.Type = objabi.R_POWER_TLS_LE + typ = objabi.R_POWER_TLS_LE } else { o1, o2 = pfxadd(p.To.Reg, REG_R13, PFX_R_ABS, 0) - rel.Type = objabi.R_POWER_TLS_LE_TPREL34 + typ = objabi.R_POWER_TLS_LE_TPREL34 } + c.cursym.AddRel(c.ctxt, obj.Reloc{ + Type: typ, + Off: int32(c.pc), + Siz: 8, + Sym: p.From.Sym, + }) case 80: if p.From.Offset != 0 { c.ctxt.Diag("invalid offset against tls var %v", p) } - rel := obj.Addrel(c.cursym) - rel.Off = int32(c.pc) - rel.Siz = 8 - rel.Sym = p.From.Sym - rel.Type = objabi.R_POWER_TLS_IE + typ := objabi.R_POWER_TLS_IE if !o.ispfx { o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0) o2 = AOP_IRR(c.opload(AMOVD), uint32(p.To.Reg), uint32(p.To.Reg), 0) } else { o1, o2 = pfxload(p.As, p.To.Reg, REG_R0, PFX_R_PCREL) - rel.Type = objabi.R_POWER_TLS_IE_PCREL34 + typ = objabi.R_POWER_TLS_IE_PCREL34 } + c.cursym.AddRel(c.ctxt, obj.Reloc{ + Type: typ, + Off: int32(c.pc), + Siz: 8, + Sym: p.From.Sym, + }) o3 = AOP_RRR(OP_ADD, uint32(p.To.Reg), uint32(p.To.Reg), REG_R13) - rel = obj.Addrel(c.cursym) - rel.Off = int32(c.pc) + 8 - rel.Siz = 4 - rel.Sym = p.From.Sym - rel.Type = objabi.R_POWER_TLS + c.cursym.AddRel(c.ctxt, obj.Reloc{ + Type: objabi.R_POWER_TLS, + Off: int32(c.pc) + 8, + Siz: 4, + Sym: p.From.Sym, + }) case 82: /* vector instructions, VX-form and VC-form */ if p.From.Type == obj.TYPE_REG { diff --git a/src/cmd/internal/obj/ppc64/obj9.go b/src/cmd/internal/obj/ppc64/obj9.go index bf52e72009..2d2c198ab9 100644 --- a/src/cmd/internal/obj/ppc64/obj9.go +++ b/src/cmd/internal/obj/ppc64/obj9.go @@ -867,11 +867,12 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q.Pos = p.Pos q.From.Type = obj.TYPE_CONST q.From.Offset = 0x38420000 - rel := obj.Addrel(c.cursym) - rel.Off = 0 - rel.Siz = 8 - rel.Sym = c.ctxt.Lookup(".TOC.") - rel.Type = objabi.R_ADDRPOWER_PCREL + c.cursym.AddRel(c.ctxt, obj.Reloc{ + Type: objabi.R_ADDRPOWER_PCREL, + Off: 0, + Siz: 8, + Sym: c.ctxt.Lookup(".TOC."), + }) } if !c.cursym.Func().Text.From.Sym.NoSplit() { |
