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