libgcc2.c (__eh_ffetmnpc): Add support for machines that cannot access globals after...
authorMike Stump <mrs@gcc.gnu.org>
Fri, 6 Jun 1997 23:18:36 +0000 (23:18 +0000)
committerMike Stump <mrs@gcc.gnu.org>
Fri, 6 Jun 1997 23:18:36 +0000 (23:18 +0000)
* libgcc2.c (__eh_ffetmnpc): Add support for machines that cannot
access globals after throw's epilogue when -fno-sjlj-exceptions is
used.
* rs6000.c (DONT_ACCESS_GBLS_AFTER_EPILOGUE): Likewise.
* mips.h (DONT_ACCESS_GBLS_AFTER_EPILOGUE): Likewise.
(INITIAL_ELIMINATION_OFFSET): Fix RETURN_ADDRESS_POINTER_REGNUM
for 64 bit words, with 32 bit pointers and variable endianness.
Fixes throwing across shared library lines (useful at times on mips and rs6000)

From-SVN: r14168

gcc/config/mips/mips.h
gcc/config/rs6000/rs6000.h
gcc/libgcc2.c

index 3ae6e9a99f71be61893aecee27d90d9e2c2760fc..f1e985a2ab578932d13b065c32e2e1ca2dc5444b 100644 (file)
@@ -1966,7 +1966,9 @@ extern struct mips_frame_info current_frame_info;
   else if ((FROM) == RETURN_ADDRESS_POINTER_REGNUM                      \
           && ((TO) == FRAME_POINTER_REGNUM                              \
               || (TO) == STACK_POINTER_REGNUM))                         \
-    (OFFSET) = current_frame_info.gp_sp_offset;                                 \
+    (OFFSET) = current_frame_info.gp_sp_offset                          \
+              + ((UNITS_PER_WORD - (POINTER_SIZE / BITS_PER_UNIT))      \
+                 * (BYTES_BIG_ENDIAN != 0));                            \
   else                                                                  \
     abort ();                                                           \
 }
@@ -4047,3 +4049,8 @@ while (0)
 #define NO_BUILTIN_PTRDIFF_TYPE
 #define PTRDIFF_TYPE (TARGET_LONG64 ? "long int" : "int")
 #endif
+
+/* See mips_expand_prologue's use of loadgp for when this should be
+   true.  */
+
+#define DONT_ACCESS_GBLS_AFTER_EPILOGUE (TARGET_ABICALLS && mips_abi != ABI_32)
index 3071726ab5ed0faffd2ad2809473e2c6589cf373..f469061a0d8bf9f58d261560167cd4aca5fe0f2a 100644 (file)
@@ -3126,3 +3126,7 @@ extern int rs6000_valid_type_attribute_p ();
 extern void rs6000_set_default_type_attributes ();
 extern struct rtx_def *rs6000_dll_import_ref ();
 extern struct rtx_def *rs6000_longcall_ref ();
+
+/* See nonlocal_goto_receiver for when this must be set.  */
+
+#define DONT_ACCESS_GBLS_AFTER_EPILOGUE (TARGET_TOC && TARGET_MINIMAL_TOC)
index 0d53b104b6707fd277ce65732345fb48af5805ed..c32a7e03fa26d1ea45a784e10e0cb695555598a4 100644 (file)
@@ -3436,6 +3436,16 @@ __throw ()
 
 void *__eh_pc;
 
+/* See expand_builtin_throw for details.  */
+
+void **__eh_ffetmnpc () {
+  static void *buf[2] = {
+    &__find_first_exception_table_match,
+    &__eh_pc
+  };
+  return buf;
+}
+
 void
 __empty ()
 {