@@ -2016,7 +2016,15 @@ ipa_passes (void)
passes->all_lto_gen_passes);
if (!in_lto_p)
- ipa_write_summaries ();
+ {
+ if (flag_openmp)
+ {
+ section_name_prefix = OMP_SECTION_NAME_PREFIX;
+ ipa_write_summaries (true);
+ }
+ section_name_prefix = LTO_SECTION_NAME_PREFIX;
+ ipa_write_summaries (false);
+ }
if (flag_generate_lto)
targetm.asm_out.lto_end ();
@@ -236,8 +236,13 @@ lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t encoder,
void
lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t encoder,
- symtab_node node)
+ symtab_node node, bool is_omp)
{
+ /* Ignore non omp target nodes for omp case. */
+ if (is_omp && !lookup_attribute ("omp declare target",
+ DECL_ATTRIBUTES (node->symbol.decl)))
+ return;
+
int index = lto_symtab_encoder_encode (encoder, (symtab_node)node);
encoder->nodes[index].in_partition = true;
}
@@ -760,7 +765,7 @@ add_references (lto_symtab_encoder_t encoder,
ignored by the partitioning logic earlier. */
lto_symtab_encoder_t
-compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
+compute_ltrans_boundary (lto_symtab_encoder_t in_encoder, bool is_omp)
{
struct cgraph_node *node;
struct cgraph_edge *edge;
@@ -779,7 +784,7 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
{
node = lsei_cgraph_node (lsei);
add_node_to (encoder, node, true);
- lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node);
+ lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node, is_omp);
add_references (encoder, &node->symbol.ref_list);
/* For proper debug info, we need to ship the origins, too. */
if (DECL_ABSTRACT_ORIGIN (node->symbol.decl))
@@ -794,7 +799,7 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
{
struct varpool_node *vnode = lsei_varpool_node (lsei);
- lto_set_symtab_encoder_in_partition (encoder, (symtab_node)vnode);
+ lto_set_symtab_encoder_in_partition (encoder, (symtab_node)vnode, is_omp);
lto_set_symtab_encoder_encode_initializer (encoder, vnode);
add_references (encoder, &vnode->symbol.ref_list);
/* For proper debug info, we need to ship the origins, too. */
@@ -802,7 +807,7 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
{
struct varpool_node *origin_node
= varpool_get_node (DECL_ABSTRACT_ORIGIN (node->symbol.decl));
- lto_set_symtab_encoder_in_partition (encoder, (symtab_node)origin_node);
+ lto_set_symtab_encoder_in_partition (encoder, (symtab_node)origin_node, is_omp);
}
}
/* Pickle in also the initializer of all referenced readonly variables
@@ -44,6 +44,7 @@ struct lto_stats_d lto_stats;
static bitmap_obstack lto_obstack;
static bool lto_obstack_initialized;
+const char *section_name_prefix = LTO_SECTION_NAME_PREFIX;
/* Return a string representing LTO tag TAG. */
@@ -173,7 +174,7 @@ lto_get_section_name (int section_type, const char *name, struct lto_file_decl_d
sprintf (post, "." HOST_WIDE_INT_PRINT_HEX_PURE, f->id);
else
sprintf (post, "." HOST_WIDE_INT_PRINT_HEX_PURE, get_random_seed (false));
- return concat (LTO_SECTION_NAME_PREFIX, sep, add, post, NULL);
+ return concat (section_name_prefix, sep, add, post, NULL);
}
@@ -141,6 +141,11 @@ along with GCC; see the file COPYING3. If not see
name for the functions and static_initializers. For other types of
sections a '.' and the section type are appended. */
#define LTO_SECTION_NAME_PREFIX ".gnu.lto_"
+#define OMP_SECTION_NAME_PREFIX ".gnu.target_lto_"
+
+/* Can be either OMP_SECTION_NAME_PREFIX when we stream pragma omp target
+ stuff, or LTO_SECTION_NAME_PREFIX for lto case. */
+extern const char *section_name_prefix;
#define LTO_major_version 2
#define LTO_minor_version 2
@@ -882,7 +887,7 @@ bool lto_symtab_encoder_encode_body_p (lto_symtab_encoder_t,
bool lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t,
symtab_node);
void lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t,
- symtab_node);
+ symtab_node, bool is_omp);
bool lto_symtab_encoder_encode_initializer_p (lto_symtab_encoder_t,
struct varpool_node *);
@@ -896,7 +901,8 @@ bool referenced_from_this_partition_p (struct ipa_ref_list *,
lto_symtab_encoder_t);
bool reachable_from_this_partition_p (struct cgraph_node *,
lto_symtab_encoder_t);
-lto_symtab_encoder_t compute_ltrans_boundary (lto_symtab_encoder_t encoder);
+lto_symtab_encoder_t compute_ltrans_boundary (lto_symtab_encoder_t encoder,
+ bool is_omp);
/* In lto-symtab.c. */
@@ -189,7 +189,7 @@ add_symbol_to_partition_1 (ltrans_partition part, symtab_node node)
gcc_assert (c != SYMBOL_EXTERNAL
&& (c == SYMBOL_DUPLICATE || !symbol_partitioned_p (node)));
- lto_set_symtab_encoder_in_partition (part->encoder, (symtab_node) node);
+ lto_set_symtab_encoder_in_partition (part->encoder, (symtab_node) node, false);
if (symbol_partitioned_p (node))
{
@@ -922,7 +922,7 @@ lto_promote_cross_file_statics (void)
{
ltrans_partition part
= ltrans_partitions[i];
- part->encoder = compute_ltrans_boundary (part->encoder);
+ part->encoder = compute_ltrans_boundary (part->encoder, false);
}
/* Look at boundaries and promote symbols as needed. */
@@ -2321,7 +2321,7 @@ ipa_write_summaries_1 (lto_symtab_encoder_t encoder)
/* Write out summaries for all the nodes in the callgraph. */
void
-ipa_write_summaries (void)
+ipa_write_summaries (bool is_omp)
{
lto_symtab_encoder_t encoder;
int i, order_pos;
@@ -2359,16 +2359,16 @@ ipa_write_summaries (void)
pop_cfun ();
}
if (node->symbol.definition)
- lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node);
+ lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node, is_omp);
}
FOR_EACH_DEFINED_FUNCTION (node)
if (node->symbol.alias)
- lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node);
+ lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node, is_omp);
FOR_EACH_DEFINED_VARIABLE (vnode)
- lto_set_symtab_encoder_in_partition (encoder, (symtab_node)vnode);
+ lto_set_symtab_encoder_in_partition (encoder, (symtab_node)vnode, is_omp);
- ipa_write_summaries_1 (compute_ltrans_boundary (encoder));
+ ipa_write_summaries_1 (compute_ltrans_boundary (encoder, is_omp));
free (order);
}
@@ -598,7 +598,7 @@ extern void pass_fini_dump_file (struct opt_pass *);
extern const char *get_current_pass_name (void);
extern void print_current_pass (FILE *);
extern void debug_pass (void);
-extern void ipa_write_summaries (void);
+extern void ipa_write_summaries (bool is_omp);
extern void ipa_write_optimization_summaries (struct lto_symtab_encoder_d *);
extern void ipa_read_summaries (void);
extern void ipa_read_optimization_summaries (void);