go/src/cmd/internal/obj
Keith Randall 2cbdd55d64 [dev.ssa] cmd/compile: fix PIC for SSA-generated code
Access to globals requires a 2-instruction sequence on PIC 386.

    MOVL foo(SB), AX

is translated by the obj package into:

    CALL getPCofNextInstructionInTempRegister(SB)
    MOVL (&foo-&thisInstruction)(tmpReg), AX

The call returns the PC of the next instruction in a register.
The next instruction then offsets from that register to get the
address required.  The tricky part is the allocation of the
temp register.  The legacy compiler always used CX, and forbid
the register allocator from allocating CX when in PIC mode.
We can't easily do that in SSA because CX is actually a required
register for shift instructions. (I think the old backend got away
with this because the register allocator never uses CX, only
codegen knows that shifts must use CX.)

Instead, we allow the temp register to be anything.  When the
destination of the MOV (or LEA) is an integer register, we can
use that register.  Otherwise, we make sure to compile the
operation using an LEA to reference the global.  So

    MOVL AX, foo(SB)

is never generated directly.  Instead, SSA generates:

    LEAL foo(SB), DX
    MOVL AX, (DX)

which is then rewritten by the obj package to:

    CALL getPcInDX(SB)
    LEAL (&foo-&thisInstruction)(DX), AX
    MOVL AX, (DX)

So this CL modifies the obj package to use different thunks
to materialize the pc into different registers.  We use the
registers that regalloc chose so that SSA can still allocate
the full set of registers.

Change-Id: Ie095644f7164a026c62e95baf9d18a8bcaed0bba
Reviewed-on: https://go-review.googlesource.com/25442
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
2016-08-09 15:50:07 +00:00
..
arm [dev.ssa] cmd/internal/obj, etc.: add and use NEGF, NEGD instructions on ARM 2016-07-20 18:15:37 +00:00
arm64 cmd/compile: enable const division for arm64 2016-04-27 17:47:49 +00:00
mips all: make copyright headers consistent with one space after period 2016-05-02 13:43:18 +00:00
ppc64 [dev.ssa] cmd/compile: Add initial SSA configuration for PPC64 2016-06-28 15:41:20 +00:00
s390x all: make copyright headers consistent with one space after period 2016-05-02 13:43:18 +00:00
x86 [dev.ssa] cmd/compile: fix PIC for SSA-generated code 2016-08-09 15:50:07 +00:00
data.go all: make copyright headers consistent with one space after period 2016-05-02 13:43:18 +00:00
flag.go cmd/internal/obj: remove dead code 2016-03-15 06:02:13 +00:00
funcdata.go all: make copyright headers consistent with one space after period 2016-03-01 23:34:33 +00:00
go.go build: enable framepointer mode by default 2016-05-26 19:02:00 +00:00
ld.go all: make copyright headers consistent with one space after period 2016-05-02 13:43:18 +00:00
line_test.go cmd/internal/obj: change linkgetline from C to Go func style 2016-03-21 18:45:20 +00:00
link.go build: enable framepointer mode by default 2016-05-26 19:02:00 +00:00
obj.go cmd/internal/obj: change linkgetline from C to Go func style 2016-03-21 18:45:20 +00:00
objfile.go cmd/link: bump object file version number 2016-05-02 22:45:29 +00:00
pass.go all: make copyright headers consistent with one space after period 2016-05-02 13:43:18 +00:00
pcln.go cmd/internal/obj, cmd/link: random style cleanups 2016-04-15 06:54:36 +00:00
plist.go cmd/internal/obj: split plist flushing from object writing 2016-04-12 21:07:16 +00:00
sizeof_test.go cmd/compile: move LSym.RefIdx for better packing 2016-03-16 20:52:33 +00:00
stack.go all: make copyright headers consistent with one space after period 2016-03-01 23:34:33 +00:00
stringer.go cmd/internal/obj/*: go generate the slice of Anames strings 2015-03-11 20:13:09 +00:00
sym.go build: enable framepointer mode by default 2016-05-26 19:02:00 +00:00
textflag.go cmd/compile: track reflect.Type.Method in deadcode 2016-03-11 21:19:20 +00:00
typekind.go cmd/internal/obj: manual C->Go cleanups 2015-04-20 16:54:22 +00:00
util.go cmd/internal/obj/x86: add AVX2 instrutions needed for sha1/sha512/sha256 acceleration 2016-05-06 13:48:29 +00:00