Browse Source

gcc: Generate code that aborts when `starpu_init' fails.

* gcc-plugin/src/starpu.c (handle_pragma_initialize): Check the return
  code of `starpu_init' and abort when it's non-zero.
Ludovic Courtès 13 years ago
parent
commit
ff11a9dfc3
1 changed files with 28 additions and 1 deletions
  1. 28 1
      gcc-plugin/src/starpu.c

+ 28 - 1
gcc-plugin/src/starpu.c

@@ -440,10 +440,37 @@ handle_pragma_initialize (struct cpp_reader *reader)
   static tree init_fn;
   static tree init_fn;
   LOOKUP_STARPU_FUNCTION (init_fn, "starpu_init");
   LOOKUP_STARPU_FUNCTION (init_fn, "starpu_init");
 
 
+  location_t loc = cpp_peek_token (reader, 0)->src_loc;
+
   /* Call `starpu_init (NULL)'.  */
   /* Call `starpu_init (NULL)'.  */
   tree init = build_call_expr (init_fn, 1, build_zero_cst (ptr_type_node));
   tree init = build_call_expr (init_fn, 1, build_zero_cst (ptr_type_node));
 
 
-  add_stmt (init);
+  /* Introduce a local variable to hold the error code.  */
+
+  tree error_var = build_decl (loc, VAR_DECL,
+  			       create_tmp_var_name (".initialize_error"),
+  			       integer_type_node);
+  DECL_CONTEXT (error_var) = current_function_decl;
+  DECL_ARTIFICIAL (error_var) = true;
+
+  tree assignment = build2 (INIT_EXPR, TREE_TYPE (error_var),
+			    error_var, init);
+
+  tree cond = build3 (COND_EXPR, void_type_node,
+		      build2 (NE_EXPR, boolean_type_node,
+			      error_var, integer_zero_node),
+		      build_error_statements (loc, error_var,
+					      "failed to initialize StarPU"), 
+		      NULL_TREE);
+
+  tree stmts = NULL_TREE;
+  append_to_statement_list (assignment, &stmts);
+  append_to_statement_list (cond, &stmts);
+
+  tree bind = build3 (BIND_EXPR, void_type_node, error_var, stmts,
+  		      NULL_TREE);
+
+  add_stmt (bind);
 }
 }
 
 
 /* Process `#pragma starpu shutdown'.  */
 /* Process `#pragma starpu shutdown'.  */