2000-04-29 Richard Henderson * config/alpha/crtbegin.asm: Use C comments instead of #. Mark __dso_handle hidden. 2000-02-16 Richard Henderson * configure.in (alpha-linux*, alpha-netbsd) [extra_parts]: Add crtbeginS.o and crtendS.o. * alpha/elf.h (STARTFILE_SPEC): Use crtbeginS.o. (ENDFILE_SPEC): Use crtendS.o. * alpha/t-crtbe (crtbeginS.o, crtendS.o): New targets. * alpha/crtbegin.asm (__do_frame_takedown): Merge into ... (__do_global_dtors_aux): ... here. Call __cxa_finalize if shared and present. (__dso_handle): New variable. 2000-04-04 Ulrich Drepper * acconfig.h: Add HAVE_GAS_HIDDEN. * config.in: Regenerated. * configure.in: Add test for .hidden pseudo-op in gas. * configure: Regenerated. * crtstuff.c: Include auto-host.h. Emit additional .hidden pseudo-op for __dso_handle if the assembler knows about it. --- gcc-2.95.x/gcc/config/alpha/crtbegin.asm.jj Wed Dec 16 22:00:53 1998 +++ gcc-2.95.x/gcc/config/alpha/crtbegin.asm Mon Aug 13 11:16:43 2001 @@ -1,42 +1,46 @@ - # 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. +/* 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" @@ -53,34 +57,34 @@ __DTOR_LIST__: .section .eh_frame,"aw" __EH_FRAME_BEGIN__: - # - # Fragment of the ELF _fini routine that invokes our dtor cleanup. - # +/* + * 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. + /* 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 - # Ideally this call would go in crtend.o, except that we can't - # get hold of __EH_FRAME_BEGIN__ there. + /* Ideally this call would go in crtend.o, except that we can't + get hold of __EH_FRAME_BEGIN__ there */ jsr $26,__do_frame_takedown - # Must match the alignment we got from crti.o else we get - # zero-filled holes in our _fini function and then SIGILL. + /* Must match the alignment we got from crti.o else we get + zero-filled holes in our _fini function and then SIGILL. */ .align 3 - # - # Fragment of the ELF _init routine that sets up the frame info. - # +/* + * Fragment of the ELF _init routine that sets up the frame info. + */ .section .init,"ax" br $29,1f @@ -88,32 +92,68 @@ __EH_FRAME_BEGIN__: jsr $26,__do_frame_setup .align 3 - # - # Invoke our destructors in order. - # +/* + * Invoke our destructors in order. + */ .data - # Support recursive calls to exit. +/* Support recursive calls to exit. */ $ptr: .quad __DTOR_LIST__ +/* A globally unique widget for c++ local destructors to hang off. + + This has a unique value in every dso; in the main program its + value is zero. The object should be protected. This means the + instance in any dso or the main program is not used in any other + dso. The dynamic linker takes care of this. */ + + .global __dso_handle + .type __dso_handle,@object + .size __dso_handle,8 +#ifdef SHARED +.section .data + .align 3 +__dso_handle: + .quad __dso_handle +#else +.section .bss + .align 3 +__dso_handle: + .zero 8 +#endif +#ifdef HAVE_GAS_HIDDEN + .hidden __dso_handle +#endif + .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 $9,8($30) stq $26,0($30) .mask 0x4000200,-16 - .prologue 0 + .prologue 1 +#ifdef SHARED + /* Do c++ local destructors. */ + lda $1,__cxa_finalize + beq $1,2f + lda $16,__dso_handle + jsr $26,__cxa_finalize + ldgp $29,0($26) +2: +#endif lda $9,$ptr br 1f 0: stq $1,0($9) jsr $26,($27) + ldgp $29,0($26) 1: ldq $1,0($9) ldq $27,8($1) addq $1,8,$1 @@ -126,11 +166,11 @@ __do_global_dtors_aux: .end __do_global_dtors_aux - # - # Install our frame info. - # +/* + * Install our frame info. + */ - # ??? How can we rationally keep this size correct? +/* ??? How can we rationally keep this size correct? */ .section .bss .type $object,@object @@ -163,9 +203,9 @@ __do_frame_setup: .end __do_frame_setup - # - # Remove our frame info. - # +/* + * Remove our frame info. + */ .align 3 .ent __do_frame_takedown @@ -190,3 +230,6 @@ __do_frame_takedown: .weak __register_frame_info .weak __deregister_frame_info +#ifdef SHARED +.weak __cxa_finalize +#endif --- gcc-2.95.x/gcc/config/alpha/t-crtbe.jj Wed Dec 16 22:01:05 1998 +++ gcc-2.95.x/gcc/config/alpha/t-crtbe Mon Aug 13 11:08:08 2001 @@ -3,7 +3,13 @@ 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 + $(GCC_FOR_TARGET) -c -o crtbegin.o -x assembler-with-cpp $(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 + $(GCC_FOR_TARGET) -c -o crtend.o -x assembler $(srcdir)/config/alpha/crtend.asm + +crtbeginS.o: $(srcdir)/config/alpha/crtbegin.asm $(GCC_PASSES) + $(GCC_FOR_TARGET) -DSHARED -c -o crtbeginS.o -x assembler-with-cpp -I. $(srcdir)/config/alpha/crtbegin.asm + +crtendS.o: $(srcdir)/config/alpha/crtend.asm $(GCC_PASSES) + $(GCC_FOR_TARGET) -c -o crtendS.o -x assembler -I. $(srcdir)/config/alpha/crtend.asm --- gcc-2.95.x/gcc/config/alpha/elf.h.jj Mon Jun 21 22:15:10 1999 +++ gcc-2.95.x/gcc/config/alpha/elf.h Mon Aug 13 11:09:13 2001 @@ -513,7 +513,7 @@ do { \ #define STARTFILE_SPEC \ "%{!shared: \ %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}\ - crti.o%s crtbegin.o%s" + crti.o%s %{shared:crtbeginS.o%s}%{!shared:crtbegin.o%s}" /* Provide a ENDFILE_SPEC appropriate for ELF. Here we tack on the magical crtend.o file which provides part of the support for @@ -522,7 +522,7 @@ do { \ #undef ENDFILE_SPEC #define ENDFILE_SPEC \ - "crtend.o%s crtn.o%s" + "%{shared:crtendS.o%s}%{!shared:crtend.o%s} crtn.o%s" /* We support #pragma. */ #define HANDLE_SYSV_PRAGMA --- gcc-2.95.x/gcc/crtstuff.c 2001/04/03 10:34:32 1.18.4.1 +++ gcc-2.95.x/gcc/crtstuff.c 2001/08/09 06:56:33 @@ -55,6 +55,7 @@ Boston, MA 02111-1307, USA. */ #include "defaults.h" #include #include "frame.h" +#include "auto-host.h" /* We do not want to add the weak attribute to the declarations of these routines in frame.h because that will cause the definition of these @@ -134,7 +135,29 @@ typedef void (*func_ptr) (void); #ifdef INIT_SECTION_ASM_OP #ifdef OBJECT_FORMAT_ELF +/* Declare the __dso_handle variable. It should have a unique value + in every shared-object; in a main program its value is zero. The + object should in any case be protected. This means the instance + in one DSO or the main program is not used in another object. The + dynamic linker takes care of this. */ + +/* XXX Ideally the following should be implemented using + __attribute__ ((__visibility__ ("hidden"))) + but the __attribute__ support is not yet there. */ +#ifdef HAVE_GAS_HIDDEN +asm (".hidden\t__dso_handle"); +#endif + +#ifdef CRTSTUFFS_O +void *__dso_handle = &__dso_handle; +#else +void *__dso_handle = 0; +#endif +/* The __cxa_finalize function may not be available so we use only a + weak declaration. */ +extern void __cxa_finalize (void *) TARGET_ATTRIBUTE_WEAK; + /* Run all the global destructors on exit from the program. */ /* Some systems place the number of pointers in the first word of the @@ -164,6 +187,11 @@ __do_global_dtors_aux (void) if (completed) return; + +#ifdef CRTSTUFFS_O + if (__cxa_finalize) + __cxa_finalize (__dso_handle); +#endif while (*p) { --- gcc-2.95.x/gcc/configure.in.jj Wed Oct 13 09:58:02 1999 +++ gcc-2.95.x/gcc/configure.in Mon Aug 13 11:11:39 2001 @@ -608,7 +608,7 @@ changequote([,])dnl tm_file="${tm_file} alpha/elf.h alpha/linux.h alpha/linux-elf.h" target_cpu_default="MASK_GAS" tmake_file="t-linux t-linux-gnulibc1 alpha/t-linux alpha/t-crtbe alpha/t-ieee" - extra_parts="crtbegin.o crtend.o" + extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o" xmake_file=none gas=yes gnu_ld=yes if test x$enable_threads = xyes; then @@ -619,7 +619,7 @@ changequote([,])dnl tm_file="${tm_file} alpha/elf.h alpha/linux.h alpha/linux-elf.h" target_cpu_default="MASK_GAS" tmake_file="t-linux alpha/t-linux alpha/t-crtbe alpha/t-ieee" - extra_parts="crtbegin.o crtend.o" + extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o" xmake_file=none gas=yes gnu_ld=yes if test x$enable_threads = xyes; then @@ -630,7 +630,7 @@ changequote([,])dnl tm_file="${tm_file} alpha/elf.h alpha/netbsd.h alpha/netbsd-elf.h" target_cpu_default="MASK_GAS" tmake_file="alpha/t-crtbe alpha/t-ieee" - extra_parts="crtbegin.o crtend.o" + extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o" xmake_file=none gas=yes gnu_ld=yes ;; @@ -4052,6 +4052,21 @@ EOF rm -f conftest.s conftest.o conftest.nm1 conftest.nm2 fi AC_MSG_RESULT($gcc_cv_as_subsections) + +AC_MSG_CHECKING(assembler hidden support) +gcc_cv_as_hidden= +if test x$gcc_cv_as != x; then + # Check if we have .hidden + echo " .hidden foobar" > conftest.s + echo "foobar:" >> conftest.s + if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then + AC_DEFINE(HAVE_GAS_HIDDEN, 1, + [Define if your assembler supports .hidden.]) + gcc_cv_as_hidden="yes" + fi + rm -f conftest.s conftest.o conftest.nm1 conftest.nm2 +fi +AC_MSG_RESULT($gcc_cv_as_hidden) AC_MSG_CHECKING(assembler instructions) gcc_cv_as_instructions= --- gcc-2.95.x/gcc/config.in.jj Mon Oct 25 10:02:08 1999 +++ gcc-2.95.x/gcc/config.in Wed Jun 13 12:45:56 2001 2 the beginning of your section */ #undef HAVE_GAS_SUBSECTION_ORDERING +/* Define if your assembler supports .hidden. */ +#undef HAVE_GAS_HIDDEN + /* Define if your assembler uses the old HImode fild and fist notation. */ #undef HAVE_GAS_FILDS_FISTS