131
|
1 # Define _init and _fini entry points for C-SKY.
|
145
|
2 # Copyright (C) 2018-2020 Free Software Foundation, Inc.
|
131
|
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__) */
|