Fix atomic operations on PA-RISC 2.0 processors.
[official-gcc.git] / libgcc / config / csky / crti.S
blobaeae14d2934a86365b4115ef7f3a2dc7a51307de
1 # Define _init and _fini entry points for C-SKY.
2 # Copyright (C) 2018-2022 Free Software Foundation, Inc.
3 # Contributed by C-SKY Microsystems and Mentor Graphics.
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.
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.
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.
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/>.
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.
29         .file    "crti.S"
31 /* We use more complicated versions of this code with GLIBC.  */
32 #if defined(__gnu_linux__)
34 #ifndef PREINIT_FUNCTION
35 # define PREINIT_FUNCTION __gmon_start__
36 #endif
38 #ifndef PREINIT_FUNCTION_WEAK
39 # define PREINIT_FUNCTION_WEAK 1
40 #endif
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
62         // pop lr
63         ldw     lr, (sp)
64         addi    sp, 4
65         rts
67         .align 4
68 #else
69         .hidden PREINIT_FUNCTION
70 #endif /* PREINIT_FUNCTION_WEAK */
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 */
105         br      2f
106         .literals
107         .align  4
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
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
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__) */