github.com/ice-blockchain/go/src@v0.0.0-20240403114104-1564d284e521/runtime/asm_ppc64x.h (about) 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