@@ -17,6 +17,13 @@
(cilk_call_setjmp): Replaced implicit_built_in_decls[] to
builtin_decl_implicit ().
+2011-10-04 Balaji V. Iyer <balaji.v.iyer@intel.com>
+
+ * cilk.c (cilk_init_builtins): Added Cilkscreen builtin function
+ declarations.
+ * builtins.def: Added Cilkscreen builtin functions expand tags.
+ * cilk.h: Added Cilkscreen builtin functions in the cilk_trees chain.
+
2011-09-20 Balaji V. Iyer <balaji.v.iyer@intel.com>
* ipa-inline.c(can_inline_edge_p): Added a check for function
@@ -799,13 +799,38 @@ DEF_BUILTIN_STUB (BUILT_IN_EH_FILTER, "__builtin_eh_filter")
DEF_BUILTIN_STUB (BUILT_IN_EH_COPY_VALUES, "__builtin_eh_copy_values")
/* Cilk */
-DEF_BUILTIN_STUB (BUILT_IN_CILK_WORKER_ID, "__cilkrts_current_worker_id")
-DEF_BUILTIN_STUB (BUILT_IN_CILK_WORKER_PTR, "__cilkrts_current_worker")
-DEF_BUILTIN_STUB (BUILT_IN_CILK_DETACH, "__cilkrts_detach")
-DEF_BUILTIN_STUB (BUILT_IN_CILK_SYNCHED, "__cilkrts_synched")
-DEF_BUILTIN_STUB (BUILT_IN_CILK_STOLEN, "__cilkrts_was_stolen")
-DEF_BUILTIN_STUB (BUILT_IN_CILK_ENTER_FRAME, "__cilkrts_enter_frame")
-DEF_BUILTIN_STUB (BUILT_IN_CILK_POP_FRAME, "__cilkrts_pop_frame")
+DEF_BUILTIN_STUB(BUILT_IN_CILK_WORKER_ID, "__cilkrts_current_worker_id")
+DEF_BUILTIN_STUB(BUILT_IN_CILK_WORKER_PTR, "__cilkrts_current_worker")
+DEF_BUILTIN_STUB(BUILT_IN_CILK_DETACH, "__cilkrts_detach")
+DEF_BUILTIN_STUB(BUILT_IN_CILK_SYNCHED, "__cilkrts_synched")
+DEF_BUILTIN_STUB(BUILT_IN_CILK_STOLEN, "__cilkrts_was_stolen")
+DEF_BUILTIN_STUB(BUILT_IN_CILK_ENTER_FRAME, "__cilkrts_enter_frame")
+DEF_BUILTIN_STUB(BUILT_IN_CILK_POP_FRAME, "__cilkrts_pop_frame")
+DEF_BUILTIN_STUB (BUILT_IN_CILK_ENTER_BEGIN, "__cilk_enter_begin")
+DEF_BUILTIN_STUB (BUILT_IN_CILK_ENTER_H_BEGIN, "__cilk_enter_helper_begin")
+DEF_BUILTIN_STUB (BUILT_IN_CILK_ENTER_END, "__cilk_enter_end")
+DEF_BUILTIN_STUB (BUILT_IN_CILK_SPAWN_PREPARE, "__cilk_spawn_prepare")
+DEF_BUILTIN_STUB (BUILT_IN_SPAWN_OR_CONT, "__cilk_spawn_or_continue")
+DEF_BUILTIN_STUB (BUILT_IN_CILK_DETACH_BEGIN, "__cilk_detach_begin")
+DEF_BUILTIN_STUB (BUILT_IN_CILK_DETACH_END, "__cilk_detach_end")
+DEF_BUILTIN_STUB (BUILT_IN_CILK_SYNC_BEGIN, "__cilk_sync_begin")
+DEF_BUILTIN_STUB (BUILT_IN_CILK_SYNC_END, "__cilk_sync_end")
+DEF_BUILTIN_STUB (BUILT_IN_CILK_LEAVE_BEGIN, "__cilk_leave_begin")
+DEF_BUILTIN_STUB (BUILT_IN_CILK_LEAVE_END, "__cilk_leave_end")
+DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_METACALL, "cilkscreen_metacall")
+DEF_BUILTIN_STUB (BUILT_IN_CILK_RESUME, "cilk_resume")
+DEF_BUILTIN_STUB (BUILT_IN_LEAVE_STOLEN, "cilk_leave_stolen")
+DEF_BUILTIN_STUB (BUILT_IN_SYNC_ABANDON, "cilk_sync_abandon")
+DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_DISABLE_INSTR,
+"cilkscreen_disable_instrumentation")
+DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_EN_INSTR,
+"cilkscreen_enable_instrumentation")
+DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_DS_INSTR,
+"cilkscreen_disable_instrumentation")
+DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_DS_CHK, "cilkscreen_disable_checking")
+DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_EN_CHK, "cilkscreen_enable_checking")
+DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_AQUIRE_LOCK, "cilkscreen_aquire_lock")
+DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_REL_LOCK, "cilkscreen_release_lock")
/* Synchronization Primitives. */
#include "sync-builtins.def"
@@ -109,6 +109,13 @@ cilk_init_builtins (void)
tree fptr_fun; /* void(frame *) */
tree frame_pred;
tree s_type_node;
+ tree metacall_frame, metacall_fptr_type, metacall_fields, metacall_fptr_fun;
+ tree metacall_fptr_arglist;
+ tree int_list = tree_cons (NULL_TREE, integer_type_node, NULL_TREE);
+ tree int_fun = build_function_type (void_type_node, int_list);
+ tree ptr_list = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
+ tree ptr_fun = build_function_type (void_type_node, ptr_list);
+ tree void_fun = build_function_type (void_type_node, void_list_node);
/* Make the frame and worker tags first because they reference each other. */
worker = lang_hooks.types.make_type (RECORD_TYPE);
@@ -161,7 +168,34 @@ cilk_init_builtins (void)
cilk_frame_ptr_type_decl = build_qualified_type (fptr_type,
TYPE_QUAL_RESTRICT);
-
+ /*
+ typedef struct __metacall_data_t {
+ unsigned int tool;
+ unsigned int code;
+ void *data;
+ } metacall_data_t;
+ */
+ metacall_frame = lang_hooks.types.make_type (RECORD_TYPE);
+ metacall_fptr_type = build_pointer_type (metacall_frame);
+ metacall_fptr_arglist =
+ tree_cons (NULL_TREE, metacall_fptr_type, void_list_node);
+ metacall_fptr_fun = build_function_type (void_type_node,
+ metacall_fptr_arglist);
+ metacall_fields = NULL_TREE;
+ metacall_fields = add_field ("tool", unsigned_type_node, metacall_fields);
+ cilk_trees[CILK_TI_METACALL_TOOL_FLAGS] = metacall_fields;
+ metacall_fields = add_field ("code", unsigned_type_node, metacall_fields);
+ cilk_trees[CILK_TI_METACALL_CODE_FLAGS] = metacall_fields;
+ metacall_fields = add_field ("data", fptr_type, metacall_fields);
+ cilk_trees[CILK_TI_METACALL_DATA_FLAGS] = metacall_fields;
+ TYPE_ALIGN (metacall_frame) = PREFERRED_STACK_BOUNDARY;
+ TREE_ADDRESSABLE (metacall_frame) = 1;
+ finish_builtin_struct (metacall_frame, "__metacall_data_s", metacall_fields,
+ NULL_TREE);
+ cilk_metacall_frame_type_decl = metacall_frame;
+ lang_hooks.types.register_builtin_type (frame, "__metacall_data_t");
+ cilk_mcall_frame_ptr_type_decl = build_qualified_type (metacall_fptr_type,
+ TYPE_QUAL_RESTRICT);
/* object could be named __cilk_frame_var for compatibility */
fptr_v_type = build_qualified_type (fptr_type, TYPE_QUAL_VOLATILE);
@@ -303,6 +337,52 @@ cilk_init_builtins (void)
worker_tail_offset = tree_low_cst (off1, 0) +
tree_low_cst (off2, 0) / BITS_PER_UNIT;
}
+
+ cilk_enter_begin_fndecl = install_builtin ("__cilk_enter_begin", fptr_fun,
+ BUILT_IN_CILK_ENTER_BEGIN, true);
+ cilk_enter_h_begin_fndecl = install_builtin
+ ("cilk_enter_helper_begin", fptr_fun, BUILT_IN_CILK_ENTER_H_BEGIN, true);
+ cilk_enter_end_fndecl = install_builtin ("__cilk_enter_end", fptr_fun,
+ BUILT_IN_CILK_ENTER_END, true);
+ cilk_spawn_prepare_fndecl = install_builtin
+ ("__cilk_spawn_prepare", fptr_fun, BUILT_IN_CILK_SPAWN_PREPARE, true);
+ cilk_spawn_or_cont_fndecl = install_builtin
+ ("__cilk_spawn_or_continue", int_fun, BUILT_IN_SPAWN_OR_CONT, true);
+ cilk_detach_begin_fndecl = install_builtin ("__cilk_detach_begin", fptr_fun,
+ BUILT_IN_CILK_DETACH_BEGIN, true);
+ cilk_detach_end_fndecl = install_builtin ("__cilk_detach_end", void_fun,
+ BUILT_IN_CILK_DETACH_END, true);
+ cilk_sync_begin_fndecl = install_builtin ("__cilk_sync_begin", fptr_fun,
+ BUILT_IN_CILK_SYNC_BEGIN, true);
+ cilk_sync_end_fndecl = install_builtin ("__cilk_sync_end", fptr_fun,
+ BUILT_IN_CILK_SYNC_END, true);
+ cilk_leave_begin_fndecl = install_builtin ("__cilk_leave_begin", fptr_fun,
+ BUILT_IN_CILK_LEAVE_BEGIN, true);
+ cilk_leave_end_fndecl = install_builtin ("__cilk_leave_end", void_fun,
+ BUILT_IN_CILK_LEAVE_END, true);
+ cilkscreen_metacall_fndecl = install_builtin
+ ("__cilkscreen_metacall", metacall_fptr_fun, BUILT_IN_CILKSCREEN_METACALL,
+ true);
+ cilk_resume_fndecl = install_builtin
+ ("cilk_resume", fptr_fun, BUILT_IN_CILK_RESUME, true);
+ cilk_leave_stolen_fndecl = install_builtin
+ ("cilk_leave_stolen", void_fun, BUILT_IN_LEAVE_STOLEN, true);
+ cilk_sync_abandon_fndecl = install_builtin ("cilk_sync_abandon", void_fun,
+ BUILT_IN_SYNC_ABANDON, true);
+ cilkscreen_disable_instr_fndecl = install_builtin
+ ("cilkscreen_disable_instrumentation", void_fun,
+ BUILT_IN_CILKSCREEN_DS_INSTR, true);
+ cilkscreen_enable_instr_fndecl = install_builtin
+ ("cilkscreen_enable_instrumentation", void_fun,
+ BUILT_IN_CILKSCREEN_EN_INSTR, true);
+ cilkscreen_disable_check_fndecl = install_builtin
+ ("cilkscreen_disable_checking", void_fun, BUILT_IN_CILKSCREEN_DS_CHK, true);
+ cilkscreen_enable_check_fndecl = install_builtin
+ ("cilkscreen_enable_checking", void_fun, BUILT_IN_CILKSCREEN_EN_CHK, true);
+ cilkscreen_aquire_lock_fndecl = install_builtin
+ ("cilkscreen_aquire_lock", ptr_fun, BUILT_IN_CILKSCREEN_AQUIRE_LOCK, true);
+ cilkscreen_release_lock_fndecl = install_builtin
+ ("cilkscreen_release_lock", ptr_fun, BUILT_IN_CILKSCREEN_REL_LOCK, true);
}
/* this function will call the value in a structure. eg. x.y */
@@ -665,4 +745,3 @@ gimplify_cilk_sync (tree *expr_p, gimple_seq *pre_p)
gimplify_and_add (sync_expr, pre_p);
}
-
@@ -58,6 +58,20 @@ enum cilk_tree_index
CILK_TI_F_LEAVE, /* __cilkrts_leave_frame() [builtin] */
CILK_TI_F_DEBUG, /* __cilkrts_debug_s_frame_flags() */
CILK_TI_F_POP, /* __cilkrts_pop_frame() [builtin] */
+ CILK_TI_F_ENTER_BEGIN,
+ CILK_TI_F_ENTER_H_BEGIN,
+ CILK_TI_F_ENTER_END,
+ CILK_TI_F_SPAWN_PREPARE,
+ CILK_TI_F_SPAWN_OR_CONT,
+ CILK_TI_F_DETACH_BEGIN,
+ CILK_TI_F_DETACH_END,
+ CILK_TI_F_SYNC_BEGIN,
+ CILK_TI_F_SYNC_END,
+ CILK_TI_F_LEAVE_BEGIN,
+ CILK_TI_F_LEAVE_END,
+ CILK_TI_F_RESUME,
+ CILK_TI_F_LEAVE_STOLEN,
+ CILK_TI_F_SYNC_ABANDON,
CILK_TI_RUN,
CILK_TI_FREE_DYNAMIC,
CILK_TI_RUN_SERIAL_VOID,
@@ -75,6 +89,8 @@ enum cilk_tree_index
CILK_TI_FRAME, /* __cilkrts_frame_t */
CILK_TI_FRAME_PTR, /* __cilkrts_frame_t * restrict */
CILK_TI_WTYPE, /* __cilkrts_worker_t */
+ CILK_TI_METACALL_FRAME,
+ CILK_TI_METACALL_FPTR,
@@ -103,6 +119,19 @@ enum cilk_tree_index
CILK_TI_SAVEDREGS,
CILK_TI_PENDING_FUNCTIONS,
+ /* layout of the fields in metacall struct */
+ CILK_TI_METACALL_TOOL_FLAGS,
+ CILK_TI_METACALL_CODE_FLAGS,
+ CILK_TI_METACALL_DATA_FLAGS,
+
+ /* Cilkscreen functions */
+ CILKSCREEN_TI_F_METACALL,
+ CILKSCREEN_TI_F_DIS_INSTR,
+ CILKSCREEN_TI_F_EN_INSTR,
+ CILKSCREEN_TI_F_DIS_CHECK,
+ CILKSCREEN_TI_F_EN_CHECK,
+ CILKSCREEN_TI_F_AQ_LOCK,
+ CILKSCREEN_TI_F_REL_LOCK,
CILK_TI_MAX
};
@@ -120,6 +149,8 @@ extern GTY(()) tree cilk_trees[(int) CILK_TI_MAX];
#define cilk_frame_type_decl cilk_trees[CILK_TI_FRAME]
#define cilk_frame_ptr_type_decl cilk_trees[CILK_TI_FRAME_PTR]
#define cilk_worker_type_decl cilk_trees[CILK_TI_WTYPE]
+#define cilk_metacall_frame_type_decl cilk_trees[CILK_TI_METACALL_FRAME]
+#define cilk_mcall_frame_ptr_type_decl cilk_trees[CILK_TI_METACALL_FPTR]
#define cilk_for_32_fndecl cilk_trees[CILK_TI_F_LOOP_32]
#define cilk_for_64_fndecl cilk_trees[CILK_TI_F_LOOP_64]
#define cilk_enter_fndecl cilk_trees[CILK_TI_F_ENTER]
@@ -135,6 +166,27 @@ extern GTY(()) tree cilk_trees[(int) CILK_TI_MAX];
#define cilk_rethrow_fndecl cilk_trees[CILK_TI_RETHROW]
#define cilk_throw_fndecl cilk_trees[CILK_TI_THROW]
#define cilk_replacement_functions cilk_trees[CILK_TI_REPLACEMENTS]
+#define cilk_enter_begin_fndecl cilk_trees[CILK_TI_F_ENTER_BEGIN]
+#define cilk_enter_h_begin_fndecl cilk_trees[CILK_TI_F_ENTER_H_BEGIN]
+#define cilk_enter_end_fndecl cilk_trees[CILK_TI_F_ENTER_END]
+#define cilk_spawn_prepare_fndecl cilk_trees[CILK_TI_F_SPAWN_PREPARE]
+#define cilk_spawn_or_cont_fndecl cilk_trees[CILK_TI_F_SPAWN_OR_CONT]
+#define cilk_detach_begin_fndecl cilk_trees[CILK_TI_F_DETACH_BEGIN]
+#define cilk_detach_end_fndecl cilk_trees[CILK_TI_F_DETACH_END]
+#define cilk_sync_begin_fndecl cilk_trees[CILK_TI_F_SYNC_BEGIN]
+#define cilk_sync_end_fndecl cilk_trees[CILK_TI_F_SYNC_END]
+#define cilk_leave_begin_fndecl cilk_trees[CILK_TI_F_LEAVE_BEGIN]
+#define cilk_leave_end_fndecl cilk_trees[CILK_TI_F_LEAVE_END]
+#define cilkscreen_metacall_fndecl cilk_trees[CILKSCREEN_TI_F_METACALL]
+#define cilk_resume_fndecl cilk_trees[CILK_TI_F_RESUME]
+#define cilk_leave_stolen_fndecl cilk_trees[CILK_TI_F_LEAVE_STOLEN]
+#define cilk_sync_abandon_fndecl cilk_trees[CILK_TI_F_SYNC_ABANDON]
+#define cilkscreen_disable_instr_fndecl cilk_trees[CILKSCREEN_TI_F_DIS_INSTR]
+#define cilkscreen_enable_instr_fndecl cilk_trees[CILKSCREEN_TI_F_EN_INSTR]
+#define cilkscreen_disable_check_fndecl cilk_trees[CILKSCREEN_TI_F_DIS_CHECK]
+#define cilkscreen_enable_check_fndecl cilk_trees[CILKSCREEN_TI_F_EN_CHECK]
+#define cilkscreen_aquire_lock_fndecl cilk_trees[CILKSCREEN_TI_F_AQ_LOCK]
+#define cilkscreen_release_lock_fndecl cilk_trees[CILKSCREEN_TI_F_REL_LOCK]
/* Offset of fields in the Cilk frame descriptor.