Skip to content

Commit

Permalink
cmd/link, runtime: add initial cgo support for ppc64
Browse files Browse the repository at this point in the history
We should be able to build docker after this get applied.

Updates #13192

Change-Id: I5378d3518fac52d6bd4c97828884c1b382b7ace5
GitHub-Last-Rev: 210b7bc
GitHub-Pull-Request: #28546
Reviewed-on: https://go-review.googlesource.com/c/146898
Reviewed-by: Jiang Ma <[email protected]>
Reviewed-by: Clément Chigot <[email protected]>
Reviewed-by: Lynn Boger <[email protected]>
Run-TryBot: Tobias Klauser <[email protected]>
Run-TryBot: Lynn Boger <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
  • Loading branch information
zte-majiang authored and laboger committed Nov 20, 2018
1 parent d6f2fd9 commit 977f431
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 9 deletions.
7 changes: 7 additions & 0 deletions src/cmd/link/internal/ppc64/asm.go
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,13 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
}

func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
// Beware that bit0~bit15 start from the third byte of a instruction in Big-Endian machines.
if r.Type == objabi.R_ADDR || r.Type == objabi.R_POWER_TLS || r.Type == objabi.R_CALLPOWER {
} else {
if ctxt.Arch.ByteOrder == binary.BigEndian {
sectoff += 2
}
}
ctxt.Out.Write64(uint64(sectoff))

elfsym := r.Xsym.ElfsymForReloc()
Expand Down
3 changes: 0 additions & 3 deletions src/cmd/link/internal/ppc64/obj.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,6 @@ func archinit(ctxt *ld.Link) {
}

case objabi.Hlinux: /* ppc64 elf */
if ctxt.Arch == sys.ArchPPC64 {
*ld.FlagD = true // TODO(austin): ELF ABI v1 not supported yet
}
ld.Elfinit(ctxt)
ld.HEADR = ld.ELFRESERVE
if *ld.FlagTextAddr == -1 {
Expand Down
27 changes: 27 additions & 0 deletions src/runtime/asm_ppc64x.s
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ TEXT runtime·rt0_go(SB),NOSPLIT,$0
MOVD _cgo_init(SB), R12
CMP R0, R12
BEQ nocgo
#ifdef GOARCH_ppc64
// ppc64 use elf ABI v1. we must get the real entry address from
// first slot of the function descriptor before call.
MOVD 8(R12), R2
MOVD (R12), R12
#endif
MOVD R12, CTR // r12 = "global function entry point"
MOVD R13, R5 // arg 2: TLS base pointer
MOVD $setg_gcc<>(SB), R4 // arg 1: setg
Expand Down Expand Up @@ -597,6 +603,16 @@ g0:
#endif
// This is a "global call", so put the global entry point in r12
MOVD R3, R12

#ifdef GOARCH_ppc64
// ppc64 use elf ABI v1. we must get the real entry address from
// first slot of the function descriptor before call.
#ifndef GOOS_aix
// aix just passes the function pointer for the moment, see golang.org/cl/146898 for details.
MOVD 8(R12), R2
MOVD (R12), R12
#endif
#endif
MOVD R12, CTR
MOVD R4, R3 // arg in r3
BL (CTR)
Expand Down Expand Up @@ -754,9 +770,20 @@ TEXT runtime·setg(SB), NOSPLIT, $0-8
BL runtime·save_g(SB)
RET

#ifdef GOARCH_ppc64
TEXT setg_gcc<>(SB),NOSPLIT|NOFRAME,$0-0
DWORD $_setg_gcc<>(SB)
DWORD $0
DWORD $0
#endif

// void setg_gcc(G*); set g in C TLS.
// Must obey the gcc calling convention.
#ifdef GOARCH_ppc64le
TEXT setg_gcc<>(SB),NOSPLIT|NOFRAME,$0-0
#else
TEXT _setg_gcc<>(SB),NOSPLIT|NOFRAME,$0-0
#endif
// The standard prologue clobbers R31, which is callee-save in
// the C ABI, so we have to use $-8-0 and save LR ourselves.
MOVD LR, R4
Expand Down
17 changes: 12 additions & 5 deletions src/runtime/rt0_linux_ppc64.s
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,25 @@ TEXT _rt0_ppc64_linux(SB),NOSPLIT,$0
DWORD $0
DWORD $0

TEXT main(SB),NOSPLIT,$0
DWORD $_main<>(SB)
DWORD $0
DWORD $0

TEXT _main<>(SB),NOSPLIT,$-8
// In a statically linked binary, the stack contains argc,
// argv as argc string pointers followed by a NULL, envv as a
// sequence of string pointers followed by a NULL, and auxv.
// There is no TLS base pointer.
//
// TODO(austin): Support ABI v1 dynamic linking entry point
MOVD 0(R1), R3 // argc
ADD $8, R1, R4 // argv
BR main(SB)

TEXT main(SB),NOSPLIT,$-8
MOVD $runtime·rt0_go(SB), R12
MOVD R12, CTR
MOVBZ runtime·iscgo(SB), R5
CMP R5, $0
BEQ nocgo
BR (CTR)
nocgo:
MOVD 0(R1), R3 // argc
ADD $8, R1, R4 // argv
BR (CTR)
2 changes: 1 addition & 1 deletion src/runtime/sys_linux_ppc64x.s
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,7 @@ TEXT runtime·cgoSigtramp(SB),NOSPLIT|NOFRAME,$0
DWORD $0
DWORD $0
TEXT runtime·_cgoSigtramp(SB),NOSPLIT,$0
JMP runtime·sigtramp(SB)
JMP runtime·_sigtramp(SB)
#endif

TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT,$0
Expand Down

0 comments on commit 977f431

Please sign in to comment.