]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/asm: preserve 3rd arg when GOT-rewriting assembly instructions
authorKeith Randall <khr@golang.org>
Mon, 27 Feb 2023 16:53:34 +0000 (08:53 -0800)
committerGopher Robot <gobot@golang.org>
Mon, 27 Feb 2023 20:54:16 +0000 (20:54 +0000)
Fixes #58735

Change-Id: I7cc1c34ed8454553328d44b2ea72e4c0255b6ec1
Reviewed-on: https://go-review.googlesource.com/c/go/+/471675
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Auto-Submit: Keith Randall <khr@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/cmd/asm/internal/asm/testdata/amd64dynlinkerror.s
src/cmd/internal/obj/x86/obj6.go

index 1eee1a17db2518fb4fc8c488deb91c3e5c0f61d8..e110ee8118583048e962e35a8b4bc1d4d8cf3cc6 100644 (file)
@@ -66,3 +66,9 @@ two:
 one:
        MOVL $0, R15
        JMP two
+
+// Ensure 3-arg instructions get GOT-rewritten without errors.
+// See issue 58735.
+TEXT ·a13(SB), 0, $0-0
+       MULXQ runtime·writeBarrier(SB), AX, CX
+       RET
index 5c7fb5c763ffc2985935427f4454bb900874a25c..21126adfda49131c1f81d89b7e50f4b4bc0eb417 100644 (file)
@@ -497,6 +497,9 @@ func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
        p2.As = p.As
        p2.From = p.From
        p2.To = p.To
+       if from3 := p.GetFrom3(); from3 != nil {
+               p2.SetFrom3(*from3)
+       }
        if p.From.Name == obj.NAME_EXTERN {
                p2.From.Reg = reg
                p2.From.Name = obj.NAME_NONE