aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2016-03-07 18:31:53 +0000
committerMartin Jambor <mjambor@suse.cz>2016-03-07 18:31:53 +0000
commit6683af54ac10d086026040b1501437b4bfbe46e9 (patch)
tree55b94d15f9b30b1f8259bd8e5bd89d53399bac83
parent20e22e8c094afca5a9884b2ffec1ea27cf4a7c99 (diff)
[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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@234042 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/hsa-brig.c14
-rw-r--r--gcc/hsa-gen.c13
-rw-r--r--gcc/hsa.c25
-rw-r--r--gcc/hsa.h3
5 files changed, 54 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8db785068a5..6a143ba94b5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,17 @@
+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>
* config/arm/arm-cores.def (cortex-r8): New.
diff --git a/gcc/hsa-brig.c b/gcc/hsa-brig.c
index 61cfd8b8c23..2a301be8106 100644
--- a/gcc/hsa-brig.c
+++ b/gcc/hsa-brig.c
@@ -2006,8 +2006,6 @@ hsa_brig_emit_omp_symbols (void)
emit_directive_variable (hsa_num_threads);
}
-static GTY(()) tree hsa_cdtor_statements[2];
-
/* Create and return __hsa_global_variables symbol that contains
all informations consumed by libgomp to link global variables
with their string names used by an HSA kernel. */
@@ -2408,6 +2406,7 @@ hsa_output_libgomp_mapping (tree brig_decl)
= builtin_decl_explicit (BUILT_IN_GOMP_OFFLOAD_REGISTER);
gcc_checking_assert (offload_register);
+ tree *hsa_ctor_stmts = hsa_get_ctor_statements ();
append_to_statement_list
(build_call_expr (offload_register, 4,
build_int_cstu (unsigned_type_node,
@@ -2416,15 +2415,15 @@ hsa_output_libgomp_mapping (tree brig_decl)
build_fold_addr_expr (hsa_libgomp_host_table),
build_int_cst (integer_type_node, GOMP_DEVICE_HSA),
build_fold_addr_expr (hsa_img_descriptor)),
- &hsa_cdtor_statements[0]);
+ hsa_ctor_stmts);
- cgraph_build_static_cdtor ('I', hsa_cdtor_statements[0],
- DEFAULT_INIT_PRIORITY);
+ cgraph_build_static_cdtor ('I', *hsa_ctor_stmts, DEFAULT_INIT_PRIORITY);
tree offload_unregister
= builtin_decl_explicit (BUILT_IN_GOMP_OFFLOAD_UNREGISTER);
gcc_checking_assert (offload_unregister);
+ tree *hsa_dtor_stmts = hsa_get_dtor_statements ();
append_to_statement_list
(build_call_expr (offload_unregister, 4,
build_int_cstu (unsigned_type_node,
@@ -2433,9 +2432,8 @@ hsa_output_libgomp_mapping (tree brig_decl)
build_fold_addr_expr (hsa_libgomp_host_table),
build_int_cst (integer_type_node, GOMP_DEVICE_HSA),
build_fold_addr_expr (hsa_img_descriptor)),
- &hsa_cdtor_statements[1]);
- cgraph_build_static_cdtor ('D', hsa_cdtor_statements[1],
- DEFAULT_INIT_PRIORITY);
+ hsa_dtor_stmts);
+ cgraph_build_static_cdtor ('D', *hsa_dtor_stmts, DEFAULT_INIT_PRIORITY);
}
/* Emit the brig module we have compiled to a section in the final assembly and
diff --git a/gcc/hsa-gen.c b/gcc/hsa-gen.c
index 4881f24206b..5939a577f3f 100644
--- a/gcc/hsa-gen.c
+++ b/gcc/hsa-gen.c
@@ -3772,20 +3772,19 @@ gen_set_num_threads (tree value, hsa_bb *hbb)
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
is defined in plugin-hsa.c. */
static HOST_WIDE_INT
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
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,
get_identifier ("queue"), ptr_type_node);
DECL_CHAIN (id_f1) = NULL_TREE;
@@ -3835,12 +3834,12 @@ get_hsa_kernel_dispatch_offset (const char *field_name)
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);
- 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))
if (strcmp (field_name, IDENTIFIER_POINTER (DECL_NAME (chain))) == 0)
return int_byte_position (chain);
diff --git a/gcc/hsa.c b/gcc/hsa.c
index 09bfd28b437..9eacb59f759 100644
--- a/gcc/hsa.c
+++ b/gcc/hsa.c
@@ -712,6 +712,31 @@ hsa_add_kernel_dependency (tree caller, const char *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. */
void
diff --git a/gcc/hsa.h b/gcc/hsa.h
index 3a13fbd147a..6a7c651ce9b 100644
--- a/gcc/hsa.h
+++ b/gcc/hsa.h
@@ -1353,6 +1353,9 @@ char *hsa_get_decl_kernel_mapping_name (unsigned i);
unsigned hsa_get_decl_kernel_mapping_omp_size (unsigned i);
bool hsa_get_decl_kernel_mapping_gridified (unsigned i);
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_sanitize_name (char *p);
char *hsa_brig_function_name (const char *p);