Text file src/runtime/asm_ppc64x.h

     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
    56  

View as plain text