* gcc-interface/lang-specs.h (TARGET_VXWORKS_RTP): Simplify and add
[official-gcc.git] / libgcc / config / sparc / sol2-c1.S
blob0c873b098d7526f3c1d0af1aa20fcef181ac8ae0
1 ! crt1.s for sparc & sparcv9 (SunOS 5)
3 !   Copyright (C) 1992-2015 Free Software Foundation, Inc.
4 !   Written By David Vinayak Henkel-Wallace, June 1992
5
6 ! This file is free software; you can redistribute it and/or modify it
7 ! under the terms of the GNU General Public License as published by the
8 ! Free Software Foundation; either version 3, or (at your option) any
9 ! later version.
10
11 ! This file is distributed in the hope that it will be useful, but
12 ! WITHOUT ANY WARRANTY; without even the implied warranty of
13 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 ! General Public License for more details.
15
16 ! Under Section 7 of GPL version 3, you are granted additional
17 ! permissions described in the GCC Runtime Library Exception, version
18 ! 3.1, as published by the Free Software Foundation.
20 ! You should have received a copy of the GNU General Public License and
21 ! a copy of the GCC Runtime Library Exception along with this program;
22 ! see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 ! <http://www.gnu.org/licenses/>.
25 ! This file takes control of the process from the kernel, as specified
26 ! in section 3 of the SVr4 ABI.
27 ! This file is the first thing linked into any executable.
29 #ifdef __sparcv9
30 #define CPTRSIZE        8
31 #define CPTRSHIFT       3
32 #define STACK_BIAS      2047
33 #define ldn             ldx
34 #define stn             stx
35 #define setn(s, scratch, dst)   setx s, scratch, dst
36 #else
37 #define CPTRSIZE        4
38 #define CPTRSHIFT       2
39 #define STACK_BIAS      0
40 #define ldn             ld
41 #define stn             st
42 #define setn(s, scratch, dst)   set s, dst
43 #endif
45         .section        ".text"
46         .proc   022
47         .global _start
49 _start:
50         mov     0, %fp          ! Mark bottom frame pointer
51         ldn     [%sp + (16 * CPTRSIZE) + STACK_BIAS], %l0       ! argc
52         add     %sp, (17 * CPTRSIZE) + STACK_BIAS, %l1          ! argv
54         ! Leave some room for a call.  Sun leaves 32 octets (to sit on
55         ! a cache line?) so we do too.
56 #ifdef __sparcv9
57         sub     %sp, 48, %sp
58 #else
59         sub     %sp, 32, %sp
60 #endif
62         ! %g1 may contain a function to be registered w/atexit
63         orcc    %g0, %g1, %g0
64 #ifdef __sparcv9
65         be      %xcc, .nope
66 #else
67         be      .nope
68 #endif
69         mov     %g1, %o0
70         call    atexit
71         nop   
72 .nope:
73         ! Now make sure constructors and destructors are handled.
74         setn(_fini, %o1, %o0)
75         call    atexit, 1
76         nop
77         call    _init, 0
78         nop
80         ! We ignore the auxiliary vector; there is no defined way to
81         ! access those data anyway.  Instead, go straight to main:
82         mov     %l0, %o0        ! argc
83         mov     %l1, %o1        ! argv
84 #ifdef GCRT1
85         setn(___Argv, %o4, %o3)
86         stn     %o1, [%o3]      ! *___Argv
87 #endif
88         ! Skip argc words past argv, to env:
89         sll     %l0, CPTRSHIFT, %o2
90         add     %o2, CPTRSIZE, %o2
91         add     %l1, %o2, %o2   ! env
92         setn(_environ, %o4, %o3)
93         stn     %o2, [%o3]      ! *_environ
94         call    main, 4
95         nop   
96         call    exit, 0
97         nop   
98         call    _exit, 0
99         nop   
100         ! We should never get here.
102         .type   _start,#function
103         .size   _start,.-_start