1/* Copyright (C) 2000-2021 Free Software Foundation, Inc.
2   This file was adapted from glibc sources.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
8Free Software Foundation; either version 3, or (at your option) any
9later version.
10
11GCC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14General Public License for more details.
15
16Under Section 7 of GPL version 3, you are granted additional
17permissions described in the GCC Runtime Library Exception, version
183.1, as published by the Free Software Foundation.
19
20You should have received a copy of the GNU General Public License and
21a copy of the GCC Runtime Library Exception along with this program;
22see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23<http://www.gnu.org/licenses/>.  */
24
25#include "crt.h"
26
27/* The code in sections .init and .fini is supposed to be a single
28   regular function.  The function in .init is called directly from
29   start in crt1.S.  The function in .fini is atexit()ed in crt1.S
30   too.
31
32   crti.S contributes the prologue of a function to these sections,
33   and crtn.S comes up the epilogue.  STARTFILE_SPEC should list
34   crti.o before any other object files that might add code to .init
35   or .fini sections, and ENDFILE_SPEC should list crtn.o after any
36   such object files.  */
37
38	.section .init
39/* The alignment below can't be smaller, otherwise the mova below
40   breaks.  Yes, we might align just the label, but then we'd be
41   exchanging an alignment here for one there, since the code fragment
42   below ensures 4-byte alignment on __ELF__.  */
43#ifdef __ELF__
44	.p2align 2
45#else
46	.p2align 1
47#endif
48	.global	 GLOBAL(_init)
49GLOBAL(_init):
50#ifdef __ELF__
51	mov.l	r12,@-r15
52	mova	0f,r0
53	mov.l	0f,r12
54#endif
55	mov.l	r14,@-r15
56#ifdef __ELF__
57	add	r0,r12
58#endif
59	sts.l	pr,@-r15
60#ifdef __ELF__
61	bra	1f
62#endif
63	mov	r15,r14
64#ifdef __ELF__
650:	.long	_GLOBAL_OFFSET_TABLE_
661:
67#endif
68
69	.section .fini
70/* The alignment below can't be smaller, otherwise the mova below
71   breaks.  Yes, we might align just the label, but then we'd be
72   exchanging an alignment here for one there, since the code fragment
73   below ensures 4-byte alignment on __ELF__.  */
74#ifdef __ELF__
75	.p2align 2
76#else
77	.p2align 1
78#endif
79	.global  GLOBAL(_fini)
80GLOBAL(_fini):
81#ifdef __ELF__
82	mov.l	r12,@-r15
83	mova	0f,r0
84	mov.l	0f,r12
85#endif
86	mov.l	r14,@-r15
87#ifdef __ELF__
88	add	r0,r12
89#endif
90	sts.l	pr,@-r15
91#ifdef __ELF__
92	bra	1f
93#endif
94	mov	r15,r14
95#ifdef __ELF__
960:	.long	_GLOBAL_OFFSET_TABLE_
971:
98#endif
99