OSDN Git Service

* rtl.h (LCT_RETURNS_TWICE): New.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 21 Sep 2001 20:26:44 +0000 (20:26 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 21 Sep 2001 20:26:44 +0000 (20:26 +0000)
        * calls.c (emit_call_1): Set current_function_calls_setjmp for
        ECF_RETURNS_TWICE.
        (emit_library_call_value_1): Map LCT_RETURNS_TWICE
        to ECF_RETURNS_TWICE.
        * except.c (sjlj_emit_function_enter): Use LCT_RETURNS_TWICE for
        call to setjmp.

        * unwind-sjlj.c: Invent the setjmp.h declarations if inhibit_libc.

        * config/stormy16/stormy16.h (DONT_USE_BUILTIN_SETJMP): New.
        (JMP_BUF_SIZE): New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45736 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/calls.c
gcc/config/stormy16/stormy16.h
gcc/except.c
gcc/rtl.h
gcc/unwind-sjlj.c

index 99fff49..414effb 100644 (file)
@@ -1,5 +1,20 @@
 2001-09-21  Richard Henderson  <rth@redhat.com>
 
+       * rtl.h (LCT_RETURNS_TWICE): New.
+       * calls.c (emit_call_1): Set current_function_calls_setjmp for
+       ECF_RETURNS_TWICE.
+       (emit_library_call_value_1): Map LCT_RETURNS_TWICE
+       to ECF_RETURNS_TWICE.
+       * except.c (sjlj_emit_function_enter): Use LCT_RETURNS_TWICE for
+       call to setjmp.
+
+       * unwind-sjlj.c: Invent the setjmp.h declarations if inhibit_libc.
+
+       * config/stormy16/stormy16.h (DONT_USE_BUILTIN_SETJMP): New.
+       (JMP_BUF_SIZE): New.
+
+2001-09-21  Richard Henderson  <rth@redhat.com>
+
        * config/stormy16/stormy16.h (REG_CLASS_FROM_LETTER): Map 'd'
        to R8_REGS.
 
index f21160f..f2b1bdb 100644 (file)
@@ -613,8 +613,11 @@ emit_call_1 (funexp, fndecl, funtype, stack_size, rounded_stack_size,
                                               REG_NOTES (call_insn));
 
   if (ecf_flags & ECF_RETURNS_TWICE)
-    REG_NOTES (call_insn) = gen_rtx_EXPR_LIST (REG_SETJMP, const0_rtx,
-                                              REG_NOTES (call_insn));
+    {
+      REG_NOTES (call_insn) = gen_rtx_EXPR_LIST (REG_SETJMP, const0_rtx,
+                                                REG_NOTES (call_insn));
+      current_function_calls_setjmp = 1;
+    }
 
   SIBLING_CALL_P (call_insn) = ((ecf_flags & ECF_SIBCALL) != 0);
 
@@ -3531,6 +3534,9 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p)
     case LCT_ALWAYS_RETURN:
       flags = ECF_ALWAYS_RETURN;
       break;
+    case LCT_RETURNS_TWICE:
+      flags = ECF_RETURNS_TWICE;
+      break;
     }
   fun = orgfun;
 
index 9a62b36..b2e85fa 100644 (file)
@@ -4537,6 +4537,10 @@ do {                                                                     \
    instead of inline unwinders and __unwind_function in the non-setjmp case.  */
 #define DWARF2_UNWIND_INFO 0
 
+/* Don't use __builtin_setjmp for unwinding, since it's tricky to get
+   at the high 16 bits of an address.  */
+#define DONT_USE_BUILTIN_SETJMP
+#define JMP_BUF_SIZE  8
 \f
 /* Assembler Commands for Alignment.  */
 
index 0f0b662..4448610 100644 (file)
@@ -2144,7 +2144,7 @@ sjlj_emit_function_enter (dispatch_label)
 #ifdef DONT_USE_BUILTIN_SETJMP
   {
     rtx x, note;
-    x = emit_library_call_value (setjmp_libfunc, NULL_RTX, LCT_NORMAL,
+    x = emit_library_call_value (setjmp_libfunc, NULL_RTX, LCT_RETURNS_TWICE,
                                 TYPE_MODE (integer_type_node), 1,
                                 plus_constant (XEXP (fc, 0),
                                                sjlj_fc_jbuf_ofs), Pmode);
index 7deb964..d9b9294 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1952,7 +1952,8 @@ enum libcall_type
   LCT_PURE_MAKE_BLOCK = 4,
   LCT_NORETURN = 5,
   LCT_THROW = 6,
-  LCT_ALWAYS_RETURN = 7
+  LCT_ALWAYS_RETURN = 7,
+  LCT_RETURNS_TWICE = 8
 };
 
 extern void emit_library_call          PARAMS ((rtx, enum libcall_type,
index 0f1d8ba..46f30ae 100644 (file)
 #if USING_SJLJ_EXCEPTIONS
 
 #ifdef DONT_USE_BUILTIN_SETJMP
+#ifndef inhibit_libc
 #include <setjmp.h>
 #else
+typedef void *jmp_buf[JMP_BUF_SIZE];
+extern void longjmp(jmp_buf, int) __attribute__((noreturn));
+#endif
+#else
 #define setjmp __builtin_setjmp
 #define longjmp __builtin_longjmp
 #endif