]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Ensure libgcc_s unwinder is always used on 64-bit Solaris 10+/x86 (PR target/59788)
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Tue, 4 Feb 2014 09:31:38 +0000 (09:31 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Tue, 4 Feb 2014 09:31:38 +0000 (09:31 +0000)
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

ChangeLog
gcc/ChangeLog
gcc/config/sol2.h
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/eh/unwind-direct.C [new file with mode: 0644]
libgcc/ChangeLog
libgcc/config/t-slibgcc-sld
ltmain.sh

index 7e90e0968e1aa2c793568ca20a4eec4007952ffd..cc302ab5d297b9d3dd196b975a18d0270e5310b0 100644 (file)
--- 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.
index 237ec964e48654035a34d9ba2ae16588ecaffaf9..cd8acae396d7a04bfb3e676e45ca230190e306f1 100644 (file)
@@ -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
index a023cfed0d9f574d45ee62cbd589a2f79155241f..2a657db59c15ed51b6e11203f5ff37dbdff0b615 100644 (file)
@@ -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}"
index 66adf758dc4154f500983893e157945ffd71b6d6..3c7682fad50a20a927f0aca52c8c2c1eb7834acc 100644 (file)
@@ -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 (file)
index 0000000..8d2cd77
--- /dev/null
@@ -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;
+}
index 3186d069dec698caf9c0af922e4b0f2c431b6937..f561edd227470ee40257045e21f2380ac7cbf916 100644 (file)
@@ -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
index 178700047cc770625c2bdfb96f42c37fc867b265..ec6e5db0a3bc353175e86ebbdb52c71e7526fe66 100644 (file)
@@ -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
index a03433f178941e5be51c26d8ef35957e245693f1..9503ec85d709d8f7fdad222ef3c4d8d85fdc6cd1 100644 (file)
--- 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=:
       ;;