]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgcc/config/csky/crti.S
Update copyright years.
[thirdparty/gcc.git] / libgcc / config / csky / crti.S
CommitLineData
4cd0bc3b 1# Define _init and _fini entry points for C-SKY.
8d9254fc 2# Copyright (C) 2018-2020 Free Software Foundation, Inc.
4cd0bc3b
J
3# Contributed by C-SKY Microsystems and Mentor Graphics.
4#
5# This file is free software; you can redistribute it and/or modify it
6# under the terms of the GNU General Public License as published by the
7# Free Software Foundation; either version 3, or (at your option) any
8# later version.
9#
10# This file is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13# General Public License for more details.
14#
15# Under Section 7 of GPL version 3, you are granted additional
16# permissions described in the GCC Runtime Library Exception, version
17# 3.1, as published by the Free Software Foundation.
18#
19# You should have received a copy of the GNU General Public License and
20# a copy of the GCC Runtime Library Exception along with this program;
21# see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
22# <http://www.gnu.org/licenses/>.
23
24
25# This file just makes a stack frame for the contents of the .fini and
26# .init sections. Users may put any desired instructions in those
27# sections.
28
29 .file "crti.S"
30
31/* We use more complicated versions of this code with GLIBC. */
32#if defined(__gnu_linux__)
33
34#ifndef PREINIT_FUNCTION
35# define PREINIT_FUNCTION __gmon_start__
36#endif
37
38#ifndef PREINIT_FUNCTION_WEAK
39# define PREINIT_FUNCTION_WEAK 1
40#endif
41
42#if PREINIT_FUNCTION_WEAK
43 .global PREINIT_FUNCTION
44 .weak PREINIT_FUNCTION
45 .align 4
46 .type call_weak_fn, %function
47call_weak_fn:
48 // push lr
49 subi sp, 4
50 stw lr, (sp)
51#ifdef __PIC__
52 lrw a2, PREINIT_FUNCTION@GOT
53 addu a2, gb
54 ldw a2, (a2)
55#else
56 lrw a2, PREINIT_FUNCTION
57#endif
58 cmpnei a2, 0
59 bf 1f
60 jsr a2
611:
62 // pop lr
63 ldw lr, (sp)
64 addi sp, 4
65 rts
66
67 .align 4
68#else
69 .hidden PREINIT_FUNCTION
70#endif /* PREINIT_FUNCTION_WEAK */
71
72 .section .init,"ax",@progbits
73 .align 4
74 .globl _init
75 .type _init, @function
76_init:
77 subi sp, 8
78 stw lr, (sp, 0)
79#ifdef __PIC__
80 // stw gb, (sp, 4)
81 bsr .Lgetpc
82.Lgetpc:
83 lrw gb, .Lgetpc@GOTPC
84 add gb, lr
85#endif
86#if PREINIT_FUNCTION_WEAK
87#ifdef __PIC__
88 lrw a2, call_weak_fn@GOTOFF
89 add a2, gb
90 jsr a2
91#else
92 jsri call_weak_fn
93#endif
94#else /* !PREINIT_FUNCTION_WEAK */
95#ifdef __PIC__
96 lrw a2, PREINIT_FUNCTION@PLT
97 addu a2, gb
98 ldw a2, (a2)
99 jsr a2
100#else
101 jsri PREINIT_FUNCTION
102#endif
103#endif /* PREINIT_FUNCTION_WEAK */
104
105 br 2f
106 .literals
107 .align 4
1082:
109 .section .fini,"ax",@progbits
110 .align 4
111 .globl _fini
112 .type _fini, @function
113_fini:
114 subi sp,8
115 stw lr, (sp, 0)
116 br 2f
117 .literals
118 .align 4
1192:
120
121/* These are the non-GLIBC versions. */
122#else /* !defined(__gnu_linux__) */
123 .section ".init"
124 .global _init
125 .type _init,@function
126 .align 2
127_init:
128 subi sp, 16
129 st.w lr, (sp, 12)
130 mov r0, r0
131
132 .section ".fini"
133 .global _fini
134 .type _fini,@function
135 .align 2
136_fini:
137 subi sp, 16
138 st.w lr, (sp, 12)
139 mov r0, r0
140#endif /* defined(__gnu_linux__) */