summaryrefslogtreecommitdiff
path: root/gcc/libgcc2.c
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>1999-09-09 21:36:20 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>1999-09-09 21:36:20 +0000
commita6881cf34e63f36838e5ebe2ca70f9f1d23dbff0 (patch)
tree723f2802719575de5ff62a84c4285e1397b7da80 /gcc/libgcc2.c
parentd119628bf83b31aa17d83329dc80074e63786de9 (diff)
downloadgcc-a6881cf34e63f36838e5ebe2ca70f9f1d23dbff0.tar.gz
* defaults.h (EH_FRAME_SECTION, EH_FRAME_SECTION_ASM_OP): Define here.
* crtstuff.c: Not here. * dwarf2out.c: Or here. * libgcc2.c (__do_global_ctors, __do_global_dtors): Handle EH frame info. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@29241 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/libgcc2.c')
-rw-r--r--gcc/libgcc2.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c
index 6ac41438ecb..33481b14128 100644
--- a/gcc/libgcc2.c
+++ b/gcc/libgcc2.c
@@ -2836,6 +2836,15 @@ cacheflush (char *beg, int size, int flag)
#endif
#if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF)
+
+/* Some ELF crosses use crtstuff.c to provide __CTOR_LIST__, but use this
+ code to run constructors. In that case, we need to handle EH here, too. */
+
+#ifdef EH_FRAME_SECTION
+#include "frame.h"
+extern unsigned char __EH_FRAME_BEGIN__[];
+#endif
+
/* Run all the global destructors on exit from the program. */
void
@@ -2851,6 +2860,9 @@ __do_global_dtors ()
(*(p-1)) ();
}
#endif
+#ifdef EH_FRAME_SECTION
+ __deregister_frame_info (__EH_FRAME_BEGIN__);
+#endif
}
#endif
@@ -2871,6 +2883,12 @@ int *_exit_dummy_ref = &_exit_dummy_decl;
void
__do_global_ctors ()
{
+#ifdef EH_FRAME_SECTION
+ {
+ static struct object object;
+ __register_frame_info (__EH_FRAME_BEGIN__, &object);
+ }
+#endif
DO_GLOBAL_CTORS_BODY;
ON_EXIT (__do_global_dtors, 0);
}