diff options
Diffstat (limited to 'sysdeps/alpha/elf')
-rw-r--r-- | sysdeps/alpha/elf/Dist | 2 | ||||
-rw-r--r-- | sysdeps/alpha/elf/Makefile | 4 | ||||
-rw-r--r-- | sysdeps/alpha/elf/crtbegin.S | 92 | ||||
-rw-r--r-- | sysdeps/alpha/elf/crtend.S | 93 | ||||
-rw-r--r-- | sysdeps/alpha/elf/initfini.c | 98 |
5 files changed, 98 insertions, 191 deletions
diff --git a/sysdeps/alpha/elf/Dist b/sysdeps/alpha/elf/Dist deleted file mode 100644 index 3e7010182b..0000000000 --- a/sysdeps/alpha/elf/Dist +++ /dev/null @@ -1,2 +0,0 @@ -crtbegin.S -crtend.S diff --git a/sysdeps/alpha/elf/Makefile b/sysdeps/alpha/elf/Makefile deleted file mode 100644 index db849bd9bf..0000000000 --- a/sysdeps/alpha/elf/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -ifeq ($(subdir), csu) -extra-objs += crtbegin.o crtend.o -install-lib += crtbegin.o crtend.o -endif diff --git a/sysdeps/alpha/elf/crtbegin.S b/sysdeps/alpha/elf/crtbegin.S deleted file mode 100644 index 08f6c04f0a..0000000000 --- a/sysdeps/alpha/elf/crtbegin.S +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Richard Henderson (rth@tamu.edu) - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - - -/* - * 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 $gp,1f -1: ldgp $gp,0($gp) - 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: - .frame $sp,16,$26,0 - /* GP already loaded in .fini */ - lda $sp,-16($sp) - stq $9,8($sp) - stq $26,0($sp) - .mask (1<<26)|(1<<9), -16 - .prologue 0 - - lda $9,__DTOR_LIST__ - br 1f -0: jsr $26,($27) -1: ldq $27,8($9) - addq $9,8,$9 - bne $27,0b - - ldq $26,0($sp) - ldq $9,8($sp) - lda $sp,16($sp) - ret - - .end __do_global_dtors_aux diff --git a/sysdeps/alpha/elf/crtend.S b/sysdeps/alpha/elf/crtend.S deleted file mode 100644 index 576b8689e2..0000000000 --- a/sysdeps/alpha/elf/crtend.S +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Richard Henderson (rth@tamu.edu) - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - - -/* - * 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 $gp,1f -1: ldgp $gp,0($gp) - 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: - .frame $sp,16,$26,0 - /* GP already loaded in .init. */ - lda $sp,-16($sp) - stq $9,8($sp) - stq $26,0($sp) - .mask (1<<26)|(1<<9), -16 - .prologue 0 - - 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($sp) - ldq $9,8($sp) - lda $sp,16($sp) - ret - - .end __do_global_ctors_aux diff --git a/sysdeps/alpha/elf/initfini.c b/sysdeps/alpha/elf/initfini.c new file mode 100644 index 0000000000..e1c0f1c4d6 --- /dev/null +++ b/sysdeps/alpha/elf/initfini.c @@ -0,0 +1,98 @@ +/* Special .init and .fini section support for Alpha. + Copyright (C) 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* This file is compiled into assembly code which is then munged by a sed + script into two files: crti.s and crtn.s. + + * crti.s puts a function prologue at the beginning of the .init and .fini + sections and defines global symbols for those addresses, so they can be + called as functions. + + * crtn.s puts the corresponding function epilogues in the .init and .fini + sections. + + This differs from what would be generated by the generic code in that + we save and restore the GP within the function. In order for linker + relaxation to work, the value in the GP register on exit from a function + must be valid for the function entry point. Normally, a function is + contained within one object file and this is not an issue, provided + that the function reloads the gp after making any function calls. + However, _init and _fini are constructed from pieces of many object + files, all of which may have different GP values. So we must reload + the GP value from crti.o in crtn.o. */ + +__asm__ (" + +#include \"defs.h\" + +/*@HEADER_ENDS*/ + +/*@_init_PROLOG_BEGINS*/ + .section .init, \"ax\", @progbits + .globl _init + .ent _init +_init: + ldgp $29, 0($27) + subq $30, 16, $30 + lda $27, __gmon_start__ + stq $26, 0($30) + stq $29, 8($30) + .prologue 1 + beq $27, 1f + jsr $26, ($27), __gmon_start__ + ldq $29, 8($30) +1: + .align 3 + .end _init + .size _init, 0 +/*@_init_PROLOG_ENDS*/ + +/*@_init_EPILOG_BEGINS*/ + .section .init, \"ax\", @progbits + ldq $26, 0($30) + ldq $29, 8($30) + addq $30, 16, $30 + ret +/*@_init_EPILOG_ENDS*/ + +/*@_fini_PROLOG_BEGINS*/ + .section .fini, \"ax\", @progbits + .globl _fini + .ent _fini +_fini: + ldgp $29, 0($27) + subq $30, 16, $30 + stq $26, 0($30) + stq $29, 8($30) + .prologue 1 + .align 3 + .end _fini + .size _fini, 0 +/*@_fini_PROLOG_ENDS*/ + +/*@_fini_EPILOG_BEGINS*/ + .section .fini, \"ax\", @progbits + ldq $26, 0($30) + ldq $29, 8($30) + addq $30, 16, $30 + ret +/*@_fini_EPILOG_ENDS*/ + +/*@TRAILER_BEGINS*/ +"); |