* 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
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.
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);
case LCT_ALWAYS_RETURN:
flags = ECF_ALWAYS_RETURN;
break;
+ case LCT_RETURNS_TWICE:
+ flags = ECF_RETURNS_TWICE;
+ break;
}
fun = orgfun;
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. */
#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);
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,
#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