diff options
author | ktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-08-19 15:22:59 +0000 |
---|---|---|
committer | ktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-08-19 15:22:59 +0000 |
commit | 1db4f54b5b0d78f8de678c099c6bd117ff95d82f (patch) | |
tree | ef3547031c0e3ad7bb00a76cbb7dfdb7fb40264d /libgcc | |
parent | 941173912dc7609fe265ff9ce3ed3b1e5bd8d93e (diff) | |
download | gcc-1db4f54b5b0d78f8de678c099c6bd117ff95d82f.tar.gz |
2014-08-19 Yaakov Selkowitz <yselkowi@redhat.com>
* config/i386/cygming-crtend.c (register_frame_ctor): Move atexit
call from here...
* config/i386/cygming-crtbegin.c (__gcc_register_frame): to here.
(__dso_handle): Define on Cygwin.
* config/i386/t-cygming (crtbeginS.o): New rule.
* config.host (*-*-cygwin*): Add crtbeginS.o to extra_parts.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@214162 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/ChangeLog | 7 | ||||
-rw-r--r-- | libgcc/config.host | 4 | ||||
-rw-r--r-- | libgcc/config/i386/cygming-crtbegin.c | 24 | ||||
-rw-r--r-- | libgcc/config/i386/cygming-crtend.c | 6 | ||||
-rw-r--r-- | libgcc/config/i386/t-cygming | 3 |
5 files changed, 36 insertions, 8 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index cdca13a30d8..c9f4e12dd49 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,5 +1,12 @@ 2014-08-19 Yaakov Selkowitz <yselkowi@redhat.com> + * config/i386/cygming-crtend.c (register_frame_ctor): Move atexit + call from here... + * config/i386/cygming-crtbegin.c (__gcc_register_frame): to here. + (__dso_handle): Define on Cygwin. + * config/i386/t-cygming (crtbeginS.o): New rule. + * config.host (*-*-cygwin*): Add crtbeginS.o to extra_parts. + * config/i386/cygming-crtbegin.c (deregister_frame_fn): Fix declaration syntax. diff --git a/libgcc/config.host b/libgcc/config.host index 54fe53803d6..0550c343445 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -614,7 +614,7 @@ i[34567]86-*-solaris2* | x86_64-*-solaris2.1[0-9]*) i[4567]86-wrs-vxworks|i[4567]86-wrs-vxworksae) ;; i[34567]86-*-cygwin*) - extra_parts="crtbegin.o crtend.o crtfastmath.o" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtfastmath.o" # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h if test x$enable_sjlj_exceptions = xyes; then tmake_eh_file="i386/t-sjlj-eh" @@ -630,7 +630,7 @@ i[34567]86-*-cygwin*) tmake_file="${tmake_file} ${tmake_eh_file} ${tmake_dlldir_file} i386/t-slibgcc-cygming i386/t-cygming i386/t-cygwin i386/t-crtfm i386/t-chkstk t-dfprules" ;; x86_64-*-cygwin*) - extra_parts="crtbegin.o crtend.o crtfastmath.o" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtfastmath.o" # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h if test x$enable_sjlj_exceptions = xyes; then tmake_eh_file="i386/t-sjlj-eh" diff --git a/libgcc/config/i386/cygming-crtbegin.c b/libgcc/config/i386/cygming-crtbegin.c index dde9f2a52fb..3e8ed2239e4 100644 --- a/libgcc/config/i386/cygming-crtbegin.c +++ b/libgcc/config/i386/cygming-crtbegin.c @@ -111,6 +111,23 @@ static void *__JCR_LIST__[] = { }; #endif +#ifdef __CYGWIN__ +/* Declare the __dso_handle variable. It should have a unique value + in every shared-object; in a main program its value is zero. The + object should in any case be protected. This means the instance + in one DSO or the main program is not used in another object. The + dynamic linker takes care of this. */ + +#ifdef CRTSTUFFS_O +extern void *__ImageBase; +void *__dso_handle = &__ImageBase; +#else +void *__dso_handle = 0; +#endif + +#endif /* __CYGWIN__ */ + + /* Pull in references from libgcc.a(unwind-dw2-fde.o) in the startfile. These are referenced by a ctor and dtor in crtend.o. */ extern void __gcc_register_frame (void); @@ -161,6 +178,13 @@ __gcc_register_frame (void) register_class_fn (__JCR_LIST__); } #endif + +#if DEFAULT_USE_CXA_ATEXIT + /* If we use the __cxa_atexit method to register C++ dtors + at object construction, also use atexit to register eh frame + info cleanup. */ + atexit(__gcc_deregister_frame); +#endif /* DEFAULT_USE_CXA_ATEXIT */ } void diff --git a/libgcc/config/i386/cygming-crtend.c b/libgcc/config/i386/cygming-crtend.c index de0d61face2..d3beaf96635 100644 --- a/libgcc/config/i386/cygming-crtend.c +++ b/libgcc/config/i386/cygming-crtend.c @@ -70,12 +70,6 @@ static void register_frame_ctor (void) { __gcc_register_frame (); -#if DEFAULT_USE_CXA_ATEXIT - /* If we use the __cxa_atexit method to register C++ dtors - at object construction, also use atexit to register eh frame - info cleanup. */ - atexit (__gcc_deregister_frame); -#endif } #if !DEFAULT_USE_CXA_ATEXIT diff --git a/libgcc/config/i386/t-cygming b/libgcc/config/i386/t-cygming index d76004c48e5..4713b7f696e 100644 --- a/libgcc/config/i386/t-cygming +++ b/libgcc/config/i386/t-cygming @@ -8,6 +8,9 @@ CUSTOM_CRTSTUFF = yes crtbegin.o: $(srcdir)/config/i386/cygming-crtbegin.c $(crt_compile) -fno-omit-frame-pointer -c $< +crtbeginS.o: $(srcdir)/config/i386/cygming-crtbegin.c + $(crt_compile) -fno-omit-frame-pointer -c $< -DCRTSTUFFS_O + # We intentionally use a implementation-reserved init priority of 0, # so allow the warning. crtend.o: $(srcdir)/config/i386/cygming-crtend.c |