123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- # Define _init and _fini entry points for C-SKY.
- # Copyright (C) 2018-2022 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__) */
|