summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1999-02-27 22:21:58 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1999-02-27 22:21:58 +0000
commitee055d4068587282af49054a36194c9a4237a2f2 (patch)
treebe7ee5618d4e11bd2a665ea02e2211cb4ec1f20d /gcc
parenta37f5734ff1fcdec50ba474bfc0aa7ae4e440167 (diff)
downloadgcc-ee055d4068587282af49054a36194c9a4237a2f2.tar.gz
* frame.h: Update some comments.
* defaults.h (TARGET_ATTRIBUTE_WEAK): Define. * crtstuff.c (__register_frame_info, __deregister_frame_info): Declare using TARGET_WEAK_ATTRIBUTE. (__do_global_dtors_aux): Check if __deregister_frame_info is zero before calling it. (__do_global_dtors): Likewise. (frame_dummy): Check if __register_frame_info is zero before calling it. (__frame_dummy): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@25487 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/crtstuff.c40
-rw-r--r--gcc/defaults.h16
-rw-r--r--gcc/frame.h5
4 files changed, 71 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 47f379611d9..93871bcd445 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,17 @@
+Sat Feb 27 22:48:38 1999 H.J. Lu (hjl@gnu.org)
+ Jeffrey A Law (law@cygnus.com)
+
+ * frame.h: Update some comments.
+ * defaults.h (TARGET_ATTRIBUTE_WEAK): Define.
+ * crtstuff.c (__register_frame_info, __deregister_frame_info): Declare
+ using TARGET_WEAK_ATTRIBUTE.
+ (__do_global_dtors_aux): Check if __deregister_frame_info is
+ zero before calling it.
+ (__do_global_dtors): Likewise.
+ (frame_dummy): Check if __register_frame_info is zero before
+ calling it.
+ (__frame_dummy): Likewise.
+
Sat Feb 27 19:18:24 1999 Jeffrey A Law (law@cygnus.com)
* SERVICE: Update from the FSF.
diff --git a/gcc/crtstuff.c b/gcc/crtstuff.c
index ce2c9561e64..b7a482a6808 100644
--- a/gcc/crtstuff.c
+++ b/gcc/crtstuff.c
@@ -56,6 +56,34 @@ Boston, MA 02111-1307, USA. */
#include <stddef.h>
#include "frame.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
+ symbols to be weak as well.
+
+ This exposes a core issue, how to handle creating weak references vs
+ how to create weak definitions. Either we have to have the definition
+ of TARGET_WEAK_ATTRIBUTE be conditional in the shared header files or
+ have a second declaration if we want a function's references to be weak,
+ but not its definition.
+
+ Making TARGET_WEAK_ATTRIBUTE conditional seems like a good solution until
+ one thinks about scaling to larger problems -- ie, the condition under
+ which TARGET_WEAK_ATTRIBUTE is active will eventually get far too
+ complicated.
+
+ So, we take an approach similar to #pragma weak -- we have a second
+ declaration for functions that we want to have weak references.
+
+ Neither way is particularly good. */
+
+/* References to __register_frame_info and __deregister_frame_info should
+ be weak in this file if at all possible. */
+extern void __register_frame_info (void *, struct object *)
+ TARGET_ATTRIBUTE_WEAK;
+
+extern void *__deregister_frame_info (void *)
+ TARGET_ATTRIBUTE_WEAK;
+
#ifndef OBJECT_FORMAT_MACHO
/* Provide default definitions for the pseudo-ops used to switch to the
@@ -144,7 +172,8 @@ __do_global_dtors_aux ()
}
#ifdef EH_FRAME_SECTION_ASM_OP
- __deregister_frame_info (__EH_FRAME_BEGIN__);
+ if (__deregister_frame_info)
+ __deregister_frame_info (__EH_FRAME_BEGIN__);
#endif
completed = 1;
}
@@ -172,7 +201,8 @@ static void
frame_dummy ()
{
static struct object object;
- __register_frame_info (__EH_FRAME_BEGIN__, &object);
+ if (__register_frame_info)
+ __register_frame_info (__EH_FRAME_BEGIN__, &object);
}
static void __attribute__ ((__unused__))
@@ -256,7 +286,8 @@ __do_global_dtors ()
(*p) ();
#ifdef EH_FRAME_SECTION_ASM_OP
- __deregister_frame_info (__EH_FRAME_BEGIN__);
+ if (__deregister_frame_info)
+ __deregister_frame_info (__EH_FRAME_BEGIN__);
#endif
}
@@ -268,7 +299,8 @@ void
__frame_dummy ()
{
static struct object object;
- __register_frame_info (__EH_FRAME_BEGIN__, &object);
+ if (__register_frame_info)
+ __register_frame_info (__EH_FRAME_BEGIN__, &object);
}
#endif
#endif
diff --git a/gcc/defaults.h b/gcc/defaults.h
index 0fbf2b92af8..a0e3bfca57a 100644
--- a/gcc/defaults.h
+++ b/gcc/defaults.h
@@ -133,6 +133,22 @@ do { fprintf (FILE, "\t%s\t", ASM_LONG); \
#endif
#endif
+/* If the target supports weak symbols, define TARGET_ATTRIBUTE_WEAK to
+ provide a weak attribute. Else define it to nothing.
+
+ This would normally belong in gansidecl.h, but SUPPORTS_WEAK is
+ not available at that time.
+
+ Note, this is only for use by target files which we know are to be
+ compiled by GCC. */
+#ifndef TARGET_ATTRIBUTE_WEAK
+# if SUPPORTS_WEAK
+# define TARGET_ATTRIBUTE_WEAK __attribute__ ((weak))
+# else
+# define TARGET_ATTRIBUTE_WEAK
+# endif
+#endif
+
/* If we have a definition of INCOMING_RETURN_ADDR_RTX, assume that
the rest of the DWARF 2 frame unwind support is also provided. */
#if !defined (DWARF2_UNWIND_INFO) && defined (INCOMING_RETURN_ADDR_RTX)
diff --git a/gcc/frame.h b/gcc/frame.h
index 1ae0dea5955..985416cd180 100644
--- a/gcc/frame.h
+++ b/gcc/frame.h
@@ -54,6 +54,11 @@ struct object {
struct object *next;
};
+/* Note the following routines are exported interfaces from libgcc; do not
+ change these interfaces. Instead create new interfaces. Also note
+ references to these functions may be made weak in files where they
+ are referenced. */
+
extern void __register_frame (void * );
extern void __register_frame_table (void *);
extern void __deregister_frame (void *);