home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / gnu / gcc-2.3.3-src.lha / GNU / src / amiga / gcc-2.3.3 / crtstuff.c < prev    next >
C/C++ Source or Header  |  1994-02-06  |  7KB  |  185 lines

  1. /* Specialized bits of code needed to support construction and
  2.    destruction of file-scope objects in C++ code.
  3.  
  4.    Written by Ron Guilmette (rfg@ncd.com) with help from Richard Stallman.
  5.  
  6. Copyright (C) 1991 Free Software Foundation, Inc.
  7.  
  8. This file is part of GNU CC.
  9.  
  10. GNU CC is free software; you can redistribute it and/or modify
  11. it under the terms of the GNU General Public License as published by
  12. the Free Software Foundation; either version 2, or (at your option)
  13. any later version.
  14.  
  15. GNU CC is distributed in the hope that it will be useful,
  16. but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. GNU General Public License for more details.
  19.  
  20. You should have received a copy of the GNU General Public License
  21. along with GNU CC; see the file COPYING.  If not, write to
  22. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  23.  
  24. /* As a special exception, if you link this library with files
  25.    compiled with GCC to produce an executable, this does not cause
  26.    the resulting executable to be covered by the GNU General Public License.
  27.    This exception does not however invalidate any other reasons why
  28.    the executable file might be covered by the GNU General Public License.  */
  29.  
  30. /* This file is a bit like libgcc1.c/libgcc2.c in that it is compiled
  31.    multiple times and yields multiple .o files.
  32.  
  33.    This file is useful on target machines where the object file format
  34.    supports multiple "user-defined" sections (e.g. COFF, ELF, ROSE).  On
  35.    such systems, this file allows us to avoid running collect (or any
  36.    other such slow and painful kludge).  Additionally, if the target
  37.    system supports a .init section, this file allows us to support the
  38.    linking of C++ code with a non-C++ main program.
  39.  
  40.    Note that if INIT_SECTION_ASM_OP is defined in the tm.h file, then
  41.    this file *will* make use of the .init section.  If that symbol is
  42.    not defined however, then the .init section will not be used.
  43.  
  44.    Currently, only ELF and COFF are supported.  It is likely however that
  45.    ROSE could also be supported, if someone was willing to do the work to
  46.    make whatever (small?) adaptations are needed.  (Some work may be
  47.    needed on the ROSE assembler and linker also.)
  48.  
  49.    This file must be compiled with gcc.  */
  50.  
  51. /* It is incorrect to include config.h here, because this file is being
  52.    compiled for the target, and hence definitions concerning only the host
  53.    do not apply.  */
  54.  
  55. #include "tm.h"
  56.  
  57. #ifndef CTORS_SECTION_ASM_OP
  58. #define CTORS_SECTION_ASM_OP    ".section\t.ctors,\"a\",@progbits"
  59. #endif
  60. #ifndef DTORS_SECTION_ASM_OP
  61. #define DTORS_SECTION_ASM_OP    ".section\t.dtors,\"a\",@progbits"
  62. #endif
  63.  
  64. #include "gbl-ctors.h"
  65.  
  66. #ifndef ON_EXIT
  67. #define ON_EXIT(a, b)
  68. #endif
  69.  
  70. #ifdef CRT_BEGIN
  71.  
  72. #ifdef INIT_SECTION_ASM_OP
  73.  
  74. /* The function __do_global_ctors_aux is compiled twice (once in crtbegin.o
  75.    and once in crtend.o).  It must be declared static to avoid a link
  76.    error.  Here, we define __do_global_ctors as an externally callable
  77.    function.  It is externally callable so that __main can invoke it when
  78.    INVOKE__main is defined.  This has the additional effect of forcing cc1
  79.    to switch to the .text section.  */
  80. static void __do_global_ctors_aux ();
  81. void __do_global_ctors ()
  82. {
  83. #ifdef INVOKE__main  /* If __main won't actually call __do_global_ctors
  84.             then it doesn't matter what's inside the function.
  85.             The inside of __do_global_ctors_aux is called
  86.             automatically in that case.
  87.             And the Alliant fx2800 linker crashes
  88.             on this reference.  So prevent the crash.  */
  89.   __do_global_ctors_aux ();
  90. #endif
  91. }
  92.  
  93. asm (INIT_SECTION_ASM_OP);    /* cc1 doesn't know that we are switching! */
  94.  
  95. /* On some svr4 systems, the .init section preamble code provided in
  96.    crti.o may do some evil things which we have to undo before we reach
  97.    the function prologue code for __do_global_ctors (directly below).
  98.    For such systems, define the macro INIT_SECTION_PREAMBLE to
  99.    expand into the code needed to undo the actions of the crti.o file.  */
  100.    
  101. #ifdef INIT_SECTION_PREAMBLE
  102.   INIT_SECTION_PREAMBLE;
  103. #endif
  104.  
  105. /* A routine to invoke all of the global constructors upon entry to the
  106.    program.  We put this into the .init section (for systems that have
  107.    such a thing) so that we can properly perform the construction of
  108.    file-scope static-storage C++ objects within shared libraries.   */
  109.  
  110. static void
  111. __do_global_ctors_aux ()    /* prologue goes in .init section */
  112. {
  113.   asm (TEXT_SECTION_ASM_OP);    /* don't put epilogue and body in .init */
  114.   DO_GLOBAL_CTORS_BODY;
  115.   ON_EXIT (__do_global_dtors, 0);
  116. }
  117.  
  118. #endif /* defined(INIT_SECTION_ASM_OP) */
  119.  
  120. /* Force cc1 to switch to .data section.  */
  121. static func_ptr force_to_data[0] = { };
  122.  
  123. /* The -1 is a flag to __do_global_[cd]tors
  124.    indicating that this table does not start with a count of elements.  */
  125. #ifdef CTOR_LIST_BEGIN
  126. CTOR_LIST_BEGIN;
  127. #else
  128. asm (CTORS_SECTION_ASM_OP);    /* cc1 doesn't know that we are switching! */
  129. func_ptr __CTOR_LIST__[1] = { (func_ptr) (-1) };
  130. #endif
  131.  
  132. #ifdef DTOR_LIST_BEGIN
  133. DTOR_LIST_BEGIN;
  134. #else
  135. asm (DTORS_SECTION_ASM_OP);    /* cc1 doesn't know that we are switching! */
  136. func_ptr __DTOR_LIST__[1] = { (func_ptr) (-1) };
  137. #endif
  138.  
  139. #endif /* defined(CRT_BEGIN) */
  140.  
  141. #ifdef CRT_END
  142.  
  143. #ifdef INIT_SECTION_ASM_OP
  144.  
  145. /* A routine to invoke all of the global constructors upon entry to the
  146.    program.  We put this into the .init section (for systems that have
  147.    such a thing) so that we can properly perform the construction of
  148.    file-scope static-storage C++ objects within shared libraries.
  149.  
  150.    This must be virtually identical to the one above so that we can
  151.    insure that the function prologue from the one above works correctly
  152.    with the epilogue from this one.  (They will both go into the .init
  153.    section as the first and last things (respectively) that the linker
  154.    will put in that section.)
  155. */
  156.  
  157. static void
  158. __do_global_ctors_aux ()    /* prologue goes in .text section */
  159. {
  160.   asm (INIT_SECTION_ASM_OP);
  161.   DO_GLOBAL_CTORS_BODY;
  162.   ON_EXIT (__do_global_dtors, 0);
  163. }                /* epilogue and body go in .init section */
  164.  
  165. #endif /* defined(INIT_SECTION_ASM_OP) */
  166.  
  167. /* Force cc1 to switch to .data section.  */
  168. static func_ptr force_to_data[0] = { };
  169.  
  170. #ifdef CTOR_LIST_END
  171. CTOR_LIST_END;
  172. #else
  173. asm (CTORS_SECTION_ASM_OP);    /* cc1 doesn't know that we are switching! */
  174. func_ptr __CTOR_END__[1] = { (func_ptr) 0 };
  175. #endif
  176.  
  177. #ifdef DTOR_LIST_END
  178. DTOR_LIST_END;
  179. #else
  180. asm (DTORS_SECTION_ASM_OP);    /* cc1 doesn't know that we are switching! */
  181. func_ptr __DTOR_END__[1] = { (func_ptr) 0 };
  182. #endif
  183.  
  184. #endif /* defined(CRT_END) */
  185.