]> git.ipfire.org Git - thirdparty/gcc.git/blob - libgcc/config/csky/crti.S
Update copyright years.
[thirdparty/gcc.git] / libgcc / config / csky / crti.S
1 # Define _init and _fini entry points for C-SKY.
2 # Copyright (C) 2018-2020 Free Software Foundation, Inc.
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
47 call_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
61 1:
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
108 2:
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
119 2:
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__) */