diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6a1030314ad..54d72b583e6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Wed Apr 8 18:21:30 1998 Richard Henderson + + * alpha/crtbegin.asm, alpha/crtend.asm, alpha/t-crtb: New files. + * configure.in (alpha-*-linux*): Use them. + Fri Apr 3 17:02:13 1998 Alexandre Petit-Bianco * tree.def (EXPR_WITH_FILE_LOCATION): New tree node definition. 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 diff --git a/gcc/config/alpha/crtend.asm b/gcc/config/alpha/crtend.asm new file mode 100644 index 00000000000..36f11b9723a --- /dev/null +++ b/gcc/config/alpha/crtend.asm @@ -0,0 +1,105 @@ + # Copyright (C) 1996 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. + + # + # Tails of the constructor/destructor lists. + # + + # The __*TOR_END__ 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_END__: + .quad 0 + +.section .dtors,"aw" + + .align 3 +__DTOR_END__: + .quad 0 + + + # + # Fragment of the ELF _init routine that invokes our ctor startup + # + +.section .init,"ax" + + # Since the bits of the _init function are spread across many + # object files, each potentially with its own GP, we must + # assume we need to load ours. Further, our .init 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_ctors_aux + + # Must match the alignment we got from crti.o else we get + # zero-filled holes in our _init function and thense SIGILL. + .align 3 + + # + # Invoke our destructors in order. + # + +.text + + .align 3 + .ent __do_global_ctors_aux + +__do_global_ctors_aux: + ldgp $29,0($27) + lda $30,-16($30) + .frame $30,16,$26,0 + stq $9,8($30) + stq $26,0($30) + .mask 0x4000200,-16 + .prologue 1 + + lda $9,__CTOR_END__ + br 1f +0: jsr $26,($27) +1: ldq $27,-8($9) + subq $9,8,$9 + not $27,$0 + bne $0,0b + + ldq $26,0($30) + ldq $9,8($30) + lda $30,16($30) + ret + + .end __do_global_ctors_aux diff --git a/gcc/config/alpha/t-crtbe b/gcc/config/alpha/t-crtbe new file mode 100644 index 00000000000..5e82b923c72 --- /dev/null +++ b/gcc/config/alpha/t-crtbe @@ -0,0 +1,9 @@ +# Effectively disable the crtbegin/end rules using crtstuff.c +T = disable + +# Assemble startup files. +crtbegin.o: $(srcdir)/config/alpha/crtbegin.asm $(GCC_PASSES) + $(GCC_FOR_TARGET) -c -o crtbegin.o -x assembler $(srcdir)/config/alpha/crtbegin.asm + +crtend.o: $(srcdir)/config/alpha/crtend.asm $(GCC_PASSES) + $(GCC_FOR_TARGET) -c -o crtend.o -x assembler $(srcdir)/config/alpha/crtend.asm diff --git a/gcc/configure b/gcc/configure index 93c8a463dd5..05ecc76ee36 100755 --- a/gcc/configure +++ b/gcc/configure @@ -2016,7 +2016,8 @@ for machine in $build $host $target; do tm_file="${tm_file} alpha/elf.h alpha/linux-elf.h alpha/linux.h" xm_defines=USE_BFD target_cpu_default="MASK_GAS" - tmake_file="t-linux t-linux-gnulibc1 alpha/t-linux" + tmake_file="t-linux t-linux-gnulibc1 alpha/t-linux alpha/t-crtbe" + extra_parts="crtbegin.o crtend.o" xmake_file=none gas=yes gnu_ld=yes if [ x$enable_threads = xyes ]; then @@ -2027,7 +2028,8 @@ for machine in $build $host $target; do tm_file="${tm_file} alpha/elf.h alpha/linux-elf.h alpha/linux.h" xm_defines=USE_BFD target_cpu_default="MASK_GAS" - tmake_file="t-linux alpha/t-linux" + tmake_file="t-linux alpha/t-linux alpha/t-crtbe" + extra_parts="crtbegin.o crtend.o" xmake_file=none fixincludes=Makefile.in gas=yes gnu_ld=yes diff --git a/gcc/configure.in b/gcc/configure.in index 3d16cb5127e..0bd227947a3 100644 --- a/gcc/configure.in +++ b/gcc/configure.in @@ -333,7 +333,8 @@ for machine in $build $host $target; do tm_file="${tm_file} alpha/elf.h alpha/linux-elf.h alpha/linux.h" xm_defines=USE_BFD target_cpu_default="MASK_GAS" - tmake_file="t-linux t-linux-gnulibc1 alpha/t-linux" + tmake_file="t-linux t-linux-gnulibc1 alpha/t-linux alpha/t-crtbe" + extra_parts="crtbegin.o crtend.o" xmake_file=none gas=yes gnu_ld=yes if [[ x$enable_threads = xyes ]]; then @@ -344,7 +345,8 @@ for machine in $build $host $target; do tm_file="${tm_file} alpha/elf.h alpha/linux-elf.h alpha/linux.h" xm_defines=USE_BFD target_cpu_default="MASK_GAS" - tmake_file="t-linux alpha/t-linux" + tmake_file="t-linux alpha/t-linux alpha/t-crtbe" + extra_parts="crtbegin.o crtend.o" xmake_file=none fixincludes=Makefile.in gas=yes gnu_ld=yes