aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2017-10-07 22:17:16 +0000
committerEric Botcazou <ebotcazou@adacore.com>2017-10-07 22:17:16 +0000
commit187bc68009741539fb981904b8548712ac7f9e8d (patch)
treed5420a2ce2b9fcdfc0cbfa310180030dd78052d0 /gcc
parentb20665086c98e6b2004d0c2a3c9494dd9b6525eb (diff)
* builtins.def (BUILT_IN_SETJMP): Declare as library builtin instead
of GCC builtin if DONT_USE_BUILTIN_SETJMP is defined. * except.c (sjlj_emit_function_enter): If DONT_USE_BUILTIN_SETJMP is defined, force the creation of a new block for a dispatch label. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@253515 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/builtins.def4
-rw-r--r--gcc/except.c22
3 files changed, 33 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5eea63106de..c12028bfca2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2017-10-07 Eric Botcazou <ebotcazou@adacore.com>
+
+ * builtins.def (BUILT_IN_SETJMP): Declare as library builtin instead
+ of GCC builtin if DONT_USE_BUILTIN_SETJMP is defined.
+ * except.c (sjlj_emit_function_enter): If DONT_USE_BUILTIN_SETJMP is
+ defined, force the creation of a new block for a dispatch label.
+
2017-10-07 Jan Hubicka <hubicka@ucw.cz>
* invoke.texi (Wsuggest-attribute=cold): Document.
diff --git a/gcc/builtins.def b/gcc/builtins.def
index 1c1efceea21..2c539645928 100644
--- a/gcc/builtins.def
+++ b/gcc/builtins.def
@@ -890,7 +890,11 @@ DEF_LIB_BUILTIN (BUILT_IN_REALLOC, "realloc", BT_FN_PTR_PTR_SIZE, ATTR_AL
DEF_GCC_BUILTIN (BUILT_IN_RETURN, "return", BT_FN_VOID_PTR, ATTR_NORETURN_NOTHROW_LEAF_LIST)
DEF_GCC_BUILTIN (BUILT_IN_RETURN_ADDRESS, "return_address", BT_FN_PTR_UINT, ATTR_LEAF_LIST)
DEF_GCC_BUILTIN (BUILT_IN_SAVEREGS, "saveregs", BT_FN_PTR_VAR, ATTR_NULL)
+#ifdef DONT_USE_BUILTIN_SETJMP
+DEF_LIB_BUILTIN (BUILT_IN_SETJMP, "setjmp", BT_FN_INT_PTR, ATTR_RT_NOTHROW_LEAF_LIST)
+#else
DEF_GCC_BUILTIN (BUILT_IN_SETJMP, "setjmp", BT_FN_INT_PTR, ATTR_RT_NOTHROW_LEAF_LIST)
+#endif
DEF_EXT_LIB_BUILTIN (BUILT_IN_STRFMON, "strfmon", BT_FN_SSIZE_STRING_SIZE_CONST_STRING_VAR, ATTR_FORMAT_STRFMON_NOTHROW_3_4)
DEF_LIB_BUILTIN (BUILT_IN_STRFTIME, "strftime", BT_FN_SIZE_STRING_SIZE_CONST_STRING_CONST_TM_PTR, ATTR_FORMAT_STRFTIME_NOTHROW_3_0)
DEF_GCC_BUILTIN (BUILT_IN_TRAP, "trap", BT_FN_VOID, ATTR_NORETURN_NOTHROW_LEAF_COLD_LIST)
diff --git a/gcc/except.c b/gcc/except.c
index 10b5a7c7cd0..4991e7bb01b 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -1209,6 +1209,28 @@ sjlj_emit_function_enter (rtx_code_label *dispatch_label)
fn_begin_outside_block = false;
}
+#ifdef DONT_USE_BUILTIN_SETJMP
+ if (dispatch_label)
+ {
+ /* The sequence contains a branch in the middle so we need to force
+ the creation of a new basic block by means of BB_SUPERBLOCK. */
+ if (fn_begin_outside_block)
+ {
+ basic_block bb
+ = split_edge (single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
+ if (JUMP_P (BB_END (bb)))
+ emit_insn_before (seq, BB_END (bb));
+ else
+ emit_insn_after (seq, BB_END (bb));
+ }
+ else
+ emit_insn_after (seq, fn_begin);
+
+ single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun))->flags |= BB_SUPERBLOCK;
+ return;
+ }
+#endif
+
if (fn_begin_outside_block)
insert_insn_on_edge (seq, single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
else