aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/alpha/crtbegin.asm
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/alpha/crtbegin.asm')
-rw-r--r--gcc/config/alpha/crtbegin.asm104
1 files changed, 104 insertions, 0 deletions
diff --git a/gcc/config/alpha/crtbegin.asm b/gcc/config/alpha/crtbegin.asm
new file mode 100644
index 00000000000..dfb11e51eab
--- /dev/null
+++ b/gcc/config/alpha/crtbegin.asm
@@ -0,0 +1,104 @@
+ # Copyright (C) 1996, 1998 Free Software Foundation, Inc.
+ # Contributed by Richard Henderson (rth@tamu.edu)
+ #
+ # This file 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) any
+ # later version.
+ #
+ # In addition to the permissions in the GNU General Public License, the
+ # Free Software Foundation gives you unlimited permission to link the
+ # compiled version of this file with other programs, and to distribute
+ # those programs without any restriction coming from the use of this
+ # file. (The General Public License restrictions do apply in other
+ # respects; for example, they cover modification of the file, and
+ # distribution when not linked into another program.)
+ #
+ # This file 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 this program; see the file COPYING. If not, write to
+ # the Free Software Foundation, 59 Temple Place - Suite 330,
+ # Boston, MA 02111-1307, USA.
+ #
+ # As a special exception, if you link this library 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.
+
+ #
+ # Heads of the constructor/destructor lists.
+ #
+
+ # The __*TOR_LIST__ symbols are not global because when this file is used
+ # in a shared library, we do not want the symbol to fall over to the
+ # application's lists.
+
+.section .ctors,"aw"
+
+ .align 3
+__CTOR_LIST__:
+ .quad -1
+
+.section .dtors,"aw"
+
+ .align 3
+__DTOR_LIST__:
+ .quad -1
+
+
+ #
+ # Fragment of the ELF _fini routine that invokes our dtor cleanup.
+ #
+
+.section .fini,"ax"
+
+ # Since the bits of the _fini function are spread across many
+ # object files, each potentially with its own GP, we must
+ # assume we need to load ours. Further, our .fini section
+ # can easily be more than 4MB away from our .text bits so we
+ # can't use bsr.
+
+ br $29,1f
+1: ldgp $29,0($29)
+ jsr $26,__do_global_dtors_aux
+
+ # Must match the alignment we got from crti.o else we get
+ # zero-filled holes in our _fini function and then SIGILL.
+ .align 3
+
+ #
+ # Invoke our destructors in order.
+ #
+
+.text
+
+ .align 3
+ .ent __do_global_dtors_aux
+
+__do_global_dtors_aux:
+ ldgp $29,0($27)
+ lda $30,-16($30)
+ .frame $30,16,$26,0
+ stq $26,0($30)
+ .mask 0x4000000,-16
+ .prologue 1
+
+ lda $1,__DTOR_LIST__
+ br 1f
+0: stq $1,8($30)
+ jsr $26,($27)
+ ldq $1,8($30)
+1: ldq $27,8($1)
+ addq $1,8,$1
+ bne $27,0b
+
+ ldq $26,0($30)
+ lda $30,16($30)
+ ret
+
+ .end __do_global_dtors_aux