From: Lynn Boger Date: Mon, 27 Mar 2023 13:26:59 +0000 (-0500) Subject: [release-branch.go1.19] cmd/internal/obj/ppc64: fix incorrect base reg causing segv X-Git-Tag: go1.19.8~9 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6d9df0a5a62d2509819d3abc688ff8f78a466730;p=gostls13.git [release-branch.go1.19] cmd/internal/obj/ppc64: fix incorrect base reg causing segv This fixes a segv that was reported due to building minio. The problem occurred because of an incorrect selection of the base register, which was introduced by CL 306369. Fixes #59219 Change-Id: Ieb77b2afa8fb4e6f3943df5ce138679f6750d376 Reviewed-on: https://go-review.googlesource.com/c/go/+/479628 Reviewed-by: Cherry Mui Run-TryBot: Lynn Boger Reviewed-by: Matthew Dempsky TryBot-Result: Gopher Robot --- diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index f69299fe2c..eea132c00d 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -3136,8 +3136,13 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) { if r == 0 { r = c.getimpliedreg(&p.From, p) } - o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), uint32(r), uint32(high16adjusted(v))) - o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), uint32(p.To.Reg), uint32(v)) + if o.a6 == C_REG { + o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), uint32(r), uint32(high16adjusted(v))) + o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), uint32(p.To.Reg), uint32(v)) + } else { + o1 = AOP_IRR(OP_ADDIS, uint32(REGTMP), uint32(r), uint32(high16adjusted(v))) + o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), uint32(REGTMP), uint32(v)) + } // Sign extend MOVB if needed o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0) @@ -3516,8 +3521,8 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) { rel.Type = objabi.R_ADDRPOWER_TOCREL_DS } default: - reuseBaseReg := p.As != AFMOVD && p.As != AFMOVS - // Reuse To.Reg as base register if not FP move. + reuseBaseReg := o.a6 == C_REG + // Reuse To.Reg as base register if it is a GPR. o1, o2 = c.symbolAccess(p.From.Sym, v, p.To.Reg, inst, reuseBaseReg) }