From 4417887978f491e497451598d0b596af3fe62b8c Mon Sep 17 00:00:00 2001 From: David Edelsohn Date: Sat, 23 Nov 2013 10:38:07 -0500 Subject: re PR target/33704 (AIX runs c++ constructors in incorrect order) libgcc: PR target/33704 * config/rs6000/aixinitfini.c: New file. * config/rs6000/t-aix-cxa (LIB2ADD_ST): Add aixinitfini.c. * config/rs6000/libgcc-aix-cxa.ver (GCC_4.9): Add libgcc initfini symbols. gcc: PR target/33704 * config/rs6000/aix.h (COLLECT_SHARED_INIT_FUNC): Define. (COLLECT_SHARED_FINI_FUNC): Define. * collect2.c (aix_shared_initname): Declare. (aix_shared_fininame): Declare. (symkind): Add SYM_AIXI and SYM_AIXD. (scanfilter_masks): Add SCAN_AIXI and SCAN_AIXD. (struct names special): Add GLOBAL__AIXI_ and GLOBAL__AIXD_. (aixlazy_flag): Parse. (extract_init_priority): SYM_AIXI and SYM_AIXD have highest priority. (scan_prog_file, COFF): Handle SYM_AIXI and SYM_AIXD. Co-Authored-By: Andrew Dixie From-SVN: r205309 --- libgcc/ChangeLog | 9 +++++++++ libgcc/config/rs6000/aixinitfini.c | 33 +++++++++++++++++++++++++++++++++ libgcc/config/rs6000/libgcc-aix-cxa.ver | 5 +++++ libgcc/config/rs6000/t-aix-cxa | 2 ++ 4 files changed, 49 insertions(+) create mode 100644 libgcc/config/rs6000/aixinitfini.c (limited to 'libgcc') diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index a3521da..1e7731a 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,12 @@ +2013-11-23 David Edelson + Andrew Dixie + + PR target/33704 + * config/rs6000/aixinitfini.c: New file. + * config/rs6000/t-aix-cxa (LIB2ADD_ST): Add aixinitfini.c. + * config/rs6000/libgcc-aix-cxa.ver (GCC_4.9): Add libgcc initfini + symbols. + 2013-11-22 Yuri Rumyantsev * config/i386/cpuinfo.c (get_intel_cpu): Add Silvermont cases. diff --git a/libgcc/config/rs6000/aixinitfini.c b/libgcc/config/rs6000/aixinitfini.c new file mode 100644 index 0000000..e955758 --- /dev/null +++ b/libgcc/config/rs6000/aixinitfini.c @@ -0,0 +1,33 @@ +/* FIXME: rename this file */ + +/* + Artificially create _GLOBAL_AIX[ID]_shr_o symbols in libgcc.a. + + This means that libstdc++.a can invoke these symbols and they are resolved + regardless of whether libstdc++.a is linked against libgcc_s.a or libgcc.a. + + The symbols are created in libgcc_s.a by collect2 as there are exception + frames to register for LIB2_DIVMOD_FUNCS. + + The symbols are NOT created by collect2 for libgcc.a, because libgcc.a is + a 'real' archive containing objects and collect2 is not invoked. + + libstdc++.a is linked against libgcc.a when handling the command line + options '-static-libgcc -static-libstdc++'. +*/ + +void _GLOBAL__AIXI_shr_o (void); +void _GLOBAL__AIXD_shr_o (void); + +void +_GLOBAL__AIXI_shr_o (void) +{ + return; +} + +void +_GLOBAL__AIXD_shr_o (void) +{ + return; +} + diff --git a/libgcc/config/rs6000/libgcc-aix-cxa.ver b/libgcc/config/rs6000/libgcc-aix-cxa.ver index 083067d..f89df23 100644 --- a/libgcc/config/rs6000/libgcc-aix-cxa.ver +++ b/libgcc/config/rs6000/libgcc-aix-cxa.ver @@ -2,3 +2,8 @@ GCC_4.8 { __cxa_atexit __cxa_finalize } + +GCC_4.9 { + _GLOBAL__AIXI_shr_o + _GLOBAL__AIXD_shr_o +} diff --git a/libgcc/config/rs6000/t-aix-cxa b/libgcc/config/rs6000/t-aix-cxa index 4ef8185..4755c20 100644 --- a/libgcc/config/rs6000/t-aix-cxa +++ b/libgcc/config/rs6000/t-aix-cxa @@ -1,6 +1,8 @@ LIB2ADDEH += $(srcdir)/config/rs6000/cxa_atexit.c \ $(srcdir)/config/rs6000/cxa_finalize.c +LIB2ADD_ST += $(srcdir)/config/rs6000/aixinitfini.c + SHLIB_MAPFILES += $(srcdir)/config/rs6000/libgcc-aix-cxa.ver crtcxa.o: $(srcdir)/config/rs6000/crtcxa.c -- cgit v1.1