]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/internal/obj/x86: don't clobber flags with dynlink rewrite
authorKeith Randall <khr@golang.org>
Thu, 4 Feb 2016 19:21:31 +0000 (11:21 -0800)
committerKeith Randall <khr@golang.org>
Thu, 4 Feb 2016 22:08:22 +0000 (22:08 +0000)
LEAQ symbol+100(SB), AX

Under dynamic link, rewrites to

MOVQ symbol@GOT(SB), AX
ADDQ $100, AX

but ADDQ clobbers flags, whereas the original LEAQ (when not dynamic
linking) doesn't.

Use LEAQ instead of ADDQ to add that constant in so we preserve flags.

Change-Id: Ibb055403d94a4c5163e1c7d2f45da633ffd0b6a3
Reviewed-on: https://go-review.googlesource.com/19230
Reviewed-by: David Chase <drchase@google.com>
Run-TryBot: David Chase <drchase@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/internal/obj/x86/obj6.go
src/cmd/internal/obj/x86/obj6_test.go

index e5453748284b984c5e9913038a9183e4b2213fae..1955aa560df9a82c37895d187ecd4ef3f32e2398 100644 (file)
@@ -377,7 +377,7 @@ func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog) {
        }
        if p.From.Type == obj.TYPE_ADDR && p.From.Name == obj.NAME_EXTERN && !p.From.Sym.Local {
                // $MOV $sym, Rx becomes $MOV sym@GOT, Rx
-               // $MOV $sym+<off>, Rx becomes $MOV sym@GOT, Rx; $ADD <off>, Rx
+               // $MOV $sym+<off>, Rx becomes $MOV sym@GOT, Rx; $LEA <off>(Rx), Rx
                // On 386 only, more complicated things like PUSHL $sym become $MOV sym@GOT, CX; PUSHL CX
                cmplxdest := false
                pAs := p.As
@@ -399,8 +399,9 @@ func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog) {
                q := p
                if p.From.Offset != 0 {
                        q = obj.Appendp(ctxt, p)
-                       q.As = add
-                       q.From.Type = obj.TYPE_CONST
+                       q.As = lea
+                       q.From.Type = obj.TYPE_MEM
+                       q.From.Reg = p.To.Reg
                        q.From.Offset = p.From.Offset
                        q.To = p.To
                        p.From.Offset = 0
index 4387db696d0cbe522e82256188f1927c8b5da355..d83ab24ab8af22432153d934b191ede1da90202f 100644 (file)
@@ -20,9 +20,9 @@ const testdata = `
 MOVQ AX, AX -> MOVQ AX, AX
 
 LEAQ name(SB), AX -> MOVQ name@GOT(SB), AX
-LEAQ name+10(SB), AX -> MOVQ name@GOT(SB), AX; ADDQ $10, AX
+LEAQ name+10(SB), AX -> MOVQ name@GOT(SB), AX; LEAQ 10(AX), AX
 MOVQ $name(SB), AX -> MOVQ name@GOT(SB), AX
-MOVQ $name+10(SB), AX -> MOVQ name@GOT(SB), AX; ADDQ $10, AX
+MOVQ $name+10(SB), AX -> MOVQ name@GOT(SB), AX; LEAQ 10(AX), AX
 
 MOVQ name(SB), AX -> NOP; MOVQ name@GOT(SB), R15; MOVQ (R15), AX
 MOVQ name+10(SB), AX -> NOP; MOVQ name@GOT(SB), R15; MOVQ 10(R15), AX