> You're right, not clear why I didn't spot it on Aarch64.  Hunk reverted.

The attached patch replaces it with an ad-hoc definition of setjmp, like the 
ones used for the coverage routines.  Tested on Aarch64/Linux with and without 
--enable-sjlj-exceptions and on IA-64/Linux without --enable-sjlj-exceptions.

Applied on the mainline as obvious.


2017-10-09  Eric Botcazou  <ebotca...@adacore.com>

        * except.c (setjmp_fn): New global variable.
        (init_eh): Initialize it if DONT_USE_BUILTIN_SETJMP is defined.
        (sjlj_emit_function_enter): Call it instead of BUILTIN_SETJMP if
        DONT_USE_BUILTIN_SETJMP is defined.

-- 
Eric Botcazou
Index: except.c
===================================================================
--- except.c	(revision 253530)
+++ except.c	(working copy)
@@ -147,7 +147,9 @@ along with GCC; see the file COPYING3.
 
 static GTY(()) int call_site_base;
 
-static GTY (()) hash_map<tree_hash, tree> *type_to_runtime_map;
+static GTY(()) hash_map<tree_hash, tree> *type_to_runtime_map;
+
+static GTY(()) tree setjmp_fn;
 
 /* Describe the SjLj_Function_Context structure.  */
 static GTY(()) tree sjlj_fc_type_node;
@@ -331,6 +333,16 @@ init_eh (void)
       sjlj_fc_jbuf_ofs
 	= (tree_to_uhwi (DECL_FIELD_OFFSET (f_jbuf))
 	   + tree_to_uhwi (DECL_FIELD_BIT_OFFSET (f_jbuf)) / BITS_PER_UNIT);
+
+#ifdef DONT_USE_BUILTIN_SETJMP
+      tmp = build_function_type_list (integer_type_node, TREE_TYPE (f_jbuf),
+				      NULL);
+      setjmp_fn = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
+			      get_identifier ("setjmp"), tmp);
+      TREE_PUBLIC (setjmp_fn) = 1;
+      DECL_EXTERNAL (setjmp_fn) = 1;
+      DECL_ASSEMBLER_NAME (setjmp_fn);
+#endif
     }
 }
 
@@ -1176,8 +1188,7 @@ sjlj_emit_function_enter (rtx_code_label
       addr = convert_memory_address (ptr_mode, addr);
       tree addr_tree = make_tree (ptr_type_node, addr);
 
-      tree fn = builtin_decl_implicit (BUILT_IN_SETJMP);
-      tree call_expr = build_call_expr (fn, 1, addr_tree);
+      tree call_expr = build_call_expr (setjmp_fn, 1, addr_tree);
       rtx x = expand_call (call_expr, NULL_RTX, false);
 
       emit_cmp_and_jump_insns (x, const0_rtx, NE, 0,

Reply via email to