Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd/link, runtime: add initial cgo support for ppc64 #28546

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -564,6 +570,16 @@ g0:
MOVD R0, 0(R1) // clear back chain pointer (TODO can we give it real back trace information?)
// 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 @@ -722,9 +738,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