Commit 4bf1cec7 by Martin Jambor Committed by Martin Jambor

[hsa] Consodlidate GTY roots for trees used during expansion to HSA

2016-03-07  Martin Jambor  <mjambor@suse.cz>

	* hsa.h (hsa_get_ctor_statements): Declare.
	(hsa_get_dtor_statements): Likewise.
	(hsa_get_kernel_dispatch_type): Likewise.
	* hsa.c (hsa_get_ctor_statements): New function.
	(hsa_get_dtor_statements): Likewise.
	(hsa_get_kernel_dispatch_type): Likewise.
	* hsa-brig.c (hsa_cdtor_statements): Removed.
	(hsa_output_libgomp_mapping): Use hsa_get_ctor_statements and
	hsa_get_dtor_statements.
	* hsa-gen.c (hsa_kernel_dispatch_type): Removed.
	(get_hsa_kernel_dispatch_offset): Use hsa_get_kernel_dispatch_type.

From-SVN: r234042
parent 94156b3f
2016-03-07 Martin Jambor <mjambor@suse.cz>
* hsa.h (hsa_get_ctor_statements): Declare.
(hsa_get_dtor_statements): Likewise.
(hsa_get_kernel_dispatch_type): Likewise.
* hsa.c (hsa_get_ctor_statements): New function.
(hsa_get_dtor_statements): Likewise.
(hsa_get_kernel_dispatch_type): Likewise.
* hsa-brig.c (hsa_cdtor_statements): Removed.
(hsa_output_libgomp_mapping): Use hsa_get_ctor_statements and
hsa_get_dtor_statements.
* hsa-gen.c (hsa_kernel_dispatch_type): Removed.
(get_hsa_kernel_dispatch_offset): Use hsa_get_kernel_dispatch_type.
2016-03-07 Andre Vieira <andre.simoesdiasvieira@arm.com> 2016-03-07 Andre Vieira <andre.simoesdiasvieira@arm.com>
* config/arm/arm-cores.def (cortex-r8): New. * config/arm/arm-cores.def (cortex-r8): New.
......
...@@ -2006,8 +2006,6 @@ hsa_brig_emit_omp_symbols (void) ...@@ -2006,8 +2006,6 @@ hsa_brig_emit_omp_symbols (void)
emit_directive_variable (hsa_num_threads); emit_directive_variable (hsa_num_threads);
} }
static GTY(()) tree hsa_cdtor_statements[2];
/* Create and return __hsa_global_variables symbol that contains /* Create and return __hsa_global_variables symbol that contains
all informations consumed by libgomp to link global variables all informations consumed by libgomp to link global variables
with their string names used by an HSA kernel. */ with their string names used by an HSA kernel. */
...@@ -2408,6 +2406,7 @@ hsa_output_libgomp_mapping (tree brig_decl) ...@@ -2408,6 +2406,7 @@ hsa_output_libgomp_mapping (tree brig_decl)
= builtin_decl_explicit (BUILT_IN_GOMP_OFFLOAD_REGISTER); = builtin_decl_explicit (BUILT_IN_GOMP_OFFLOAD_REGISTER);
gcc_checking_assert (offload_register); gcc_checking_assert (offload_register);
tree *hsa_ctor_stmts = hsa_get_ctor_statements ();
append_to_statement_list append_to_statement_list
(build_call_expr (offload_register, 4, (build_call_expr (offload_register, 4,
build_int_cstu (unsigned_type_node, build_int_cstu (unsigned_type_node,
...@@ -2416,15 +2415,15 @@ hsa_output_libgomp_mapping (tree brig_decl) ...@@ -2416,15 +2415,15 @@ hsa_output_libgomp_mapping (tree brig_decl)
build_fold_addr_expr (hsa_libgomp_host_table), build_fold_addr_expr (hsa_libgomp_host_table),
build_int_cst (integer_type_node, GOMP_DEVICE_HSA), build_int_cst (integer_type_node, GOMP_DEVICE_HSA),
build_fold_addr_expr (hsa_img_descriptor)), build_fold_addr_expr (hsa_img_descriptor)),
&hsa_cdtor_statements[0]); hsa_ctor_stmts);
cgraph_build_static_cdtor ('I', hsa_cdtor_statements[0], cgraph_build_static_cdtor ('I', *hsa_ctor_stmts, DEFAULT_INIT_PRIORITY);
DEFAULT_INIT_PRIORITY);
tree offload_unregister tree offload_unregister
= builtin_decl_explicit (BUILT_IN_GOMP_OFFLOAD_UNREGISTER); = builtin_decl_explicit (BUILT_IN_GOMP_OFFLOAD_UNREGISTER);
gcc_checking_assert (offload_unregister); gcc_checking_assert (offload_unregister);
tree *hsa_dtor_stmts = hsa_get_dtor_statements ();
append_to_statement_list append_to_statement_list
(build_call_expr (offload_unregister, 4, (build_call_expr (offload_unregister, 4,
build_int_cstu (unsigned_type_node, build_int_cstu (unsigned_type_node,
...@@ -2433,9 +2432,8 @@ hsa_output_libgomp_mapping (tree brig_decl) ...@@ -2433,9 +2432,8 @@ hsa_output_libgomp_mapping (tree brig_decl)
build_fold_addr_expr (hsa_libgomp_host_table), build_fold_addr_expr (hsa_libgomp_host_table),
build_int_cst (integer_type_node, GOMP_DEVICE_HSA), build_int_cst (integer_type_node, GOMP_DEVICE_HSA),
build_fold_addr_expr (hsa_img_descriptor)), build_fold_addr_expr (hsa_img_descriptor)),
&hsa_cdtor_statements[1]); hsa_dtor_stmts);
cgraph_build_static_cdtor ('D', hsa_cdtor_statements[1], cgraph_build_static_cdtor ('D', *hsa_dtor_stmts, DEFAULT_INIT_PRIORITY);
DEFAULT_INIT_PRIORITY);
} }
/* Emit the brig module we have compiled to a section in the final assembly and /* Emit the brig module we have compiled to a section in the final assembly and
......
...@@ -3772,20 +3772,19 @@ gen_set_num_threads (tree value, hsa_bb *hbb) ...@@ -3772,20 +3772,19 @@ gen_set_num_threads (tree value, hsa_bb *hbb)
hbb->append_insn (basic); hbb->append_insn (basic);
} }
static GTY (()) tree hsa_kernel_dispatch_type = NULL;
/* Return byte offset of a FIELD_NAME in GOMP_hsa_kernel_dispatch which /* Return byte offset of a FIELD_NAME in GOMP_hsa_kernel_dispatch which
is defined in plugin-hsa.c. */ is defined in plugin-hsa.c. */
static HOST_WIDE_INT static HOST_WIDE_INT
get_hsa_kernel_dispatch_offset (const char *field_name) get_hsa_kernel_dispatch_offset (const char *field_name)
{ {
if (hsa_kernel_dispatch_type == NULL) tree *hsa_kernel_dispatch_type = hsa_get_kernel_dispatch_type ();
if (*hsa_kernel_dispatch_type == NULL)
{ {
/* Collection of information needed for a dispatch of a kernel from a /* Collection of information needed for a dispatch of a kernel from a
kernel. Keep in sync with libgomp's plugin-hsa.c. */ kernel. Keep in sync with libgomp's plugin-hsa.c. */
hsa_kernel_dispatch_type = make_node (RECORD_TYPE); *hsa_kernel_dispatch_type = make_node (RECORD_TYPE);
tree id_f1 = build_decl (BUILTINS_LOCATION, FIELD_DECL, tree id_f1 = build_decl (BUILTINS_LOCATION, FIELD_DECL,
get_identifier ("queue"), ptr_type_node); get_identifier ("queue"), ptr_type_node);
DECL_CHAIN (id_f1) = NULL_TREE; DECL_CHAIN (id_f1) = NULL_TREE;
...@@ -3835,12 +3834,12 @@ get_hsa_kernel_dispatch_offset (const char *field_name) ...@@ -3835,12 +3834,12 @@ get_hsa_kernel_dispatch_offset (const char *field_name)
DECL_CHAIN (id_f12) = id_f11; DECL_CHAIN (id_f12) = id_f11;
finish_builtin_struct (hsa_kernel_dispatch_type, "__hsa_kernel_dispatch", finish_builtin_struct (*hsa_kernel_dispatch_type, "__hsa_kernel_dispatch",
id_f12, NULL_TREE); id_f12, NULL_TREE);
TYPE_ARTIFICIAL (hsa_kernel_dispatch_type) = 1; TYPE_ARTIFICIAL (*hsa_kernel_dispatch_type) = 1;
} }
for (tree chain = TYPE_FIELDS (hsa_kernel_dispatch_type); for (tree chain = TYPE_FIELDS (*hsa_kernel_dispatch_type);
chain != NULL_TREE; chain = TREE_CHAIN (chain)) chain != NULL_TREE; chain = TREE_CHAIN (chain))
if (strcmp (field_name, IDENTIFIER_POINTER (DECL_NAME (chain))) == 0) if (strcmp (field_name, IDENTIFIER_POINTER (DECL_NAME (chain))) == 0)
return int_byte_position (chain); return int_byte_position (chain);
......
...@@ -712,6 +712,31 @@ hsa_add_kernel_dependency (tree caller, const char *called_function) ...@@ -712,6 +712,31 @@ hsa_add_kernel_dependency (tree caller, const char *called_function)
s->safe_push (called_function); s->safe_push (called_function);
} }
/* Expansion to HSA needs a few gc roots to hold types, constructors etc. In
order to minimize the number of GTY roots, we'll root them all in the
following array. The individual elements should only be accessed by the
very simple getters (of a pointer-to-tree) below. */
static GTY(()) tree hsa_tree_gt_roots[3];
tree *
hsa_get_ctor_statements (void)
{
return &hsa_tree_gt_roots[0];
}
tree *
hsa_get_dtor_statements (void)
{
return &hsa_tree_gt_roots[1];
}
tree *
hsa_get_kernel_dispatch_type (void)
{
return &hsa_tree_gt_roots[2];
}
/* Modify the name P in-place so that it is a valid HSA identifier. */ /* Modify the name P in-place so that it is a valid HSA identifier. */
void void
......
...@@ -1353,6 +1353,9 @@ char *hsa_get_decl_kernel_mapping_name (unsigned i); ...@@ -1353,6 +1353,9 @@ char *hsa_get_decl_kernel_mapping_name (unsigned i);
unsigned hsa_get_decl_kernel_mapping_omp_size (unsigned i); unsigned hsa_get_decl_kernel_mapping_omp_size (unsigned i);
bool hsa_get_decl_kernel_mapping_gridified (unsigned i); bool hsa_get_decl_kernel_mapping_gridified (unsigned i);
void hsa_free_decl_kernel_mapping (void); void hsa_free_decl_kernel_mapping (void);
tree *hsa_get_ctor_statements (void);
tree *hsa_get_dtor_statements (void);
tree *hsa_get_kernel_dispatch_type (void);
void hsa_add_kernel_dependency (tree caller, const char *called_function); void hsa_add_kernel_dependency (tree caller, const char *called_function);
void hsa_sanitize_name (char *p); void hsa_sanitize_name (char *p);
char *hsa_brig_function_name (const char *p); char *hsa_brig_function_name (const char *p);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment