diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-02-27 22:21:58 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-02-27 22:21:58 +0000 |
commit | ee055d4068587282af49054a36194c9a4237a2f2 (patch) | |
tree | be7ee5618d4e11bd2a665ea02e2211cb4ec1f20d /gcc | |
parent | a37f5734ff1fcdec50ba474bfc0aa7ae4e440167 (diff) | |
download | gcc-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/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/crtstuff.c | 40 | ||||
-rw-r--r-- | gcc/defaults.h | 16 | ||||
-rw-r--r-- | gcc/frame.h | 5 |
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 *); |