summaryrefslogtreecommitdiff
path: root/gcc/crtstuff.c
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2001-08-21 10:12:07 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2001-08-21 10:12:07 +0000
commit584907e782b772d0868512bf7c47375c3fecfbd4 (patch)
treed6c29a072c0379bf650d4d87c7ece87ca36b4886 /gcc/crtstuff.c
parentd62e1a3b483caa3e5a09bc53467a96510da18e67 (diff)
downloadgcc-584907e782b772d0868512bf7c47375c3fecfbd4.tar.gz
* crtstuff.c: Fix thinko last change. Move list tails to start
of CRT_END section. Tidy ifdefs. (__EH_FRAME_BEGIN__): Always static for ELF. (__do_global_ctors_1): Rename from __frame_dummy. * config/mips/iris6.h (LINK_SPEC): Update for __do_global_ctors_1 name change; don't hide __EH_FRAME_BEGIN__. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45075 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/crtstuff.c')
-rw-r--r--gcc/crtstuff.c172
1 files changed, 82 insertions, 90 deletions
diff --git a/gcc/crtstuff.c b/gcc/crtstuff.c
index 2e8a2d62acf..53c76b39ba1 100644
--- a/gcc/crtstuff.c
+++ b/gcc/crtstuff.c
@@ -119,8 +119,6 @@ typedef void (*func_ptr) (void);
#ifdef CRT_BEGIN
-#ifdef INIT_SECTION_ASM_OP
-
/* NOTE: In order to be able to support SVR4 shared libraries, we arrange
to have one set of symbols { __CTOR_LIST__, __DTOR_LIST__, __CTOR_END__,
__DTOR_END__ } per root executable and also one set of these symbols
@@ -167,10 +165,7 @@ STATIC func_ptr __DTOR_LIST__[1]
#ifdef EH_FRAME_SECTION_NAME
/* Stick a label at the beginning of the frame unwind info so we can register
and deregister it with the exception handling library code. */
-#ifdef INIT_SECTION_ASM_OP
-STATIC
-#endif
-char __EH_FRAME_BEGIN__[]
+STATIC char __EH_FRAME_BEGIN__[]
__attribute__((section(EH_FRAME_SECTION_NAME), aligned(4)))
= { };
#endif /* EH_FRAME_SECTION_NAME */
@@ -178,12 +173,13 @@ char __EH_FRAME_BEGIN__[]
#ifdef JCR_SECTION_NAME
/* Stick a label at the beginning of the java class registration info
so we can register them properly. */
-
STATIC void *__JCR_LIST__[]
__attribute__ ((unused, section(JCR_SECTION_NAME), aligned(sizeof(void*))))
= { };
#endif /* JCR_SECTION_NAME */
+#ifdef INIT_SECTION_ASM_OP
+
#ifdef OBJECT_FORMAT_ELF
/* Declare the __dso_handle variable. It should have a unique value
@@ -338,12 +334,11 @@ static void __do_global_ctors_aux (void);
void
__do_global_ctors (void)
{
-#ifdef INVOKE__main /* If __main won't actually call __do_global_ctors
- then it doesn't matter what's inside the function.
- The inside of __do_global_ctors_aux is called
- automatically in that case.
- And the Alliant fx2800 linker crashes
- on this reference. So prevent the crash. */
+#ifdef INVOKE__main
+ /* If __main won't actually call __do_global_ctors then it doesn't matter
+ what's inside the function. The inside of __do_global_ctors_aux is
+ called automatically in that case. And the Alliant fx2800 linker
+ crashes on this reference. So prevent the crash. */
__do_global_ctors_aux ();
#endif
}
@@ -378,9 +373,8 @@ __do_global_ctors_aux (void) /* prologue goes in .init section */
#endif /* OBJECT_FORMAT_ELF */
-#else /* INIT_SECTION_ASM_OP */
+#elif defined(HAS_INIT_SECTION) /* ! INIT_SECTION_ASM_OP */
-#ifdef HAS_INIT_SECTION
/* This case is used by the Irix 6 port, which supports named sections but
not an SVR4-style .fini section. __do_global_dtors can be non-static
in this case because we protect it with -hidden_symbol. */
@@ -399,11 +393,12 @@ __do_global_dtors (void)
}
#if defined(EH_FRAME_SECTION_NAME) || defined(JCR_SECTION_NAME)
-/* Define a function here to call __register_frame. crtend.o is linked in
- after libgcc.a, and hence can't call libgcc.a functions directly. That
- can lead to unresolved function references. */
+/* A helper function for __do_global_ctors, which is in crtend.o. Here
+ in crtbegin.o, we can reference a couple of symbols not visible there.
+ Plus, since we're before libgcc.a, we have no problems referencing
+ functions from there. */
void
-__frame_dummy (void)
+__do_global_ctors_1(void)
{
#ifdef EH_FRAME_SECTION_NAME
static struct object object;
@@ -417,17 +412,68 @@ __frame_dummy (void)
}
#endif /* EH_FRAME_SECTION_NAME || JCR_SECTION_NAME */
-#endif /* HAS_INIT_SECTION */
-#endif /* INIT_SECTION_ASM_OP */
-#endif /* defined(CRT_BEGIN) */
+#else /* ! INIT_SECTION_ASM_OP && ! HAS_INIT_SECTION */
+#error "What are you doing with crtstuff.c, then?"
+#endif
+
+#elif defined(CRT_END) /* ! CRT_BEGIN */
+
+/* Put a word containing zero at the end of each of our two lists of function
+ addresses. Note that the words defined here go into the .ctors and .dtors
+ sections of the crtend.o file, and since that file is always linked in
+ last, these words naturally end up at the very ends of the two lists
+ contained in these two sections. */
+
+#ifdef CTOR_LIST_END
+CTOR_LIST_END;
+#elif defined(CTORS_SECTION_ASM_OP)
+/* Hack: force cc1 to switch to .data section early, so that assembling
+ __CTOR_LIST__ does not undo our behind-the-back change to .ctors. */
+static func_ptr force_to_data[1] __attribute__ ((__unused__)) = { };
+asm (CTORS_SECTION_ASM_OP);
+STATIC func_ptr __CTOR_END__[1]
+ __attribute__((aligned(sizeof(func_ptr))))
+ = { (func_ptr) 0 };
+#else
+STATIC func_ptr __CTOR_END__[1]
+ __attribute__((section(".ctors"), aligned(sizeof(func_ptr))))
+ = { (func_ptr) 0 };
+#endif
+
+#ifdef DTOR_LIST_END
+DTOR_LIST_END;
+#elif defined(DTORS_SECTION_ASM_OP)
+asm (DTORS_SECTION_ASM_OP);
+STATIC func_ptr __DTOR_END__[1]
+ __attribute__ ((unused, aligned(sizeof(func_ptr))))
+ = { (func_ptr) 0 };
+#else
+STATIC func_ptr __DTOR_END__[1]
+ __attribute__((unused, section(".dtors"), aligned(sizeof(func_ptr))))
+ = { (func_ptr) 0 };
+#endif
-#ifdef CRT_END
+#ifdef EH_FRAME_SECTION_NAME
+/* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
+ this would be the 'length' field in a real FDE. */
+STATIC int __FRAME_END__[]
+ __attribute__ ((unused, mode(SI), section(EH_FRAME_SECTION_NAME),
+ aligned(4)))
+ = { 0 };
+#endif /* EH_FRAME_SECTION */
+
+#ifdef JCR_SECTION_NAME
+/* Null terminate the .jcr section array. */
+STATIC void *__JCR_END__[1]
+ __attribute__ ((unused, section(JCR_SECTION_NAME),
+ aligned(sizeof(void *))))
+ = { 0 };
+#endif /* JCR_SECTION_NAME */
#ifdef INIT_SECTION_ASM_OP
#ifdef OBJECT_FORMAT_ELF
-static func_ptr __CTOR_END__[];
static void
__do_global_ctors_aux (void)
{
@@ -491,86 +537,31 @@ asm (TEXT_SECTION_ASM_OP);
#endif /* OBJECT_FORMAT_ELF */
-#else /* defined(INIT_SECTION_ASM_OP) */
+#elif defined(HAS_INIT_SECTION) /* ! INIT_SECTION_ASM_OP */
-#ifdef HAS_INIT_SECTION
/* This case is used by the Irix 6 port, which supports named sections but
not an SVR4-style .init section. __do_global_ctors can be non-static
in this case because we protect it with -hidden_symbol. */
-static func_ptr __CTOR_END__[];
-extern void __frame_dummy (void);
+extern void __do_global_ctors_1(void);
void
__do_global_ctors (void)
{
func_ptr *p;
#if defined(EH_FRAME_SECTION_NAME) || defined(JCR_SECTION_NAME)
- __frame_dummy ();
+ __do_global_ctors_1();
#endif
for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
(*p) ();
}
-#endif
-
-#endif /* defined(INIT_SECTION_ASM_OP) */
-
-/* Put a word containing zero at the end of each of our two lists of function
- addresses. Note that the words defined here go into the .ctors and .dtors
- sections of the crtend.o file, and since that file is always linked in
- last, these words naturally end up at the very ends of the two lists
- contained in these two sections. */
-#ifdef CTOR_LIST_END
-CTOR_LIST_END;
-
-#elif defined(CTORS_SECTION_ASM_OP)
-/* Hack: force cc1 to switch to .data section early, so that assembling
- __CTOR_LIST__ does not undo our behind-the-back change to .ctors. */
-static func_ptr force_to_data[1] __attribute__ ((__unused__)) = { };
-asm (CTORS_SECTION_ASM_OP);
-STATIC func_ptr __CTOR_END__[1]
- __attribute__((aligned(sizeof(func_ptr))))
- = { (func_ptr) 0 };
-
-#else
-STATIC func_ptr __CTOR_END__[1]
- __attribute__((section(".ctors"), aligned(sizeof(func_ptr))))
- = { (func_ptr) 0 };
+#else /* ! INIT_SECTION_ASM_OP && ! HAS_INIT_SECTION */
+#error "What are you doing with crtstuff.c, then?"
#endif
-#ifdef DTOR_LIST_END
-DTOR_LIST_END;
-#elif defined(DTORS_SECTION_ASM_OP)
-asm (DTORS_SECTION_ASM_OP);
-STATIC func_ptr __DTOR_END__[1]
- __attribute__ ((unused, aligned(sizeof(func_ptr))))
- = { (func_ptr) 0 };
-#else
-STATIC func_ptr __DTOR_END__[1]
- __attribute__((unused, section(".dtors"), aligned(sizeof(func_ptr))))
- = { (func_ptr) 0 };
+#else /* ! CRT_BEGIN && ! CRT_END */
+#error "One of CRT_BEGIN or CRT_END must be defined."
#endif
-#ifdef EH_FRAME_SECTION_NAME
-/* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
- this would be the 'length' field in a real FDE. */
-STATIC int __FRAME_END__[]
- __attribute__ ((unused, mode(SI), section(EH_FRAME_SECTION_NAME),
- aligned(4)))
- = { 0 };
-#endif /* EH_FRAME_SECTION */
-
-#ifdef JCR_SECTION_NAME
-/* Stick a label at the beginning of the java class registration info
- so we can register them properly. */
-
-STATIC void *__JCR_END__[1]
- __attribute__ ((unused, section(JCR_SECTION_NAME),
- aligned(sizeof(func_ptr))))
- = { 0 };
-#endif /* JCR_SECTION_NAME */
-
-#endif /* defined(CRT_END) */
-
#else /* OBJECT_FORMAT_MACHO */
/* For Mach-O format executables, we assume that the system's runtime is
@@ -609,9 +600,7 @@ __reg_frame_ctor (void)
__register_frame_info ((void *) eh_frame->addr, &object);
}
-#endif /* CRT_BEGIN */
-
-#ifdef CRT_END
+#elif defined(CRT_END)
static void __dereg_frame_dtor (void) __attribute__ ((destructor));
@@ -630,6 +619,9 @@ STATIC int __FRAME_END__[]
__attribute__ ((unused, mode(SI), section(EH_FRAME_SECTION_NAME),
aligned(4)))
= { 0 };
-#endif /* CRT_END */
+
+#else /* ! CRT_BEGIN && ! CRT_END */
+#error "One of CRT_BEGIN or CRT_END must be defined."
+#endif
#endif /* OBJECT_FORMAT_MACHO */