...

Text file src/runtime/asm_ppc64x.h

Documentation: runtime

     1// Copyright 2015 The Go Authors. All rights reserved.
     2// Use of this source code is governed by a BSD-style
     3// license that can be found in the LICENSE file.
     4
     5// FIXED_FRAME defines the size of the fixed part of a stack frame. A stack
     6// frame looks like this:
     7//
     8// +---------------------+
     9// | local variable area |
    10// +---------------------+
    11// | argument area       |
    12// +---------------------+ <- R1+FIXED_FRAME
    13// | fixed area          |
    14// +---------------------+ <- R1
    15//
    16// So a function that sets up a stack frame at all uses as least FIXED_FRAME
    17// bytes of stack. This mostly affects assembly that calls other functions
    18// with arguments (the arguments should be stored at FIXED_FRAME+0(R1),
    19// FIXED_FRAME+8(R1) etc) and some other low-level places.
    20//
    21// The reason for using a constant is to make supporting PIC easier (although
    22// we only support PIC on ppc64le which has a minimum 32 bytes of stack frame,
    23// and currently always use that much, PIC on ppc64 would need to use 48).
    24
    25#define FIXED_FRAME 32
    26
    27// aix/ppc64 uses XCOFF which uses function descriptors.
    28// AIX cannot perform the TOC relocation in a text section.
    29// Therefore, these descriptors must live in a data section.
    30#ifdef GOOS_aix
    31#ifdef GOARCH_ppc64
    32#define GO_PPC64X_HAS_FUNCDESC
    33#define DEFINE_PPC64X_FUNCDESC(funcname, localfuncname)	\
    34	DATA	funcname+0(SB)/8, $localfuncname(SB) 	\
    35	DATA	funcname+8(SB)/8, $TOC(SB)		\
    36	DATA	funcname+16(SB)/8, $0			\
    37	GLOBL	funcname(SB), NOPTR, $24
    38#endif
    39#endif
    40
    41// linux/ppc64 uses ELFv1 which uses function descriptors.
    42// These must also look like ABI0 functions on linux/ppc64
    43// to work with abi.FuncPCABI0(sigtramp) in os_linux.go.
    44// Only static codegen is supported on linux/ppc64, so TOC
    45// is not needed.
    46#ifdef GOOS_linux
    47#ifdef GOARCH_ppc64
    48#define GO_PPC64X_HAS_FUNCDESC
    49#define DEFINE_PPC64X_FUNCDESC(funcname, localfuncname)	\
    50	TEXT	funcname(SB),NOSPLIT|NOFRAME,$0		\
    51		DWORD	$localfuncname(SB)		\
    52		DWORD	$0				\
    53		DWORD	$0
    54#endif
    55#endif

View as plain text