# Define _init and _fini entry points for C-SKY.
# Copyright (C) 2018-2021 Free Software Foundation, Inc.
# Contributed by C-SKY Microsystems and Mentor Graphics.
#
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 3, or (at your option) any
# later version.
#
# This file is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# Under Section 7 of GPL version 3, you are granted additional
# permissions described in the GCC Runtime Library Exception, version
# 3.1, as published by the Free Software Foundation.
#
# You should have received a copy of the GNU General Public License and
# a copy of the GCC Runtime Library Exception along with this program;
# see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
# <http://www.gnu.org/licenses/>.


# This file just makes a stack frame for the contents of the .fini and
# .init sections.  Users may put any desired instructions in those
# sections.

	.file    "crti.S"

/* We use more complicated versions of this code with GLIBC.  */
#if defined(__gnu_linux__)

#ifndef PREINIT_FUNCTION
# define PREINIT_FUNCTION __gmon_start__
#endif

#ifndef PREINIT_FUNCTION_WEAK
# define PREINIT_FUNCTION_WEAK 1
#endif

#if PREINIT_FUNCTION_WEAK
	.global PREINIT_FUNCTION
	.weak PREINIT_FUNCTION
	.align 4
	.type call_weak_fn, %function
call_weak_fn:
	// push  lr
	subi    sp, 4
	stw     lr, (sp)
#ifdef  __PIC__
	lrw     a2, PREINIT_FUNCTION@GOT
	addu    a2, gb
	ldw     a2, (a2)
#else
	lrw     a2, PREINIT_FUNCTION
#endif
	cmpnei  a2, 0
	bf      1f
	jsr     a2
1:
	// pop lr
	ldw     lr, (sp)
	addi    sp, 4
	rts

	.align 4
#else
	.hidden PREINIT_FUNCTION
#endif /* PREINIT_FUNCTION_WEAK */

	.section .init,"ax",@progbits
	.align 4
	.globl _init
	.type _init, @function
_init:
	subi    sp, 8
	stw     lr, (sp, 0)
#ifdef __PIC__
	//  stw     gb, (sp, 4)
	bsr     .Lgetpc
.Lgetpc:
	lrw     gb, .Lgetpc@GOTPC
	add     gb, lr
#endif
#if PREINIT_FUNCTION_WEAK
#ifdef __PIC__
	lrw     a2, call_weak_fn@GOTOFF
	add     a2, gb
	jsr     a2
#else
	jsri    call_weak_fn
#endif
#else /* !PREINIT_FUNCTION_WEAK */
#ifdef  __PIC__
	lrw     a2, PREINIT_FUNCTION@PLT
	addu    a2, gb
	ldw     a2, (a2)
	jsr     a2
#else
	jsri    PREINIT_FUNCTION
#endif
#endif /* PREINIT_FUNCTION_WEAK */

	br      2f
	.literals
	.align  4
2:
	.section .fini,"ax",@progbits
	.align 4
	.globl _fini
	.type _fini, @function
_fini:
	subi    sp,8
	stw     lr, (sp, 0)
	br      2f
	.literals
	.align  4
2:

/* These are the non-GLIBC versions.  */
#else  /* !defined(__gnu_linux__) */
	.section  ".init"
	.global  _init
	.type  _init,@function
	.align  2
_init:
	subi  sp, 16
	st.w  lr, (sp, 12)
	mov     r0, r0

	.section  ".fini"
	.global  _fini
	.type  _fini,@function
	.align  2
_fini:
	subi  sp, 16
	st.w  lr, (sp, 12)
	mov     r0, r0
#endif /* defined(__gnu_linux__) */
