mirror of
https://github.com/golang/go
synced 2024-11-06 09:26:18 -07:00
38dc177d3a
As .init_array section aren't available on AIX, the Go runtime initialization is made with gcc constructor attribute. However, as cgo tool is building a binary in order to get imported C symbols, Go symbols imported for this initilization must be ignored. -Wl,-berok is mandatory otherwize ld will fail to create this binary, _rt0_aix_ppc64_lib and runtime_rt0_go aren't defined in runtime/cgo. These two symbols must also be ignored when creating _cgo_import.go. Change-Id: Icf2e0282f5b50de5fa82007439a428e6147efef1 Reviewed-on: https://go-review.googlesource.com/c/go/+/169118 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
200 lines
4.3 KiB
ArmAsm
200 lines
4.3 KiB
ArmAsm
// Copyright 2018 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
#include "textflag.h"
|
|
|
|
// _rt0_ppc64_aix is a function descriptor of the entrypoint function
|
|
// __start. This name is needed by cmd/link.
|
|
DATA _rt0_ppc64_aix+0(SB)/8, $__start<>(SB)
|
|
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
|
|
// initialise some librairies, especially libthread which
|
|
// creates the main thread and adds the TLS in R13
|
|
// R19 contains a function descriptor to the loader function
|
|
// which needs to be called.
|
|
// This code is similar to the __start function in C
|
|
TEXT __start<>(SB),NOSPLIT,$-8
|
|
XOR R0, R0
|
|
MOVD $libc___n_pthreads(SB), R4
|
|
MOVD 0(R4), R4
|
|
MOVD $libc___mod_init(SB), R5
|
|
MOVD 0(R5), R5
|
|
MOVD 0(R19), R0
|
|
MOVD R2, 40(R1)
|
|
MOVD 8(R19), R2
|
|
MOVD R18, R3
|
|
MOVD R0, CTR
|
|
BL (CTR) // Return to AIX loader
|
|
|
|
// Launch rt0_go
|
|
MOVD 40(R1), R2
|
|
MOVD R14, R3 // argc
|
|
MOVD R15, R4 // argv
|
|
BL _main(SB)
|
|
|
|
|
|
DATA main+0(SB)/8, $_main(SB)
|
|
DATA main+8(SB)/8, $TOC(SB)
|
|
DATA main+16(SB)/8, $0
|
|
GLOBL main(SB), NOPTR, $24
|
|
|
|
TEXT _main(SB),NOSPLIT,$-8
|
|
MOVD $runtime·rt0_go(SB), R12
|
|
MOVD R12, CTR
|
|
BR (CTR)
|
|
|
|
|
|
TEXT _rt0_ppc64_aix_lib(SB),NOSPLIT,$-8
|
|
// Start with standard C stack frame layout and linkage.
|
|
MOVD LR, R0
|
|
MOVD R0, 16(R1) // Save LR in caller's frame.
|
|
MOVW CR, R0 // Save CR in caller's frame
|
|
MOVD R0, 8(R1)
|
|
|
|
MOVDU R1, -344(R1) // Allocate frame.
|
|
|
|
// Preserve callee-save registers.
|
|
MOVD R14, 48(R1)
|
|
MOVD R15, 56(R1)
|
|
MOVD R16, 64(R1)
|
|
MOVD R17, 72(R1)
|
|
MOVD R18, 80(R1)
|
|
MOVD R19, 88(R1)
|
|
MOVD R20, 96(R1)
|
|
MOVD R21,104(R1)
|
|
MOVD R22, 112(R1)
|
|
MOVD R23, 120(R1)
|
|
MOVD R24, 128(R1)
|
|
MOVD R25, 136(R1)
|
|
MOVD R26, 144(R1)
|
|
MOVD R27, 152(R1)
|
|
MOVD R28, 160(R1)
|
|
MOVD R29, 168(R1)
|
|
MOVD g, 176(R1) // R30
|
|
MOVD R31, 184(R1)
|
|
FMOVD F14, 192(R1)
|
|
FMOVD F15, 200(R1)
|
|
FMOVD F16, 208(R1)
|
|
FMOVD F17, 216(R1)
|
|
FMOVD F18, 224(R1)
|
|
FMOVD F19, 232(R1)
|
|
FMOVD F20, 240(R1)
|
|
FMOVD F21, 248(R1)
|
|
FMOVD F22, 256(R1)
|
|
FMOVD F23, 264(R1)
|
|
FMOVD F24, 272(R1)
|
|
FMOVD F25, 280(R1)
|
|
FMOVD F26, 288(R1)
|
|
FMOVD F27, 296(R1)
|
|
FMOVD F28, 304(R1)
|
|
FMOVD F29, 312(R1)
|
|
FMOVD F30, 320(R1)
|
|
FMOVD F31, 328(R1)
|
|
|
|
// Synchronous initialization.
|
|
MOVD $runtime·reginit(SB), R12
|
|
MOVD R12, CTR
|
|
BL (CTR)
|
|
|
|
MOVBZ runtime·isarchive(SB), R3 // Check buildmode = c-archive
|
|
CMP $0, R3
|
|
BEQ done
|
|
|
|
MOVD R14, _rt0_ppc64_aix_lib_argc<>(SB)
|
|
MOVD R15, _rt0_ppc64_aix_lib_argv<>(SB)
|
|
|
|
MOVD $runtime·libpreinit(SB), R12
|
|
MOVD R12, CTR
|
|
BL (CTR)
|
|
|
|
// Create a new thread to do the runtime initialization and return.
|
|
MOVD _cgo_sys_thread_create(SB), R12
|
|
CMP $0, R12
|
|
BEQ nocgo
|
|
MOVD $_rt0_ppc64_aix_lib_go(SB), R3
|
|
MOVD $0, R4
|
|
MOVD R2, 40(R1)
|
|
MOVD 8(R12), R2
|
|
MOVD (R12), R12
|
|
MOVD R12, CTR
|
|
BL (CTR)
|
|
MOVD 40(R1), R2
|
|
BR done
|
|
|
|
nocgo:
|
|
MOVD $0x800000, R12 // stacksize = 8192KB
|
|
MOVD R12, 8(R1)
|
|
MOVD $_rt0_ppc64_aix_lib_go(SB), R12
|
|
MOVD R12, 16(R1)
|
|
MOVD $runtime·newosproc0(SB),R12
|
|
MOVD R12, CTR
|
|
BL (CTR)
|
|
|
|
done:
|
|
// Restore saved registers.
|
|
MOVD 48(R1), R14
|
|
MOVD 56(R1), R15
|
|
MOVD 64(R1), R16
|
|
MOVD 72(R1), R17
|
|
MOVD 80(R1), R18
|
|
MOVD 88(R1), R19
|
|
MOVD 96(R1), R20
|
|
MOVD 104(R1), R21
|
|
MOVD 112(R1), R22
|
|
MOVD 120(R1), R23
|
|
MOVD 128(R1), R24
|
|
MOVD 136(R1), R25
|
|
MOVD 144(R1), R26
|
|
MOVD 152(R1), R27
|
|
MOVD 160(R1), R28
|
|
MOVD 168(R1), R29
|
|
MOVD 176(R1), g // R30
|
|
MOVD 184(R1), R31
|
|
FMOVD 196(R1), F14
|
|
FMOVD 200(R1), F15
|
|
FMOVD 208(R1), F16
|
|
FMOVD 216(R1), F17
|
|
FMOVD 224(R1), F18
|
|
FMOVD 232(R1), F19
|
|
FMOVD 240(R1), F20
|
|
FMOVD 248(R1), F21
|
|
FMOVD 256(R1), F22
|
|
FMOVD 264(R1), F23
|
|
FMOVD 272(R1), F24
|
|
FMOVD 280(R1), F25
|
|
FMOVD 288(R1), F26
|
|
FMOVD 296(R1), F27
|
|
FMOVD 304(R1), F28
|
|
FMOVD 312(R1), F29
|
|
FMOVD 320(R1), F30
|
|
FMOVD 328(R1), F31
|
|
|
|
ADD $344, R1
|
|
|
|
MOVD 8(R1), R0
|
|
MOVFL R0, $0xff
|
|
MOVD 16(R1), R0
|
|
MOVD R0, LR
|
|
RET
|
|
|
|
DATA _rt0_ppc64_aix_lib_go+0(SB)/8, $__rt0_ppc64_aix_lib_go(SB)
|
|
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
|
|
MOVD _rt0_ppc64_aix_lib_argc<>(SB), R3
|
|
MOVD _rt0_ppc64_aix_lib_argv<>(SB), R4
|
|
MOVD $runtime·rt0_go(SB), R12
|
|
MOVD R12, CTR
|
|
BR (CTR)
|
|
|
|
DATA _rt0_ppc64_aix_lib_argc<>(SB)/8, $0
|
|
GLOBL _rt0_ppc64_aix_lib_argc<>(SB),NOPTR, $8
|
|
DATA _rt0_ppc64_aix_lib_argv<>(SB)/8, $0
|
|
GLOBL _rt0_ppc64_aix_lib_argv<>(SB),NOPTR, $8
|