gcc/libgcc/config/csky/crti.S
2021-01-04 10:26:59 +01:00

141 lines
3.0 KiB
ArmAsm

# 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__) */