2002-08-26 Brian Youmans <3diff@gnu.org>
[kopensolaris-gnu/glibc.git] / linuxthreads / sysdeps / unix / sysv / linux / sh / pt-initfini.c
1 /* Special .init and .fini section support for SH. Linuxthread version.
2    Copyright (C) 2000, 2001 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it
6    and/or modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    In addition to the permissions in the GNU Lesser General Public
11    License, the Free Software Foundation gives you unlimited
12    permission to link the compiled version of this file with other
13    programs, and to distribute those programs without any restriction
14    coming from the use of this file.  (The Lesser General Public
15    License restrictions do apply in other respects; for example, they
16    cover modification of the file, and distribution when not linked
17    into another program.)
18
19    The GNU C Library is distributed in the hope that it will be
20    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
21    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22    GNU Lesser General Public License for more details.
23
24    You should have received a copy of the GNU Lesser General Public
25    License along with the GNU C Library; see the file COPYING.LIB.  If not,
26    write to the Free Software Foundation, 59 Temple Place - Suite 330,
27    Boston, MA 02111-1307, USA.  */
28
29 /* This file is compiled into assembly code which is then munged by a sed
30    script into two files: crti.s and crtn.s.
31
32    * crti.s puts a function prologue at the beginning of the
33    .init and .fini sections and defines global symbols for
34    those addresses, so they can be called as functions.
35
36    * crtn.s puts the corresponding function epilogues
37    in the .init and .fini sections. */
38
39 __asm__ ("
40
41 #include \"defs.h\"
42 #define SHARED
43
44 /*@HEADER_ENDS*/
45
46 /*@TESTS_BEGIN*/
47
48 /*@TESTS_END*/
49
50 /*@_init_PROLOG_BEGINS*/
51         .section .init
52         .align 5
53         .global _init
54         .type   _init,@function
55 _init:
56         mov.l   r12,@-r15
57         mov.l   r14,@-r15
58         sts.l   pr,@-r15
59 #ifdef SHARED
60         mova    .L22,r0
61         mov.l   .L22,r12
62         add     r0,r12
63         mova    .L24,r0
64         mov.l   .L24,r1
65         add     r0,r1
66         jsr     @r1
67          nop
68         mova    .L23,r0
69         mov.l   .L23,r1
70         add     r0,r1
71 #else
72         mov.l   .L24,r1
73         jsr     @r1
74          nop
75         mov.l   .L23,r1
76 #endif
77         jsr     @r1
78          mov    r15,r14
79         bra     1f
80          nop
81         .align 2
82 #ifdef SHARED
83 .L22:
84         .long   _GLOBAL_OFFSET_TABLE_
85 .L23:
86         .long   __gmon_start__@PLT
87 .L24:
88         .long   __pthread_initialize_minimal@PLT
89 #else
90 .L23:
91         .long   __gmon_start__
92 .L24:
93         .long   __pthread_initialize_minimal
94 #endif
95         .data
96         .global __fpscr_values
97 __fpscr_values:
98         .long   0
99         .long   0x80000
100         .previous
101 1:
102         ALIGN
103         END_INIT
104
105         
106 /*@_init_PROLOG_ENDS*/
107
108 /*@_init_EPILOG_BEGINS*/
109         .section .init
110         mov     r14,r15
111         lds.l   @r15+,pr
112         mov.l   @r15+,r14
113         rts     
114         mov.l   @r15+,r12
115         END_INIT
116         .section .text
117         .align 5
118         .weak   __gmon_start__
119         .type   __gmon_start__,@function
120 __gmon_start__:
121         mov.l   r14,@-r15
122         mov     r15,r14
123         mov     r14,r15
124         rts     
125         mov.l   @r15+,r14
126         
127 /*@_init_EPILOG_ENDS*/
128
129 /*@_fini_PROLOG_BEGINS*/
130         .section .fini
131         .align 5
132         .global _fini
133         .type   _fini,@function
134 _fini:
135         mov.l   r12,@-r15
136         mov.l   r14,@-r15
137         sts.l   pr,@-r15
138 #ifdef SHARED
139         mova    .L27,r0
140         mov.l   .L27,r12
141         add     r0,r12
142 #endif
143         mov     r15,r14
144         ALIGN
145         END_FINI
146 #ifdef SHARED
147         bra     1f
148          nop
149         .align  2
150 .L27:
151         .long   _GLOBAL_OFFSET_TABLE_
152 #endif
153 1:
154 /*@_fini_PROLOG_ENDS*/
155
156 /*@_fini_EPILOG_BEGINS*/
157         .section .fini
158         mov     r14,r15
159         lds.l   @r15+,pr
160         mov.l   @r15+,r14
161         rts     
162         mov.l   @r15+,r12
163
164         END_FINI
165         
166 /*@_fini_EPILOG_ENDS*/
167
168 /*@TRAILER_BEGINS*/
169 ");