/* .init/.fini section handling + C++ global constructor/destructor handling.
This file is based on crtstuff.c, sol2-crti.asm, sol2-crtn.asm.
-Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+Copyright (C) 1995, 1997, 1998, 2009 Free Software Foundation, Inc.
-This file is part of GNU CC.
+This file is part of GCC.
-GNU CC is free software; you can redistribute it and/or modify
+GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
any later version.
-GNU CC is distributed in the hope that it will be useful,
+GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
-/* As a special exception, if you link this file with files
- compiled with GCC to produce an executable, this does not cause
- the resulting executable to be covered by the GNU General Public License.
- This exception does not however invalidate any other reasons why
- the executable file might be covered by the GNU General Public License. */
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+<http://www.gnu.org/licenses/>. */
/* Declare a pointer to void function type. */
typedef void (*func_ptr) (void);
refers to one particular associated `__DTOR_LIST__' which belongs to the
same particular root executable or shared library file. */
-static void __do_global_dtors ()
+static void __do_global_dtors (void)
asm ("__do_global_dtors") __attribute__ ((section (".text")));
static void
-__do_global_dtors ()
+__do_global_dtors (void)
{
func_ptr *p;
for (p = __DTOR_LIST__ + 1; *p; p++)
/* .init section start.
This must appear at the start of the .init section. */
-asm ("
- .section .init\n
- .global init\n
- .word 0\n
-init:\n
- st blink,[sp,4]\n
- st fp,[sp]\n
- mov fp,sp\n
- sub sp,sp,16\n
+asm ("\n\
+ .section .init\n\
+ .global init\n\
+ .word 0\n\
+init:\n\
+ st blink,[sp,4]\n\
+ st fp,[sp]\n\
+ mov fp,sp\n\
+ sub sp,sp,16\n\
");
/* .fini section start.
This must appear at the start of the .init section. */
-asm ("
- .section .fini\n
- .global fini\n
- .word 0\n
-fini:\n
- st blink,[sp,4]\n
- st fp,[sp]\n
- mov fp,sp\n
- sub sp,sp,16\n
- bl.nd __do_global_dtors
+asm ("\n\
+ .section .fini\n\
+ .global fini\n\
+ .word 0\n\
+fini:\n\
+ st blink,[sp,4]\n\
+ st fp,[sp]\n\
+ mov fp,sp\n\
+ sub sp,sp,16\n\
+ bl.nd __do_global_dtors\n\
");
#endif /* CRT_INIT */
/* Run all global constructors for the program.
Note that they are run in reverse order. */
-static void __do_global_ctors ()
+static void __do_global_ctors (void)
asm ("__do_global_ctors") __attribute__ ((section (".text")));
static void
-__do_global_ctors ()
+__do_global_ctors (void)
{
func_ptr *p;
for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
/* .init section end.
This must live at the end of the .init section. */
-asm ("
- .section .init\n
- bl.nd __do_global_ctors
- ld blink,[fp,4]\n
- j.d blink\n
- ld.a fp,[sp,16]\n
+asm ("\n\
+ .section .init\n\
+ bl.nd __do_global_ctors\n\
+ ld blink,[fp,4]\n\
+ j.d blink\n\
+ ld.a fp,[sp,16]\n\
");
/* .fini section end.
This must live at the end of the .fini section. */
-asm ("
- .section .fini\n
- ld blink,[fp,4]\n
- j.d blink\n
- ld.a fp,[sp,16]\n
+asm ("\n\
+ .section .fini\n\
+ ld blink,[fp,4]\n\
+ j.d blink\n\
+ ld.a fp,[sp,16]\n\
");
#endif /* CRT_FINI */