aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>2014-02-04 09:31:38 +0000
committerRainer Orth <ro@gcc.gnu.org>2014-02-04 09:31:38 +0000
commit91da04811259e454dadc9c828024b1548030bd91 (patch)
tree3c9e610ec87b3a7318d5a7e71a84a3cb76aae8c6
parentf8e162b710b64582e4d55ccfcb25e20003567e01 (diff)
downloadgcc-91da04811259e454dadc9c828024b1548030bd91.zip
gcc-91da04811259e454dadc9c828024b1548030bd91.tar.gz
gcc-91da04811259e454dadc9c828024b1548030bd91.tar.bz2
Ensure libgcc_s unwinder is always used on 64-bit Solaris 10+/x86 (PR target/59788)
gcc: PR target/59788 * config/sol2.h (LINK_LIBGCC_MAPFILE_SPEC): Define. (LINK_SPEC): Use it for -shared, -shared-libgcc. libgcc: PR target/59788 * config/t-slibgcc-sld (libgcc-unwind.map): New target. (install-libgcc-unwind-map-forbuild): New target. (all): Depend on install-libgcc-unwind-map-forbuild. (install-libgcc-unwind-map): New target. (install): Depend on install-libgcc-unwind-map. gcc/testsuite: PR target/59788 * g++.dg/eh/unwind-direct.C: New test. toplevel: PR target/59788 * ltmain.sh (opt_duplicate_compiler_generated_deps): Enable on *solaris2*. From-SVN: r207454
-rw-r--r--ChangeLog6
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/sol2.h11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/eh/unwind-direct.C15
-rw-r--r--libgcc/ChangeLog9
-rw-r--r--libgcc/config/t-slibgcc-sld23
-rw-r--r--ltmain.sh2
8 files changed, 75 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 7e90e09..cc302ab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2014-02-04 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ PR target/59788
+ * ltmain.sh (opt_duplicate_compiler_generated_deps): Enable on
+ *solaris2*.
+
2014-01-21 John David Anglin <danglin@gcc.gnu.org>
* MAINTAINERS: Update my email address.
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 237ec96..cd8acae 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-02-04 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ PR target/59788
+ * config/sol2.h (LINK_LIBGCC_MAPFILE_SPEC): Define.
+ (LINK_SPEC): Use it for -shared, -shared-libgcc.
+
2014-02-03 Jan Hubicka <hubicka@ucw.cz>
PR ipa/59882
diff --git a/gcc/config/sol2.h b/gcc/config/sol2.h
index a023cfe..2a657db 100644
--- a/gcc/config/sol2.h
+++ b/gcc/config/sol2.h
@@ -174,12 +174,21 @@ along with GCC; see the file COPYING3. If not see
#define RDYNAMIC_SPEC "--export-dynamic"
#endif
+#ifndef USE_GLD
+/* With Sun ld, use mapfile to enforce direct binding to libgcc_s unwinder. */
+#define LINK_LIBGCC_MAPFILE_SPEC \
+ "%{shared|shared-libgcc:-M %slibgcc-unwind.map}"
+#else
+/* GNU ld doesn't support direct binding. */
+#define LINK_LIBGCC_MAPFILE_SPEC ""
+#endif
+
#undef LINK_SPEC
#define LINK_SPEC \
"%{h*} %{v:-V} \
%{!shared:%{!static:%{rdynamic: " RDYNAMIC_SPEC "}}} \
%{static:-dn -Bstatic} \
- %{shared:-G -dy %{!mimpure-text:-z text}} \
+ %{shared:-G -dy %{!mimpure-text:-z text}} " LINK_LIBGCC_MAPFILE_SPEC " \
%{symbolic:-Bsymbolic -G -dy -z text} \
%(link_arch) \
%{Qy:} %{!Qn:-Qy}"
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 66adf75..3c7682f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-02-04 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ PR target/59788
+ * g++.dg/eh/unwind-direct.C: New test.
+
2014-02-04 Uros Bizjak <ubizjak@gmail.com>
* lib/tsan-dg.exp (tsan_init): Set trivial testcase
diff --git a/gcc/testsuite/g++.dg/eh/unwind-direct.C b/gcc/testsuite/g++.dg/eh/unwind-direct.C
new file mode 100644
index 0000000..8d2cd77
--- /dev/null
+++ b/gcc/testsuite/g++.dg/eh/unwind-direct.C
@@ -0,0 +1,15 @@
+// PR target/59788
+// { dg-do run { target { *-*-solaris2* && { ! gld } } } }
+// { dg-options "-Wl,-Bdirect" }
+
+#include <stdexcept>
+
+int
+main(void)
+{
+ try
+ { throw std::runtime_error( "Catch me if you can!"); }
+ catch(...)
+ { return 0; }
+ return 1;
+}
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 3186d06..f561edd 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,12 @@
+2014-02-04 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ PR target/59788
+ * config/t-slibgcc-sld (libgcc-unwind.map): New target.
+ (install-libgcc-unwind-map-forbuild): New target.
+ (all): Depend on install-libgcc-unwind-map-forbuild.
+ (install-libgcc-unwind-map): New target.
+ (install): Depend on install-libgcc-unwind-map.
+
2014-02-02 Sandra Loosemore <sandra@codesourcery.com>
* config/nios2/crti.S (_init): Initialize GOT pointer from
diff --git a/libgcc/config/t-slibgcc-sld b/libgcc/config/t-slibgcc-sld
index 1787000..ec6e5db 100644
--- a/libgcc/config/t-slibgcc-sld
+++ b/libgcc/config/t-slibgcc-sld
@@ -3,3 +3,26 @@
SHLIB_LDFLAGS = -Wl,-h,$(SHLIB_SONAME) -Wl,-z,text -Wl,-z,defs \
-Wl,-M,$(SHLIB_MAP)
+
+# Linker mapfile to enforce direct binding to libgcc_s unwinder
+# (PR target/59788).
+libgcc-unwind.map: libgcc-std.ver
+ @(echo "{"; \
+ for f in `grep _Unwind_ $< | sort`; do \
+ echo " $$f = EXTERN DIRECT;"; \
+ done; \
+ echo "};" ) > $@
+
+# Copy libgcc-unwind.map to the place where gcc will look for it at build-time.
+install-libgcc-unwind-map-forbuild: libgcc-unwind.map
+ dest=$(gcc_objdir)/tmp$$$$-$<; \
+ cp $< $$dest; \
+ chmod a+r $$dest; \
+ sh $(srcdir)/../move-if-change $$dest $(gcc_objdir)/$<
+
+all: install-libgcc-unwind-map-forbuild
+
+install-libgcc-unwind-map: libgcc-unwind.map
+ $(INSTALL_DATA) $< $(DESTDIR)$(slibdir)
+
+install: install-libgcc-unwind-map
diff --git a/ltmain.sh b/ltmain.sh
index a03433f..9503ec8 100644
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -976,7 +976,7 @@ func_enable_tag ()
case $host in
- *cygwin* | *mingw* | *pw32* | *cegcc*)
+ *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* )
# don't eliminate duplications in $postdeps and $predeps
opt_duplicate_compiler_generated_deps=:
;;