On 24 Sep 11:02, Richard Biener wrote: > On Mon, Sep 23, 2013 at 3:29 PM, Ilya Tocar <tocarip.in...@gmail.com> wrote: > > Hi, > > > > I've rebased my patch. > > Is it ok for gomp4 > > Passing through "is_omp" looks bad - please find a more suitable place > to attach this meta-information. From a quick look you only need it to > produce an alternate section name,
Mostly for name, but there are other uses (e. g. choosing decl states vector). > thus consider assigning the section > name in a different place. > > Richard. What do you mean by different place? I can add global dumping_omp_target variable to choose correct name, depending on it's value (patch below). Is it better? --- gcc/lto-cgraph.c | 10 ++- gcc/lto-section-out.c | 6 +- gcc/lto-streamer-out.c | 182 +++++++++++++++++++++++++++++++++++++++++++++---- gcc/lto-streamer.c | 4 +- gcc/lto-streamer.h | 6 ++ gcc/passes.c | 2 +- gcc/passes.def | 2 + gcc/timevar.def | 2 + gcc/tree-pass.h | 2 + 9 files changed, 198 insertions(+), 18 deletions(-) diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index 952588d..5187190 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -907,9 +907,15 @@ output_symtab (void) { symtab_node node = lto_symtab_encoder_deref (encoder, i); if (cgraph_node *cnode = dyn_cast <cgraph_node> (node)) - lto_output_node (ob, cnode, encoder); + { + if (!dumping_omp_target || lookup_attribute ("omp declare target", + DECL_ATTRIBUTES (node->symbol.decl))) + lto_output_node (ob, cnode, encoder); + } else - lto_output_varpool_node (ob, varpool (node), encoder); + if (!dumping_omp_target || lookup_attribute ("omp declare target", + DECL_ATTRIBUTES (node->symbol.decl))) + lto_output_varpool_node (ob, varpool (node), encoder); } diff --git a/gcc/lto-section-out.c b/gcc/lto-section-out.c index 59eed71..ad247c1 100644 --- a/gcc/lto-section-out.c +++ b/gcc/lto-section-out.c @@ -49,6 +49,7 @@ static vec<lto_out_decl_state_ptr> decl_state_stack; vec<lto_out_decl_state_ptr> lto_function_decl_states; +vec<lto_out_decl_state_ptr> omp_function_decl_states; /***************************************************************************** Output routines shared by all of the serialization passes. @@ -443,5 +444,8 @@ lto_record_function_out_decl_state (tree fn_decl, state->streams[i].tree_hash_table = NULL; } state->fn_decl = fn_decl; - lto_function_decl_states.safe_push (state); + if (dumping_omp_target) + omp_function_decl_states.safe_push (state); + else + lto_function_decl_states.safe_push (state); } diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index 8f823f2..66a0747 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -48,6 +48,9 @@ along with GCC; see the file COPYING3. If not see #include "cfgloop.h" +/* Off by default. */ +bool dumping_omp_target = false; + /* Clear the line info stored in DATA_IN. */ static void @@ -2014,6 +2017,93 @@ lto_output (void) #endif } +bool +gate_omp_out (void) +{ + return flag_openmp; +} + +static void +omp_output (void) +{ + /* We need omp names for sections, turn this on. */ + dumping_omp_target = true; + + lto_streamer_hooks_init(); + struct lto_out_decl_state *decl_state; + int i, n_nodes; + lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder; + + /* Initialize the streamer. */ + lto_streamer_init (); + + n_nodes = lto_symtab_encoder_size (encoder); + /* Process only the functions with bodies. */ + for (i = 0; i < n_nodes; i++) + { + symtab_node snode = lto_symtab_encoder_deref (encoder, i); + cgraph_node *node = dyn_cast <cgraph_node> (snode); + if (node + && lto_symtab_encoder_encode_body_p (encoder, node) + && !node->symbol.alias + && gimple_has_body_p (node->symbol.decl) + && lookup_attribute ("omp declare target", + DECL_ATTRIBUTES (node->symbol.decl))) + { + decl_state = lto_new_out_decl_state (); + lto_push_out_decl_state (decl_state); + output_function (node); + lto_pop_out_decl_state (); + lto_record_function_out_decl_state (node->symbol.decl, decl_state); + } + } + + /* Emit the callgraph after emitting function bodies. This needs to + be done now to make sure that all the statements in every function + have been renumbered so that edges can be associated with call + statements using the statement UIDs. */ + output_symtab (); +} + +namespace { + +const pass_data pass_data_ipa_omp_gimple_out = +{ + IPA_PASS, /* type */ + "omp_gimple_out", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + true, /* has_gate */ + false, /* has_execute */ + TV_IPA_OMP_GIMPLE_OUT, /* tv_id */ + 0, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ +}; + +class pass_ipa_omp_gimple_out : public ipa_opt_pass_d +{ +public: + pass_ipa_omp_gimple_out(gcc::context *ctxt) + : ipa_opt_pass_d(pass_data_ipa_omp_gimple_out, ctxt, + NULL, /* generate_summary */ + omp_output, /* write_summary */ + NULL, /* read_summary */ + omp_output, /* write_optimization_summary */ + NULL, /* read_optimization_summary */ + NULL, /* stmt_fixup */ + 0, /* function_transform_todo_flags_start */ + NULL, /* function_transform */ + NULL) /* variable_transform */ + {} + + /* opt_pass methods: */ + bool gate () { return gate_omp_out (); } + +}; // class pass_ipa_omp_gimple_out + +} // anon namespace namespace { const pass_data pass_data_ipa_lto_gimple_out = @@ -2055,6 +2145,12 @@ public: } // anon namespace ipa_opt_pass_d * +make_pass_ipa_omp_gimple_out (gcc::context *ctxt) +{ + return new pass_ipa_omp_gimple_out (ctxt); +} + +ipa_opt_pass_d * make_pass_ipa_lto_gimple_out (gcc::context *ctxt) { return new pass_ipa_lto_gimple_out (ctxt); @@ -2353,7 +2449,9 @@ produce_symtab (struct output_block *ob) { symtab_node node = lsei_node (lsei); - if (!output_symbol_p (node) || DECL_EXTERNAL (node->symbol.decl)) + if (!output_symbol_p (node) || DECL_EXTERNAL (node->symbol.decl) + || (dumping_omp_target && !lookup_attribute ("omp declare target", + DECL_ATTRIBUTES (node->symbol.decl)))) continue; write_symbol (cache, &stream, node->symbol.decl, seen, false); } @@ -2362,7 +2460,9 @@ produce_symtab (struct output_block *ob) { symtab_node node = lsei_node (lsei); - if (!output_symbol_p (node) || !DECL_EXTERNAL (node->symbol.decl)) + if (!output_symbol_p (node) || !DECL_EXTERNAL (node->symbol.decl) + || (dumping_omp_target && !lookup_attribute ("omp declare target", + DECL_ATTRIBUTES (node->symbol.decl)))) continue; write_symbol (cache, &stream, node->symbol.decl, seen, false); } @@ -2393,6 +2493,11 @@ produce_asm_for_decls (void) size_t decl_state_size; int32_t num_decl_states; + vec<lto_out_decl_state_ptr> decl_states = dumping_omp_target + ? omp_function_decl_states + : lto_function_decl_states; + + ob = create_output_block (LTO_section_decls); ob->global = true; @@ -2409,12 +2514,11 @@ produce_asm_for_decls (void) /* Write the global symbols. */ out_state = lto_get_out_decl_state (); - num_fns = lto_function_decl_states.length (); + num_fns = decl_states.length (); lto_output_decl_state_streams (ob, out_state); for (idx = 0; idx < num_fns; idx++) { - fn_out_state = - lto_function_decl_states[idx]; + fn_out_state = decl_states[idx]; lto_output_decl_state_streams (ob, fn_out_state); } @@ -2430,8 +2534,7 @@ produce_asm_for_decls (void) decl_state_size += lto_out_decl_state_written_size (out_state); for (idx = 0; idx < num_fns; idx++) { - fn_out_state = - lto_function_decl_states[idx]; + fn_out_state = decl_states[idx]; decl_state_size += lto_out_decl_state_written_size (fn_out_state); } header.decl_state_size = decl_state_size; @@ -2453,8 +2556,7 @@ produce_asm_for_decls (void) lto_output_decl_state_refs (ob, decl_state_stream, out_state); for (idx = 0; idx < num_fns; idx++) { - fn_out_state = - lto_function_decl_states[idx]; + fn_out_state = decl_states[idx]; lto_output_decl_state_refs (ob, decl_state_stream, fn_out_state); } lto_write_stream (decl_state_stream); @@ -2471,20 +2573,29 @@ produce_asm_for_decls (void) produce_symtab (ob); /* Write command line opts. */ - lto_write_options (); + if (!dumping_omp_target) + lto_write_options (); /* Deallocate memory and clean up. */ for (idx = 0; idx < num_fns; idx++) { - fn_out_state = - lto_function_decl_states[idx]; + fn_out_state = decl_states[idx]; lto_delete_out_decl_state (fn_out_state); } - lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder); + if (!dumping_omp_target || !flag_lto) + lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder); + omp_function_decl_states.release (); lto_function_decl_states.release (); destroy_output_block (ob); } +static void +produce_asm_for_decls_omp () +{ + produce_asm_for_decls (); + /* Disable after everything is done. */ + dumping_omp_target = false; +} namespace { @@ -2531,3 +2642,48 @@ make_pass_ipa_lto_finish_out (gcc::context *ctxt) { return new pass_ipa_lto_finish_out (ctxt); } +namespace { + +const pass_data pass_data_ipa_omp_finish_out = +{ + IPA_PASS, /* type */ + "omp_decls_out", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + true, /* has_gate */ + false, /* has_execute */ + TV_IPA_OMP_DECL_OUT, /* tv_id */ + 0, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ +}; + +class pass_ipa_omp_finish_out : public ipa_opt_pass_d +{ +public: + pass_ipa_omp_finish_out(gcc::context *ctxt) + : ipa_opt_pass_d(pass_data_ipa_omp_finish_out, ctxt, + NULL, /* generate_summary */ + produce_asm_for_decls_omp, /* write_summary */ + NULL, /* read_summary */ + produce_asm_for_decls_omp, /* write_optimization_summary */ + NULL, /* read_optimization_summary */ + NULL, /* stmt_fixup */ + 0, /* function_transform_todo_flags_start */ + NULL, /* function_transform */ + NULL) /* variable_transform */ + {} + + /* opt_pass methods: */ + bool gate () { return gate_omp_out (); } + +}; // class pass_ipa_lto_finish_out + +} // anon namespace + +ipa_opt_pass_d * +make_pass_ipa_omp_finish_out (gcc::context *ctxt) +{ + return new pass_ipa_omp_finish_out (ctxt); +} diff --git a/gcc/lto-streamer.c b/gcc/lto-streamer.c index cdc75de..5cc3f37 100644 --- a/gcc/lto-streamer.c +++ b/gcc/lto-streamer.c @@ -173,7 +173,9 @@ 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 (dumping_omp_target ? OMP_SECTION_NAME_PREFIX + : LTO_SECTION_NAME_PREFIX, + sep, add, post, NULL); } diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h index 13a9593..93106b3 100644 --- a/gcc/lto-streamer.h +++ b/gcc/lto-streamer.h @@ -141,12 +141,17 @@ 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_" #define LTO_major_version 2 #define LTO_minor_version 2 typedef unsigned char lto_decl_flags_t; +/* When we dump gimple for omp target stuff we need to use + OMP_SECTION_NAME_PREFIX, for section names. We use this to + distinguish omp dumps by setting to true in them. */ +extern bool dumping_omp_target; /* Tags representing the various IL objects written to the bytecode file (GIMPLE statements, basic blocks, EH regions, tree nodes, etc). @@ -918,6 +923,7 @@ extern const char *lto_section_name[]; /* Holds all the out decl states of functions output so far in the current output file. */ extern vec<lto_out_decl_state_ptr> lto_function_decl_states; +extern vec<lto_out_decl_state_ptr> omp_function_decl_states; /* Return true if LTO tag TAG corresponds to a tree code. */ static inline bool diff --git a/gcc/passes.c b/gcc/passes.c index f3f85fd..fda68cf 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -2329,7 +2329,7 @@ ipa_write_summaries (void) struct cgraph_node *node; struct cgraph_node **order; - if (!flag_generate_lto || seen_error ()) + if (!(flag_generate_lto || flag_openmp) || seen_error ()) return; encoder = lto_symtab_encoder_new (false); diff --git a/gcc/passes.def b/gcc/passes.def index 84eb3f3..774cab8 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -102,6 +102,8 @@ along with GCC; see the file COPYING3. If not see TERMINATE_PASS_LIST () INSERT_PASSES_AFTER (all_regular_ipa_passes) + NEXT_PASS (pass_ipa_omp_gimple_out); + NEXT_PASS (pass_ipa_omp_finish_out); NEXT_PASS (pass_ipa_whole_program_visibility); NEXT_PASS (pass_ipa_profile); NEXT_PASS (pass_ipa_devirt); diff --git a/gcc/timevar.def b/gcc/timevar.def index 5a880a8..d473083 100644 --- a/gcc/timevar.def +++ b/gcc/timevar.def @@ -74,8 +74,10 @@ DEFTIMEVAR (TV_IPA_FNSPLIT , "ipa function splitting") DEFTIMEVAR (TV_IPA_OPT , "ipa various optimizations") DEFTIMEVAR (TV_IPA_LTO_GIMPLE_IN , "ipa lto gimple in") DEFTIMEVAR (TV_IPA_LTO_GIMPLE_OUT , "ipa lto gimple out") +DEFTIMEVAR (TV_IPA_OMP_GIMPLE_OUT , "ipa omp gimple out") DEFTIMEVAR (TV_IPA_LTO_DECL_IN , "ipa lto decl in") DEFTIMEVAR (TV_IPA_LTO_DECL_OUT , "ipa lto decl out") +DEFTIMEVAR (TV_IPA_OMP_DECL_OUT , "ipa omp decl out") DEFTIMEVAR (TV_IPA_LTO_DECL_INIT_IO , "ipa lto decl init I/O") DEFTIMEVAR (TV_IPA_LTO_CGRAPH_IO , "ipa lto cgraph I/O") DEFTIMEVAR (TV_IPA_LTO_DECL_MERGE , "ipa lto decl merge") diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h index ea1a62f..1fb487c 100644 --- a/gcc/tree-pass.h +++ b/gcc/tree-pass.h @@ -460,6 +460,7 @@ extern simple_ipa_opt_pass *make_pass_early_local_passes (gcc::context *ctxt); extern ipa_opt_pass_d *make_pass_ipa_whole_program_visibility (gcc::context *ctxt); +extern ipa_opt_pass_d *make_pass_ipa_omp_gimple_out (gcc::context *ctxt); extern ipa_opt_pass_d *make_pass_ipa_lto_gimple_out (gcc::context *ctxt); extern simple_ipa_opt_pass *make_pass_ipa_increase_alignment (gcc::context *ctxt); @@ -473,6 +474,7 @@ extern ipa_opt_pass_d *make_pass_ipa_reference (gcc::context *ctxt); extern ipa_opt_pass_d *make_pass_ipa_pure_const (gcc::context *ctxt); extern simple_ipa_opt_pass *make_pass_ipa_pta (gcc::context *ctxt); extern ipa_opt_pass_d *make_pass_ipa_lto_finish_out (gcc::context *ctxt); +extern ipa_opt_pass_d *make_pass_ipa_omp_finish_out (gcc::context *ctxt); extern simple_ipa_opt_pass *make_pass_ipa_tm (gcc::context *ctxt); extern ipa_opt_pass_d *make_pass_ipa_profile (gcc::context *ctxt); extern ipa_opt_pass_d *make_pass_ipa_cdtor_merge (gcc::context *ctxt); -- 1.7.11.7 > > > > > 2013/9/13 Ilya Tocar <tocarip.in...@gmail.com>: > >> Hi, > >> > >> I'm working on dumping gimple for "omp pragma target" stuff into > >> gnu.target_lto_ sections. > >> I've tried to reuse current lto infrastructure as much as possible. > >> > >> Could you please take a look at attached patch? > > > > > > --- > > gcc/ipa-inline-analysis.c | 2 +- > > gcc/ipa-profile.c | 2 +- > > gcc/ipa-prop.c | 4 +- > > gcc/ipa-pure-const.c | 2 +- > > gcc/ipa-reference.c | 2 +- > > gcc/lto-cgraph.c | 22 +++-- > > gcc/lto-opts.c | 2 +- > > gcc/lto-section-out.c | 14 ++- > > gcc/lto-streamer-out.c | 215 > > +++++++++++++++++++++++++++++++++++++++------- > > gcc/lto-streamer.c | 6 +- > > gcc/lto-streamer.h | 13 +-- > > gcc/lto/lto.c | 2 +- > > gcc/passes.c | 3 +- > > gcc/passes.def | 2 + > > gcc/timevar.def | 2 + > > gcc/tree-pass.h | 2 + > > 16 files changed, 237 insertions(+), 58 deletions(-) > > > > diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c > > index ba6221e..ea3fc90 100644 > > --- a/gcc/ipa-inline-analysis.c > > +++ b/gcc/ipa-inline-analysis.c > > @@ -4023,7 +4023,7 @@ inline_write_summary (void) > > } > > } > > streamer_write_char_stream (ob->main_stream, 0); > > - produce_asm (ob, NULL); > > + produce_asm (ob, NULL, false); > > destroy_output_block (ob); > > > > if (optimize && !flag_ipa_cp) > > diff --git a/gcc/ipa-profile.c b/gcc/ipa-profile.c > > index 424e4a6..b16ba6c 100644 > > --- a/gcc/ipa-profile.c > > +++ b/gcc/ipa-profile.c > > @@ -247,7 +247,7 @@ ipa_profile_write_summary (void) > > streamer_write_uhwi_stream (ob->main_stream, histogram[i]->time); > > streamer_write_uhwi_stream (ob->main_stream, histogram[i]->size); > > } > > - lto_destroy_simple_output_block (ob); > > + lto_destroy_simple_output_block (ob, false); > > } > > > > /* Deserialize the ipa info for lto. */ > > diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c > > index c09ec2f..69603c9 100644 > > --- a/gcc/ipa-prop.c > > +++ b/gcc/ipa-prop.c > > @@ -4234,7 +4234,7 @@ ipa_prop_write_jump_functions (void) > > ipa_write_node_info (ob, node); > > } > > streamer_write_char_stream (ob->main_stream, 0); > > - produce_asm (ob, NULL); > > + produce_asm (ob, NULL, false); > > destroy_output_block (ob); > > } > > > > @@ -4409,7 +4409,7 @@ ipa_prop_write_all_agg_replacement (void) > > write_agg_replacement_chain (ob, node); > > } > > streamer_write_char_stream (ob->main_stream, 0); > > - produce_asm (ob, NULL); > > + produce_asm (ob, NULL, false); > > destroy_output_block (ob); > > } > > > > diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c > > index 55b679d..d6bbd52 100644 > > --- a/gcc/ipa-pure-const.c > > +++ b/gcc/ipa-pure-const.c > > @@ -988,7 +988,7 @@ pure_const_write_summary (void) > > } > > } > > > > - lto_destroy_simple_output_block (ob); > > + lto_destroy_simple_output_block (ob, false); > > } > > > > > > diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c > > index e6f19fd..0593c77 100644 > > --- a/gcc/ipa-reference.c > > +++ b/gcc/ipa-reference.c > > @@ -1022,7 +1022,7 @@ ipa_reference_write_optimization_summary (void) > > } > > } > > BITMAP_FREE (ltrans_statics); > > - lto_destroy_simple_output_block (ob); > > + lto_destroy_simple_output_block (ob, false); > > splay_tree_delete (reference_vars_to_consider); > > } > > > > diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c > > index 952588d..831e74d 100644 > > --- a/gcc/lto-cgraph.c > > +++ b/gcc/lto-cgraph.c > > @@ -690,7 +690,7 @@ output_outgoing_cgraph_edges (struct cgraph_edge *edge, > > /* Output the part of the cgraph in SET. */ > > > > static void > > -output_refs (lto_symtab_encoder_t encoder) > > +output_refs (lto_symtab_encoder_t encoder, bool is_omp) > > { > > lto_symtab_encoder_iterator lsei; > > struct lto_simple_output_block *ob; > > @@ -719,7 +719,7 @@ output_refs (lto_symtab_encoder_t encoder) > > > > streamer_write_uhwi_stream (ob->main_stream, 0); > > > > - lto_destroy_simple_output_block (ob); > > + lto_destroy_simple_output_block (ob, is_omp); > > } > > > > /* Add NODE into encoder as well as nodes it is cloned from. > > @@ -878,7 +878,7 @@ compute_ltrans_boundary (lto_symtab_encoder_t > > in_encoder) > > /* Output the part of the symtab in SET and VSET. */ > > > > void > > -output_symtab (void) > > +output_symtab (bool is_omp) > > { > > struct cgraph_node *node; > > struct lto_simple_output_block *ob; > > @@ -907,9 +907,15 @@ output_symtab (void) > > { > > symtab_node node = lto_symtab_encoder_deref (encoder, i); > > if (cgraph_node *cnode = dyn_cast <cgraph_node> (node)) > > - lto_output_node (ob, cnode, encoder); > > + { > > + if (!is_omp || lookup_attribute ("omp declare target", > > + DECL_ATTRIBUTES > > (node->symbol.decl))) > > + lto_output_node (ob, cnode, encoder); > > + } > > else > > - lto_output_varpool_node (ob, varpool (node), encoder); > > + if (!is_omp || lookup_attribute ("omp declare target", > > + DECL_ATTRIBUTES > > (node->symbol.decl))) > > + lto_output_varpool_node (ob, varpool (node), encoder); > > > > } > > > > @@ -924,7 +930,7 @@ output_symtab (void) > > > > streamer_write_uhwi_stream (ob->main_stream, 0); > > > > - lto_destroy_simple_output_block (ob); > > + lto_destroy_simple_output_block (ob, is_omp); > > > > /* Emit toplevel asms. > > When doing WPA we must output every asm just once. Since we do not > > partition asm > > @@ -936,7 +942,7 @@ output_symtab (void) > > lto_output_toplevel_asms (); > > } > > > > - output_refs (encoder); > > + output_refs (encoder, is_omp); > > } > > > > /* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS, > > @@ -1691,7 +1697,7 @@ output_cgraph_opt_summary (void) > > output_node_opt_summary (ob, cnode, encoder); > > } > > } > > - produce_asm (ob, NULL); > > + produce_asm (ob, NULL, false); > > destroy_output_block (ob); > > } > > > > diff --git a/gcc/lto-opts.c b/gcc/lto-opts.c > > index 4d9cdfd..b524b19 100644 > > --- a/gcc/lto-opts.c > > +++ b/gcc/lto-opts.c > > @@ -70,7 +70,7 @@ lto_write_options (void) > > char *args; > > bool first_p = true; > > > > - section_name = lto_get_section_name (LTO_section_opts, NULL, NULL); > > + section_name = lto_get_section_name (LTO_section_opts, NULL, NULL, > > false); > > lto_begin_section (section_name, false); > > memset (&stream, 0, sizeof (stream)); > > > > diff --git a/gcc/lto-section-out.c b/gcc/lto-section-out.c > > index 59eed71..ccf00e9 100644 > > --- a/gcc/lto-section-out.c > > +++ b/gcc/lto-section-out.c > > @@ -49,6 +49,8 @@ static vec<lto_out_decl_state_ptr> decl_state_stack; > > > > vec<lto_out_decl_state_ptr> lto_function_decl_states; > > > > +vec<lto_out_decl_state_ptr> omp_function_decl_states; > > + > > > > > > /***************************************************************************** > > Output routines shared by all of the serialization passes. > > @@ -336,13 +338,13 @@ lto_create_simple_output_block (enum lto_section_type > > section_type) > > /* Produce a simple section for one of the ipa passes. */ > > > > void > > -lto_destroy_simple_output_block (struct lto_simple_output_block *ob) > > +lto_destroy_simple_output_block (struct lto_simple_output_block *ob, bool > > is_omp) > > { > > char *section_name; > > struct lto_simple_header header; > > struct lto_output_stream *header_stream; > > > > - section_name = lto_get_section_name (ob->section_type, NULL, NULL); > > + section_name = lto_get_section_name (ob->section_type, NULL, NULL, > > is_omp); > > lto_begin_section (section_name, !flag_wpa); > > free (section_name); > > > > @@ -431,7 +433,8 @@ lto_pop_out_decl_state (void) > > > > void > > lto_record_function_out_decl_state (tree fn_decl, > > - struct lto_out_decl_state *state) > > + struct lto_out_decl_state *state, > > + bool is_omp) > > { > > int i; > > > > @@ -443,5 +446,8 @@ lto_record_function_out_decl_state (tree fn_decl, > > state->streams[i].tree_hash_table = NULL; > > } > > state->fn_decl = fn_decl; > > - lto_function_decl_states.safe_push (state); > > + if (is_omp) > > + omp_function_decl_states.safe_push (state); > > + else > > + lto_function_decl_states.safe_push (state); > > } > > diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c > > index 8f823f2..fcc4682e 100644 > > --- a/gcc/lto-streamer-out.c > > +++ b/gcc/lto-streamer-out.c > > @@ -1646,7 +1646,7 @@ output_cfg (struct output_block *ob, struct function > > *fn) > > a function, set FN to the decl for that function. */ > > > > void > > -produce_asm (struct output_block *ob, tree fn) > > +produce_asm (struct output_block *ob, tree fn, bool is_omp) > > { > > enum lto_section_type section_type = ob->section_type; > > struct lto_function_header header; > > @@ -1656,10 +1656,10 @@ produce_asm (struct output_block *ob, tree fn) > > if (section_type == LTO_section_function_body) > > { > > const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn)); > > - section_name = lto_get_section_name (section_type, name, NULL); > > + section_name = lto_get_section_name (section_type, name, NULL, > > is_omp); > > } > > else > > - section_name = lto_get_section_name (section_type, NULL, NULL); > > + section_name = lto_get_section_name (section_type, NULL, NULL, false); > > > > lto_begin_section (section_name, !flag_wpa); > > free (section_name); > > @@ -1743,7 +1743,7 @@ output_struct_function_base (struct output_block *ob, > > struct function *fn) > > /* Output the body of function NODE->DECL. */ > > > > static void > > -output_function (struct cgraph_node *node) > > +output_function (struct cgraph_node *node, bool is_omp) > > { > > tree function; > > struct function *fn; > > @@ -1841,7 +1841,7 @@ output_function (struct cgraph_node *node) > > streamer_write_uhwi (ob, 0); > > > > /* Create a section to hold the pickled output of this function. */ > > - produce_asm (ob, function); > > + produce_asm (ob, function, is_omp); > > > > destroy_output_block (ob); > > } > > @@ -1874,7 +1874,7 @@ lto_output_toplevel_asms (void) > > > > streamer_write_string_cst (ob, ob->main_stream, NULL_TREE); > > > > - section_name = lto_get_section_name (LTO_section_asm, NULL, NULL); > > + section_name = lto_get_section_name (LTO_section_asm, NULL, NULL, false); > > lto_begin_section (section_name, !flag_wpa); > > free (section_name); > > > > @@ -1916,7 +1916,7 @@ copy_function (struct cgraph_node *node) > > size_t len; > > const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function)); > > char *section_name = > > - lto_get_section_name (LTO_section_function_body, name, NULL); > > + lto_get_section_name (LTO_section_function_body, name, NULL, false); > > size_t i, j; > > struct lto_in_decl_state *in_state; > > struct lto_out_decl_state *out_state = lto_get_out_decl_state (); > > @@ -1994,12 +1994,12 @@ lto_output (void) > > decl_state = lto_new_out_decl_state (); > > lto_push_out_decl_state (decl_state); > > if (gimple_has_body_p (node->symbol.decl) || !flag_wpa) > > - output_function (node); > > + output_function (node, false); > > else > > copy_function (node); > > gcc_assert (lto_get_out_decl_state () == decl_state); > > lto_pop_out_decl_state (); > > - lto_record_function_out_decl_state (node->symbol.decl, > > decl_state); > > + lto_record_function_out_decl_state (node->symbol.decl, > > decl_state, false); > > } > > } > > > > @@ -2007,13 +2007,98 @@ lto_output (void) > > be done now to make sure that all the statements in every function > > have been renumbered so that edges can be associated with call > > statements using the statement UIDs. */ > > - output_symtab (); > > + output_symtab (false); > > > > #ifdef ENABLE_CHECKING > > lto_bitmap_free (output); > > #endif > > } > > > > +bool > > +gate_omp_out (void) > > +{ > > + return flag_openmp; > > +} > > + > > +static void > > +omp_output (void) > > +{ > > + lto_streamer_hooks_init(); > > + struct lto_out_decl_state *decl_state; > > + int i, n_nodes; > > + lto_symtab_encoder_t encoder = lto_get_out_decl_state > > ()->symtab_node_encoder; > > + > > + /* Initialize the streamer. */ > > + lto_streamer_init (); > > + > > + n_nodes = lto_symtab_encoder_size (encoder); > > + /* Process only the functions with bodies. */ > > + for (i = 0; i < n_nodes; i++) > > + { > > + symtab_node snode = lto_symtab_encoder_deref (encoder, i); > > + cgraph_node *node = dyn_cast <cgraph_node> (snode); > > + if (node > > + && lto_symtab_encoder_encode_body_p (encoder, node) > > + && !node->symbol.alias > > + && !node->thunk.thunk_p > > + && gimple_has_body_p (node->symbol.decl) > > + && lookup_attribute ("omp declare target", > > + DECL_ATTRIBUTES (node->symbol.decl))) > > + { > > + decl_state = lto_new_out_decl_state (); > > + lto_push_out_decl_state (decl_state); > > + output_function (node, true); > > + lto_pop_out_decl_state (); > > + lto_record_function_out_decl_state (node->symbol.decl, > > decl_state, true); > > + } > > + } > > + > > + /* Emit the callgraph after emitting function bodies. This needs to > > + be done now to make sure that all the statements in every function > > + have been renumbered so that edges can be associated with call > > + statements using the statement UIDs. */ > > + output_symtab (true); > > +} > > + > > +namespace { > > + > > +const pass_data pass_data_ipa_omp_gimple_out = > > +{ > > + IPA_PASS, /* type */ > > + "omp_gimple_out", /* name */ > > + OPTGROUP_NONE, /* optinfo_flags */ > > + true, /* has_gate */ > > + false, /* has_execute */ > > + TV_IPA_OMP_GIMPLE_OUT, /* tv_id */ > > + 0, /* properties_required */ > > + 0, /* properties_provided */ > > + 0, /* properties_destroyed */ > > + 0, /* todo_flags_start */ > > + 0, /* todo_flags_finish */ > > +}; > > + > > +class pass_ipa_omp_gimple_out : public ipa_opt_pass_d > > +{ > > +public: > > + pass_ipa_omp_gimple_out(gcc::context *ctxt) > > + : ipa_opt_pass_d(pass_data_ipa_omp_gimple_out, ctxt, > > + NULL, /* generate_summary */ > > + omp_output, /* write_summary */ > > + NULL, /* read_summary */ > > + omp_output, /* write_optimization_summary */ > > + NULL, /* read_optimization_summary */ > > + NULL, /* stmt_fixup */ > > + 0, /* function_transform_todo_flags_start */ > > + NULL, /* function_transform */ > > + NULL) /* variable_transform */ > > + {} > > + > > + /* opt_pass methods: */ > > + bool gate () { return gate_omp_out (); } > > + > > +}; // class pass_ipa_omp_gimple_out > > + > > +} // anon namespace > > namespace { > > > > const pass_data pass_data_ipa_lto_gimple_out = > > @@ -2055,6 +2140,12 @@ public: > > } // anon namespace > > > > ipa_opt_pass_d * > > +make_pass_ipa_omp_gimple_out (gcc::context *ctxt) > > +{ > > + return new pass_ipa_omp_gimple_out (ctxt); > > +} > > + > > +ipa_opt_pass_d * > > make_pass_ipa_lto_gimple_out (gcc::context *ctxt) > > { > > return new pass_ipa_lto_gimple_out (ctxt); > > @@ -2330,10 +2421,10 @@ output_symbol_p (symtab_node node) > > SET and VSET are cgraph/varpool node sets we are outputting. */ > > > > static void > > -produce_symtab (struct output_block *ob) > > +produce_symtab (struct output_block *ob, bool is_omp) > > { > > struct streamer_tree_cache_d *cache = ob->writer_cache; > > - char *section_name = lto_get_section_name (LTO_section_symtab, NULL, > > NULL); > > + char *section_name = lto_get_section_name (LTO_section_symtab, NULL, > > NULL, is_omp); > > struct pointer_set_t *seen; > > struct lto_output_stream stream; > > lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder; > > @@ -2353,7 +2444,9 @@ produce_symtab (struct output_block *ob) > > { > > symtab_node node = lsei_node (lsei); > > > > - if (!output_symbol_p (node) || DECL_EXTERNAL (node->symbol.decl)) > > + if (!output_symbol_p (node) || DECL_EXTERNAL (node->symbol.decl) > > + || (is_omp && !lookup_attribute ("omp declare target", > > + DECL_ATTRIBUTES > > (node->symbol.decl)))) > > continue; > > write_symbol (cache, &stream, node->symbol.decl, seen, false); > > } > > @@ -2362,7 +2455,9 @@ produce_symtab (struct output_block *ob) > > { > > symtab_node node = lsei_node (lsei); > > > > - if (!output_symbol_p (node) || !DECL_EXTERNAL (node->symbol.decl)) > > + if (!output_symbol_p (node) || !DECL_EXTERNAL (node->symbol.decl) > > + || (is_omp && !lookup_attribute ("omp declare target", > > + DECL_ATTRIBUTES > > (node->symbol.decl)))) > > continue; > > write_symbol (cache, &stream, node->symbol.decl, seen, false); > > } > > @@ -2381,7 +2476,7 @@ produce_symtab (struct output_block *ob) > > recover these on other side. */ > > > > static void > > -produce_asm_for_decls (void) > > +produce_asm_for_decls (bool is_omp) > > { > > struct lto_out_decl_state *out_state; > > struct lto_out_decl_state *fn_out_state; > > @@ -2393,12 +2488,17 @@ produce_asm_for_decls (void) > > size_t decl_state_size; > > int32_t num_decl_states; > > > > + vec<lto_out_decl_state_ptr> decl_states = is_omp > > + ? omp_function_decl_states > > + : lto_function_decl_states; > > + > > + > > ob = create_output_block (LTO_section_decls); > > ob->global = true; > > > > memset (&header, 0, sizeof (struct lto_decl_header)); > > > > - section_name = lto_get_section_name (LTO_section_decls, NULL, NULL); > > + section_name = lto_get_section_name (LTO_section_decls, NULL, NULL, > > is_omp); > > lto_begin_section (section_name, !flag_wpa); > > free (section_name); > > > > @@ -2409,12 +2509,12 @@ produce_asm_for_decls (void) > > > > /* Write the global symbols. */ > > out_state = lto_get_out_decl_state (); > > - num_fns = lto_function_decl_states.length (); > > + num_fns = decl_states.length (); > > lto_output_decl_state_streams (ob, out_state); > > for (idx = 0; idx < num_fns; idx++) > > { > > fn_out_state = > > - lto_function_decl_states[idx]; > > + decl_states[idx]; > > lto_output_decl_state_streams (ob, fn_out_state); > > } > > > > @@ -2430,8 +2530,7 @@ produce_asm_for_decls (void) > > decl_state_size += lto_out_decl_state_written_size (out_state); > > for (idx = 0; idx < num_fns; idx++) > > { > > - fn_out_state = > > - lto_function_decl_states[idx]; > > + fn_out_state = decl_states[idx]; > > decl_state_size += lto_out_decl_state_written_size (fn_out_state); > > } > > header.decl_state_size = decl_state_size; > > @@ -2453,8 +2552,7 @@ produce_asm_for_decls (void) > > lto_output_decl_state_refs (ob, decl_state_stream, out_state); > > for (idx = 0; idx < num_fns; idx++) > > { > > - fn_out_state = > > - lto_function_decl_states[idx]; > > + fn_out_state = decl_states[idx]; > > lto_output_decl_state_refs (ob, decl_state_stream, fn_out_state); > > } > > lto_write_stream (decl_state_stream); > > @@ -2468,24 +2566,38 @@ produce_asm_for_decls (void) > > /* Write the symbol table. It is used by linker to determine > > dependencies > > and thus we can skip it for WPA. */ > > if (!flag_wpa) > > - produce_symtab (ob); > > + produce_symtab (ob, is_omp); > > > > /* Write command line opts. */ > > - lto_write_options (); > > + if (!is_omp) > > + lto_write_options (); > > > > /* Deallocate memory and clean up. */ > > for (idx = 0; idx < num_fns; idx++) > > { > > - fn_out_state = > > - lto_function_decl_states[idx]; > > + fn_out_state = decl_states[idx]; > > lto_delete_out_decl_state (fn_out_state); > > } > > - lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder); > > + if (!is_omp || !flag_lto) > > + lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder); > > + omp_function_decl_states.release (); > > lto_function_decl_states.release (); > > destroy_output_block (ob); > > } > > > > > > +static void > > +produce_asm_for_decls_lto () > > +{ > > + produce_asm_for_decls (false); > > +} > > + > > +static void > > +produce_asm_for_decls_omp () > > +{ > > + produce_asm_for_decls (true); > > +} > > + > > namespace { > > > > const pass_data pass_data_ipa_lto_finish_out = > > @@ -2509,9 +2621,9 @@ public: > > pass_ipa_lto_finish_out(gcc::context *ctxt) > > : ipa_opt_pass_d(pass_data_ipa_lto_finish_out, ctxt, > > NULL, /* generate_summary */ > > - produce_asm_for_decls, /* write_summary */ > > + produce_asm_for_decls_lto, /* write_summary */ > > NULL, /* read_summary */ > > - produce_asm_for_decls, /* write_optimization_summary */ > > + produce_asm_for_decls_lto, /* > > write_optimization_summary */ > > NULL, /* read_optimization_summary */ > > NULL, /* stmt_fixup */ > > 0, /* function_transform_todo_flags_start */ > > @@ -2531,3 +2643,48 @@ make_pass_ipa_lto_finish_out (gcc::context *ctxt) > > { > > return new pass_ipa_lto_finish_out (ctxt); > > } > > +namespace { > > + > > +const pass_data pass_data_ipa_omp_finish_out = > > +{ > > + IPA_PASS, /* type */ > > + "omp_decls_out", /* name */ > > + OPTGROUP_NONE, /* optinfo_flags */ > > + true, /* has_gate */ > > + false, /* has_execute */ > > + TV_IPA_OMP_DECL_OUT, /* tv_id */ > > + 0, /* properties_required */ > > + 0, /* properties_provided */ > > + 0, /* properties_destroyed */ > > + 0, /* todo_flags_start */ > > + 0, /* todo_flags_finish */ > > +}; > > + > > +class pass_ipa_omp_finish_out : public ipa_opt_pass_d > > +{ > > +public: > > + pass_ipa_omp_finish_out(gcc::context *ctxt) > > + : ipa_opt_pass_d(pass_data_ipa_omp_finish_out, ctxt, > > + NULL, /* generate_summary */ > > + produce_asm_for_decls_omp, /* write_summary */ > > + NULL, /* read_summary */ > > + produce_asm_for_decls_omp, /* > > write_optimization_summary */ > > + NULL, /* read_optimization_summary */ > > + NULL, /* stmt_fixup */ > > + 0, /* function_transform_todo_flags_start */ > > + NULL, /* function_transform */ > > + NULL) /* variable_transform */ > > + {} > > + > > + /* opt_pass methods: */ > > + bool gate () { return gate_omp_out (); } > > + > > +}; // class pass_ipa_lto_finish_out > > + > > +} // anon namespace > > + > > +ipa_opt_pass_d * > > +make_pass_ipa_omp_finish_out (gcc::context *ctxt) > > +{ > > + return new pass_ipa_omp_finish_out (ctxt); > > +} > > diff --git a/gcc/lto-streamer.c b/gcc/lto-streamer.c > > index cdc75de..92af717 100644 > > --- a/gcc/lto-streamer.c > > +++ b/gcc/lto-streamer.c > > @@ -140,7 +140,7 @@ lto_bitmap_free (bitmap b) > > to free the returned name. */ > > > > char * > > -lto_get_section_name (int section_type, const char *name, struct > > lto_file_decl_data *f) > > +lto_get_section_name (int section_type, const char *name, struct > > lto_file_decl_data *f, bool is_omp) > > { > > const char *add; > > char post[32]; > > @@ -173,7 +173,9 @@ 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 (is_omp ? OMP_SECTION_NAME_PREFIX > > + : LTO_SECTION_NAME_PREFIX, > > + sep, add, post, NULL); > > } > > > > > > diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h > > index 13a9593..65d5c2e 100644 > > --- a/gcc/lto-streamer.h > > +++ b/gcc/lto-streamer.h > > @@ -141,6 +141,7 @@ 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_" > > > > #define LTO_major_version 2 > > #define LTO_minor_version 2 > > @@ -804,14 +805,15 @@ extern void lto_output_type_ref_index (struct > > lto_out_decl_state *, > > struct lto_output_stream *, tree); > > extern struct lto_simple_output_block *lto_create_simple_output_block ( > > enum lto_section_type); > > -extern void lto_destroy_simple_output_block (struct > > lto_simple_output_block *); > > +extern void lto_destroy_simple_output_block (struct > > lto_simple_output_block *, bool is_omp); > > extern struct lto_out_decl_state *lto_new_out_decl_state (void); > > extern void lto_delete_out_decl_state (struct lto_out_decl_state *); > > extern struct lto_out_decl_state *lto_get_out_decl_state (void); > > extern void lto_push_out_decl_state (struct lto_out_decl_state *); > > extern struct lto_out_decl_state *lto_pop_out_decl_state (void); > > extern void lto_record_function_out_decl_state (tree, > > - struct lto_out_decl_state > > *); > > + struct lto_out_decl_state *, > > + bool is_omp); > > extern void lto_append_block (struct lto_output_stream *); > > > > > > @@ -819,7 +821,7 @@ extern void lto_append_block (struct lto_output_stream > > *); > > extern const char *lto_tag_name (enum LTO_tags); > > extern bitmap lto_bitmap_alloc (void); > > extern void lto_bitmap_free (bitmap); > > -extern char *lto_get_section_name (int, const char *, struct > > lto_file_decl_data *); > > +extern char *lto_get_section_name (int, const char *, struct > > lto_file_decl_data *, bool is_omp); > > extern void print_lto_report (const char *); > > extern void lto_streamer_init (void); > > extern bool gate_lto_out (void); > > @@ -863,7 +865,7 @@ extern struct output_block *create_output_block (enum > > lto_section_type); > > extern void destroy_output_block (struct output_block *); > > extern void lto_output_tree (struct output_block *, tree, bool, bool); > > extern void lto_output_toplevel_asms (void); > > -extern void produce_asm (struct output_block *ob, tree fn); > > +extern void produce_asm (struct output_block *ob, tree fn, bool is_omp); > > void lto_output_decl_state_streams (struct output_block *, > > struct lto_out_decl_state *); > > void lto_output_decl_state_refs (struct output_block *, > > @@ -886,7 +888,7 @@ void lto_set_symtab_encoder_in_partition > > (lto_symtab_encoder_t, > > > > bool lto_symtab_encoder_encode_initializer_p (lto_symtab_encoder_t, > > struct varpool_node *); > > -void output_symtab (void); > > +void output_symtab (bool is_omp); > > void input_symtab (void); > > bool referenced_from_other_partition_p (struct ipa_ref_list *, > > lto_symtab_encoder_t); > > @@ -918,6 +920,7 @@ extern const char *lto_section_name[]; > > /* Holds all the out decl states of functions output so far in the > > current output file. */ > > extern vec<lto_out_decl_state_ptr> lto_function_decl_states; > > +extern vec<lto_out_decl_state_ptr> omp_function_decl_states; > > > > /* Return true if LTO tag TAG corresponds to a tree code. */ > > static inline bool > > diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c > > index 470f3c1..8ab1fae 100644 > > --- a/gcc/lto/lto.c > > +++ b/gcc/lto/lto.c > > @@ -2946,7 +2946,7 @@ get_section_data (struct lto_file_decl_data > > *file_data, > > htab_t section_hash_table = file_data->section_hash_table; > > struct lto_section_slot *f_slot; > > struct lto_section_slot s_slot; > > - const char *section_name = lto_get_section_name (section_type, name, > > file_data); > > + const char *section_name = lto_get_section_name (section_type, name, > > file_data, false); > > char *data = NULL; > > > > *len = 0; > > diff --git a/gcc/passes.c b/gcc/passes.c > > index f3f85fd..5fc14f4 100644 > > --- a/gcc/passes.c > > +++ b/gcc/passes.c > > @@ -2329,9 +2329,8 @@ ipa_write_summaries (void) > > struct cgraph_node *node; > > struct cgraph_node **order; > > > > - if (!flag_generate_lto || seen_error ()) > > + if (!(flag_generate_lto || flag_openmp) || seen_error ()) > > return; > > - > > encoder = lto_symtab_encoder_new (false); > > > > /* Create the callgraph set in the same order used in > > diff --git a/gcc/passes.def b/gcc/passes.def > > index 84eb3f3..774cab8 100644 > > --- a/gcc/passes.def > > +++ b/gcc/passes.def > > @@ -102,6 +102,8 @@ along with GCC; see the file COPYING3. If not see > > TERMINATE_PASS_LIST () > > > > INSERT_PASSES_AFTER (all_regular_ipa_passes) > > + NEXT_PASS (pass_ipa_omp_gimple_out); > > + NEXT_PASS (pass_ipa_omp_finish_out); > > NEXT_PASS (pass_ipa_whole_program_visibility); > > NEXT_PASS (pass_ipa_profile); > > NEXT_PASS (pass_ipa_devirt); > > diff --git a/gcc/timevar.def b/gcc/timevar.def > > index 5a880a8..d473083 100644 > > --- a/gcc/timevar.def > > +++ b/gcc/timevar.def > > @@ -74,8 +74,10 @@ DEFTIMEVAR (TV_IPA_FNSPLIT , "ipa function > > splitting") > > DEFTIMEVAR (TV_IPA_OPT , "ipa various optimizations") > > DEFTIMEVAR (TV_IPA_LTO_GIMPLE_IN , "ipa lto gimple in") > > DEFTIMEVAR (TV_IPA_LTO_GIMPLE_OUT , "ipa lto gimple out") > > +DEFTIMEVAR (TV_IPA_OMP_GIMPLE_OUT , "ipa omp gimple out") > > DEFTIMEVAR (TV_IPA_LTO_DECL_IN , "ipa lto decl in") > > DEFTIMEVAR (TV_IPA_LTO_DECL_OUT , "ipa lto decl out") > > +DEFTIMEVAR (TV_IPA_OMP_DECL_OUT , "ipa omp decl out") > > DEFTIMEVAR (TV_IPA_LTO_DECL_INIT_IO , "ipa lto decl init I/O") > > DEFTIMEVAR (TV_IPA_LTO_CGRAPH_IO , "ipa lto cgraph I/O") > > DEFTIMEVAR (TV_IPA_LTO_DECL_MERGE , "ipa lto decl merge") > > diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h > > index ea1a62f..1fb487c 100644 > > --- a/gcc/tree-pass.h > > +++ b/gcc/tree-pass.h > > @@ -460,6 +460,7 @@ extern simple_ipa_opt_pass > > *make_pass_early_local_passes (gcc::context *ctxt); > > > > extern ipa_opt_pass_d *make_pass_ipa_whole_program_visibility (gcc::context > > *ctxt); > > +extern ipa_opt_pass_d *make_pass_ipa_omp_gimple_out (gcc::context *ctxt); > > extern ipa_opt_pass_d *make_pass_ipa_lto_gimple_out (gcc::context *ctxt); > > extern simple_ipa_opt_pass *make_pass_ipa_increase_alignment (gcc::context > > *ctxt); > > @@ -473,6 +474,7 @@ extern ipa_opt_pass_d *make_pass_ipa_reference > > (gcc::context *ctxt); > > extern ipa_opt_pass_d *make_pass_ipa_pure_const (gcc::context *ctxt); > > extern simple_ipa_opt_pass *make_pass_ipa_pta (gcc::context *ctxt); > > extern ipa_opt_pass_d *make_pass_ipa_lto_finish_out (gcc::context *ctxt); > > +extern ipa_opt_pass_d *make_pass_ipa_omp_finish_out (gcc::context *ctxt); > > extern simple_ipa_opt_pass *make_pass_ipa_tm (gcc::context *ctxt); > > extern ipa_opt_pass_d *make_pass_ipa_profile (gcc::context *ctxt); > > extern ipa_opt_pass_d *make_pass_ipa_cdtor_merge (gcc::context *ctxt); > > -- > > 1.7.11.7 > >