Patchwork [fortran] add __builtin_unreachable

login
register
mail settings
Submitter Jan Hubicka
Date Oct. 16, 2012, 3:23 p.m.
Message ID <20121016152340.GA8724@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/191819/
State New
Headers show

Comments

Jan Hubicka - Oct. 16, 2012, 3:23 p.m.
Hi,
this patch add __buliltin_unreachable to Fortran FE and also cleans up the code a bit

Bootstrapped/regtested x86_64-linux, OK?
Honza

	* f95-lang.c (gfc_define_builtin): Use set_call_expr_flags.
	(ATTR_NOTHROW_LEAF_MALLOC_LIST,
	ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST): New lists.
	(gfc_init_builtin_functions): Add __builtin_unreachable;
	tidy malloc/calloc.

	* calls.c (set_call_expr_flags): New.
	* tree.h (set_call_expr_flags): Declare.
aldot - Oct. 16, 2012, 3:43 p.m.
Hi,

s/imlpies/implied/


Sent with AquaMail for Android
http://www.aqua-mail.com
Tobias Burnus - Oct. 17, 2012, 1:27 p.m.
Jan Hubicka wrote:
> this patch add __buliltin_unreachable to Fortran FE and also cleans up the code a bit
>
> Bootstrapped/regtested x86_64-linux, OK?

The Fortran part looks okay.

> 	* f95-lang.c (gfc_define_builtin): Use set_call_expr_flags.
> 	(ATTR_NOTHROW_LEAF_MALLOC_LIST,
> 	ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST): New lists.
> 	(gfc_init_builtin_functions): Add __builtin_unreachable;
> 	tidy malloc/calloc.
>
> 	* calls.c (set_call_expr_flags): New.
> 	* tree.h (set_call_expr_flags): Declare.

Tobias

Patch

Index: fortran/f95-lang.c
===================================================================
--- fortran/f95-lang.c	(revision 192483)
+++ fortran/f95-lang.c	(working copy)
@@ -535,9 +535,11 @@  gfc_builtin_function (tree decl)
 
 /* So far we need just these 4 attribute types.  */
 #define ATTR_NOTHROW_LEAF_LIST		(ECF_NOTHROW | ECF_LEAF)
+#define ATTR_NOTHROW_LEAF_MALLOC_LIST	(ECF_NOTHROW | ECF_LEAF | ECF_MALLOC)
 #define ATTR_CONST_NOTHROW_LEAF_LIST	(ECF_NOTHROW | ECF_LEAF | ECF_CONST)
 #define ATTR_NOTHROW_LIST		(ECF_NOTHROW)
 #define ATTR_CONST_NOTHROW_LIST		(ECF_NOTHROW | ECF_CONST)
+#define ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST (ECF_CONST | ECF_NOTHROW | ECF_LEAF | ECF_NORETURN)
 
 static void
 gfc_define_builtin (const char *name, tree type, enum built_in_function code,
@@ -547,13 +550,7 @@  gfc_define_builtin (const char *name, tr
 
   decl = add_builtin_function (name, type, code, BUILT_IN_NORMAL,
 			       library_name, NULL_TREE);
-  if (attr & ECF_CONST)
-    TREE_READONLY (decl) = 1;
-  if (attr & ECF_NOTHROW)
-    TREE_NOTHROW (decl) = 1;
-  if (attr & ECF_LEAF)
-    DECL_ATTRIBUTES (decl) = tree_cons (get_identifier ("leaf"),
-					NULL, DECL_ATTRIBUTES (decl));
+  set_call_expr_flags (decl, attr);
 
   set_builtin_decl (code, decl, true);
 }
@@ -908,6 +905,11 @@  gfc_init_builtin_functions (void)
   gfc_define_builtin ("__builtin_expect", ftype, BUILT_IN_EXPECT,
 		      "__builtin_expect", ATTR_CONST_NOTHROW_LEAF_LIST);
 
+  ftype = build_function_type_list (void_type_node, NULL_TREE);
+
+  gfc_define_builtin ("__builtin_unreachable", ftype, BUILT_IN_UNREACHABLE,
+		      "__builtin_unreachable", ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST);
+
   ftype = build_function_type_list (void_type_node,
                                     pvoid_type_node, NULL_TREE);
   gfc_define_builtin ("__builtin_free", ftype, BUILT_IN_FREE,
@@ -916,14 +918,12 @@  gfc_init_builtin_functions (void)
   ftype = build_function_type_list (pvoid_type_node,
                                     size_type_node, NULL_TREE);
   gfc_define_builtin ("__builtin_malloc", ftype, BUILT_IN_MALLOC,
-		      "malloc", ATTR_NOTHROW_LEAF_LIST);
-  DECL_IS_MALLOC (builtin_decl_explicit (BUILT_IN_MALLOC)) = 1;
+		      "malloc", ATTR_NOTHROW_LEAF_MALLOC_LIST);
 
   ftype = build_function_type_list (pvoid_type_node, size_type_node,
 				    size_type_node, NULL_TREE);
   gfc_define_builtin ("__builtin_calloc", ftype, BUILT_IN_CALLOC,
-		      "calloc", ATTR_NOTHROW_LEAF_LIST);
-  DECL_IS_MALLOC (builtin_decl_explicit (BUILT_IN_CALLOC)) = 1;
+		      "calloc", ATTR_NOTHROW_LEAF_MALLOC_LIST);
 
   ftype = build_function_type_list (pvoid_type_node,
                                     size_type_node, pvoid_type_node,
Index: calls.c
===================================================================
--- calls.c	(revision 192483)
+++ calls.c	(working copy)
@@ -802,6 +802,36 @@  call_expr_flags (const_tree t)
   return flags;
 }
 
+/* Modify DECL for given flags.  */
+void
+set_call_expr_flags (tree decl, int flags)
+{
+  if (flags & ECF_NOTHROW)
+    TREE_NOTHROW (decl) = 1;
+  if (flags & ECF_CONST)
+    TREE_READONLY (decl) = 1;
+  if (flags & ECF_PURE)
+    DECL_PURE_P (decl) = 1;
+  if (flags & ECF_NOVOPS)
+    DECL_IS_NOVOPS (decl) = 1;
+  if (flags & ECF_NORETURN)
+    TREE_THIS_VOLATILE (decl) = 1;
+  if (flags & ECF_MALLOC)
+    DECL_IS_MALLOC (decl) = 1;
+  if (flags & ECF_RETURNS_TWICE)
+    DECL_IS_RETURNS_TWICE (decl) = 1;
+  if (flags & ECF_LEAF)
+    DECL_ATTRIBUTES (decl) = tree_cons (get_identifier ("leaf"),
+					NULL, DECL_ATTRIBUTES (decl));
+  if (flags & ECF_TM_PURE)
+    DECL_ATTRIBUTES (decl) = tree_cons (get_identifier ("transaction_pure"),
+					NULL, DECL_ATTRIBUTES (decl));
+  /* Looping const or pure is imlpies by noreturn.
+     There is currently no way to declare looping const or looping pure alone.  */
+  gcc_assert (!(flags & ECF_LOOPING_CONST_OR_PURE)
+	      || ((flags & ECF_NORETURN) && (flags & (ECF_CONST | ECF_PURE))));
+}
+
 /* Precompute all register parameters as described by ARGS, storing values
    into fields within the ARGS array.
 
Index: tree.h
===================================================================
--- tree.h	(revision 192483)
+++ tree.h	(working copy)
@@ -6025,6 +6025,7 @@  extern tree build_duplicate_type (tree);
 
 extern int flags_from_decl_or_type (const_tree);
 extern int call_expr_flags (const_tree);
+extern void set_call_expr_flags (tree, int);
 
 /* Call argument flags.  */