mirror of
https://github.com/golang/go
synced 2024-10-05 20:41:22 -06:00
fb30270037
The _rt0_arm_darwin_lib entrypoint has to conform to the darwin ARMv7 calling convention, which requires functions to preserve the value of R11. Go uses R11 as the liblink REGTMP register, so save it manually. Also avoid using R4, which is also callee-save. Fixes #12590 Change-Id: I9c3b374e330f81ff8fc9c01fa20505a33ddcf39a Reviewed-on: https://go-review.googlesource.com/14603 Reviewed-by: Ian Lance Taylor <iant@golang.org>
67 lines
1.8 KiB
ArmAsm
67 lines
1.8 KiB
ArmAsm
// Copyright 2014 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"
|
|
|
|
TEXT _rt0_arm_darwin(SB),7,$-4
|
|
// prepare arguments for main (_rt0_go)
|
|
MOVW (R13), R0 // argc
|
|
MOVW $4(R13), R1 // argv
|
|
MOVW $main(SB), R4
|
|
B (R4)
|
|
|
|
// When linking with -buildmode=c-archive or -buildmode=c-shared,
|
|
// this symbol is called from a global initialization function.
|
|
//
|
|
// Note that all currently shipping darwin/arm platforms require
|
|
// cgo and do not support c-shared.
|
|
TEXT _rt0_arm_darwin_lib(SB),NOSPLIT,$0
|
|
// R11 is REGTMP, reserved for liblink. It is used below to
|
|
// move R0/R1 into globals. However in the darwin ARMv7 calling
|
|
// convention, it is a callee-saved register. So we save it to a
|
|
// temporary register.
|
|
MOVW R11, R2
|
|
MOVW R0, _rt0_arm_darwin_lib_argc<>(SB)
|
|
MOVW R1, _rt0_arm_darwin_lib_argv<>(SB)
|
|
|
|
// Create a new thread to do the runtime initialization and return.
|
|
MOVW _cgo_sys_thread_create(SB), R3
|
|
CMP $0, R3
|
|
B.EQ nocgo
|
|
MOVW $_rt0_arm_darwin_lib_go(SB), R0
|
|
MOVW $0, R1
|
|
MOVW R2, R11
|
|
BL (R3)
|
|
RET
|
|
nocgo:
|
|
MOVW $0x400000, R0
|
|
MOVW R0, (R13) // stacksize
|
|
MOVW $_rt0_arm_darwin_lib_go(SB), R0
|
|
MOVW R0, 4(R13) // fn
|
|
MOVW $0, R0
|
|
MOVW R0, 8(R13) // fnarg
|
|
MOVW $runtime·newosproc0(SB), R3
|
|
MOVW R2, R11
|
|
BL (R3)
|
|
RET
|
|
|
|
TEXT _rt0_arm_darwin_lib_go(SB),NOSPLIT,$0
|
|
MOVW _rt0_arm_darwin_lib_argc<>(SB), R0
|
|
MOVW _rt0_arm_darwin_lib_argv<>(SB), R1
|
|
MOVW R0, (R13)
|
|
MOVW R1, 4(R13)
|
|
MOVW $runtime·rt0_go(SB), R4
|
|
B (R4)
|
|
|
|
DATA _rt0_arm_darwin_lib_argc<>(SB)/4, $0
|
|
GLOBL _rt0_arm_darwin_lib_argc<>(SB),NOPTR, $4
|
|
DATA _rt0_arm_darwin_lib_argv<>(SB)/4, $0
|
|
GLOBL _rt0_arm_darwin_lib_argv<>(SB),NOPTR, $4
|
|
|
|
TEXT main(SB),NOSPLIT,$-8
|
|
// save argc and argv onto stack
|
|
MOVM.DB.W [R0-R1], (R13)
|
|
MOVW $runtime·rt0_go(SB), R4
|
|
B (R4)
|