1
0
mirror of https://github.com/golang/go synced 2024-11-17 11:44:51 -07:00

runtime: consolidate function descriptor definitions on PPC64

This is a cleanup to allow a consistent definitions of a function
descriptor on code shared between AIX and Linux. They need to be
declared in slightly different ways, but we can hide that in one
macro.

And, update all usage.

Change-Id: I10f3580473db555b4fb4d2597b856f3a67d01a53
Reviewed-on: https://go-review.googlesource.com/c/go/+/478917
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Paul Murphy <murp@ibm.com>
This commit is contained in:
Paul E. Murphy 2023-03-23 10:41:31 -05:00 committed by Paul Murphy
parent 0393934fa4
commit 8c2900bb9f
6 changed files with 47 additions and 74 deletions

View File

@ -24,16 +24,32 @@
#define FIXED_FRAME 32 #define FIXED_FRAME 32
// aix/ppc64 uses XCOFF which has function descriptors. // aix/ppc64 uses XCOFF which uses function descriptors.
// AIX cannot perform the TOC relocation in a text section.
// Therefore, these descriptors must live in a data section.
#ifdef GOOS_aix #ifdef GOOS_aix
#ifdef GOARCH_ppc64 #ifdef GOARCH_ppc64
#define GO_PPC64X_HAS_FUNCDESC #define GO_PPC64X_HAS_FUNCDESC
#define DEFINE_PPC64X_FUNCDESC(funcname, localfuncname) \
DATA funcname+0(SB)/8, $localfuncname(SB) \
DATA funcname+8(SB)/8, $TOC(SB) \
DATA funcname+16(SB)/8, $0 \
GLOBL funcname(SB), NOPTR, $24
#endif #endif
#endif #endif
// linux/ppc64 uses ELFv1 which has function descriptors. // linux/ppc64 uses ELFv1 which uses function descriptors.
// These must also look like ABI0 functions on linux/ppc64
// to work with abi.FuncPCABI0(sigtramp) in os_linux.go.
// Only static codegen is supported on linux/ppc64, so TOC
// is not needed.
#ifdef GOOS_linux #ifdef GOOS_linux
#ifdef GOARCH_ppc64 #ifdef GOARCH_ppc64
#define GO_PPC64X_HAS_FUNCDESC #define GO_PPC64X_HAS_FUNCDESC
#define DEFINE_PPC64X_FUNCDESC(funcname, localfuncname) \
TEXT funcname(SB),NOSPLIT|NOFRAME,$0 \
DWORD $localfuncname(SB) \
DWORD $0 \
DWORD $0
#endif #endif
#endif #endif

View File

@ -771,26 +771,11 @@ TEXT runtime·setg(SB), NOSPLIT, $0-8
BL runtime·save_g(SB) BL runtime·save_g(SB)
RET RET
#ifdef GOARCH_ppc64 #ifdef GO_PPC64X_HAS_FUNCDESC
#ifdef GOOS_aix DEFINE_PPC64X_FUNCDESC(setg_gcc<>, _setg_gcc<>)
DATA setg_gcc<>+0(SB)/8, $_setg_gcc<>(SB)
DATA setg_gcc<>+8(SB)/8, $TOC(SB)
DATA setg_gcc<>+16(SB)/8, $0
GLOBL setg_gcc<>(SB), NOPTR, $24
#else
TEXT setg_gcc<>(SB),NOSPLIT|NOFRAME,$0-0
DWORD $_setg_gcc<>(SB)
DWORD $0
DWORD $0
#endif
#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 TEXT _setg_gcc<>(SB),NOSPLIT|NOFRAME,$0-0
#else
TEXT setg_gcc<>(SB),NOSPLIT|NOFRAME,$0-0
#endif #endif
// The standard prologue clobbers R31, which is callee-save in // The standard prologue clobbers R31, which is callee-save in
// the C ABI, so we have to use $-8-0 and save LR ourselves. // the C ABI, so we have to use $-8-0 and save LR ourselves.

View File

@ -7,26 +7,25 @@
#include "textflag.h" #include "textflag.h"
#include "asm_ppc64x.h" #include "asm_ppc64x.h"
#ifdef GO_PPC64X_HAS_FUNCDESC
// crosscall2 is marked with go:cgo_export_static. On AIX, this creates and exports
// the symbol name and descriptor as the AIX linker expects, but does not work if
// referenced from within Go. Create and use an aliased descriptor of crosscall2
// to workaround this.
DEFINE_PPC64X_FUNCDESC(_crosscall2<>, crosscall2)
#define CROSSCALL2_FPTR $_crosscall2<>(SB)
#else
#define CROSSCALL2_FPTR $crosscall2(SB)
#endif
// Set the x_crosscall2_ptr C function pointer variable point to crosscall2. // Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
// It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2 // It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2
TEXT ·set_crosscall2(SB),NOSPLIT,$0-0 TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
MOVD _crosscall2_ptr(SB), R5 MOVD _crosscall2_ptr(SB), R5
#ifdef GOARCH_ppc64 MOVD CROSSCALL2_FPTR, R6
MOVD $_crosscall2<>(SB), R6
#else
MOVD $crosscall2(SB), R6
#endif
MOVD R6, (R5) MOVD R6, (R5)
RET RET
#ifdef GO_PPC64X_HAS_FUNCDESC
// _crosscall2<> is a function descriptor to the real crosscall2.
DATA _crosscall2<>+0(SB)/8, $crosscall2(SB)
DATA _crosscall2<>+8(SB)/8, $TOC(SB)
DATA _crosscall2<>+16(SB)/8, $0
GLOBL _crosscall2<>(SB), NOPTR, $24
#endif
// Called by C code generated by cmd/cgo. // Called by C code generated by cmd/cgo.
// func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr) // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
// Saves C callee-saved registers and calls cgocallback with three arguments. // Saves C callee-saved registers and calls cgocallback with three arguments.

View File

@ -3,13 +3,11 @@
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
#include "textflag.h" #include "textflag.h"
#include "asm_ppc64x.h"
// _rt0_ppc64_aix is a function descriptor of the entrypoint function // _rt0_ppc64_aix is a function descriptor of the entrypoint function
// __start. This name is needed by cmd/link. // __start. This name is needed by cmd/link.
DATA _rt0_ppc64_aix+0(SB)/8, $__start<>(SB) DEFINE_PPC64X_FUNCDESC(_rt0_ppc64_aix, __start<>)
DATA _rt0_ppc64_aix+8(SB)/8, $TOC(SB)
GLOBL _rt0_ppc64_aix(SB), NOPTR, $16
// The starting function must return in the loader to // The starting function must return in the loader to
// initialise some libraries, especially libthread which // initialise some libraries, especially libthread which
@ -37,11 +35,7 @@ TEXT __start<>(SB),NOSPLIT,$-8
BL _main(SB) BL _main(SB)
DATA main+0(SB)/8, $_main(SB) DEFINE_PPC64X_FUNCDESC(main, _main)
DATA main+8(SB)/8, $TOC(SB)
DATA main+16(SB)/8, $0
GLOBL main(SB), NOPTR, $24
TEXT _main(SB),NOSPLIT,$-8 TEXT _main(SB),NOSPLIT,$-8
MOVD $runtime·rt0_go(SB), R12 MOVD $runtime·rt0_go(SB), R12
MOVD R12, CTR MOVD R12, CTR
@ -181,10 +175,7 @@ done:
MOVD R0, LR MOVD R0, LR
RET RET
DATA _rt0_ppc64_aix_lib_go+0(SB)/8, $__rt0_ppc64_aix_lib_go(SB) DEFINE_PPC64X_FUNCDESC(_rt0_ppc64_aix_lib_go, __rt0_ppc64_aix_lib_go)
DATA _rt0_ppc64_aix_lib_go+8(SB)/8, $TOC(SB)
DATA _rt0_ppc64_aix_lib_go+16(SB)/8, $0
GLOBL _rt0_ppc64_aix_lib_go(SB), NOPTR, $24
TEXT __rt0_ppc64_aix_lib_go(SB),NOSPLIT,$0 TEXT __rt0_ppc64_aix_lib_go(SB),NOSPLIT,$0
MOVD _rt0_ppc64_aix_lib_argc<>(SB), R3 MOVD _rt0_ppc64_aix_lib_argc<>(SB), R3

View File

@ -3,17 +3,10 @@
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
#include "textflag.h" #include "textflag.h"
#include "asm_ppc64x.h"
// actually a function descriptor for _main<>(SB) DEFINE_PPC64X_FUNCDESC(_rt0_ppc64_linux, _main<>)
TEXT _rt0_ppc64_linux(SB),NOSPLIT,$0 DEFINE_PPC64X_FUNCDESC(main, _main<>)
DWORD $_main<>(SB)
DWORD $0
DWORD $0
TEXT main(SB),NOSPLIT,$0
DWORD $_main<>(SB)
DWORD $0
DWORD $0
TEXT _main<>(SB),NOSPLIT,$-8 TEXT _main<>(SB),NOSPLIT,$-8
// In a statically linked binary, the stack contains argc, // In a statically linked binary, the stack contains argc,

View File

@ -447,18 +447,16 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
MOVD 24(R1), R2 MOVD 24(R1), R2
RET RET
#ifdef GOARCH_ppc64le #ifdef GO_PPC64X_HAS_FUNCDESC
DEFINE_PPC64X_FUNCDESC(runtime·sigtramp, sigtramp<>)
// cgo isn't supported on ppc64, but we need to supply a cgoSigTramp function.
DEFINE_PPC64X_FUNCDESC(runtime·cgoSigtramp, sigtramp<>)
TEXT sigtramp<>(SB),NOSPLIT|NOFRAME|TOPFRAME,$0
#else
// ppc64le doesn't need function descriptors // ppc64le doesn't need function descriptors
// Save callee-save registers in the case of signal forwarding. // Save callee-save registers in the case of signal forwarding.
// Same as on ARM64 https://golang.org/issue/31827 . // Same as on ARM64 https://golang.org/issue/31827 .
TEXT runtime·sigtramp(SB),NOSPLIT|NOFRAME,$0 TEXT runtime·sigtramp(SB),NOSPLIT|NOFRAME,$0
#else
// function descriptor for the real sigtramp
TEXT runtime·sigtramp(SB),NOSPLIT|NOFRAME,$0
DWORD $sigtramp<>(SB)
DWORD $0
DWORD $0
TEXT sigtramp<>(SB),NOSPLIT|NOFRAME|TOPFRAME,$0
#endif #endif
// Start with standard C stack frame layout and linkage. // Start with standard C stack frame layout and linkage.
MOVD LR, R0 MOVD LR, R0
@ -627,7 +625,6 @@ TEXT sigtramp<>(SB),NOSPLIT|NOFRAME|TOPFRAME,$0
RET RET
#ifdef GOARCH_ppc64le #ifdef GOARCH_ppc64le
// ppc64le doesn't need function descriptors
TEXT runtime·cgoSigtramp(SB),NOSPLIT|NOFRAME,$0 TEXT runtime·cgoSigtramp(SB),NOSPLIT|NOFRAME,$0
// The stack unwinder, presumably written in C, may not be able to // The stack unwinder, presumably written in C, may not be able to
// handle Go frame correctly. So, this function is NOFRAME, and we // handle Go frame correctly. So, this function is NOFRAME, and we
@ -722,14 +719,6 @@ sigtrampnog:
MOVD R12, CTR MOVD R12, CTR
MOVD R10, LR // restore LR MOVD R10, LR // restore LR
JMP (CTR) JMP (CTR)
#else
// function descriptor for the real sigtramp
TEXT runtime·cgoSigtramp(SB),NOSPLIT|NOFRAME,$0
DWORD $cgoSigtramp<>(SB)
DWORD $0
DWORD $0
TEXT cgoSigtramp<>(SB),NOSPLIT,$0
JMP sigtramp<>(SB)
#endif #endif
// Used by cgoSigtramp to inspect without clobbering R30/R31 via runtime.load_g. // Used by cgoSigtramp to inspect without clobbering R30/R31 via runtime.load_g.