diff --git a/plugin.cpp b/plugin.cpp index acbfcf07a35da416671edf6c37b57d7178ebbaa5..b91cb4a25afa1fbf4e9567056b2abf1da7e1d593 100755 --- a/plugin.cpp +++ b/plugin.cpp @@ -25,10 +25,11 @@ int plugin_is_GPL_compatible; -const pass_data my_pass_data = +// First pass data corresponding to +const pass_data split_count_pass_data = { GIMPLE_PASS, /* type */ - "NEW_PASS", /* name */ + "DDPASS1", /* name */ OPTGROUP_NONE, /* optinfo_flags */ TV_OPTIMIZE, /* tv_id */ 0, /* properties_required */ @@ -38,6 +39,18 @@ const pass_data my_pass_data = 0, /* todo_flags_finish */ }; +const pass_data cleanup_pass_data = +{ + GIMPLE_PASS, /* type */ + "DDPASS2", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + TV_OPTIMIZE, /* tv_id */ + 0, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ +}; static void my_pragma_action(cpp_reader *ARG_UNUSED(dummy)) @@ -53,17 +66,17 @@ static void register_my_pragma(void *event_data, void *data) } -class my_pass : public gimple_opt_pass +class split_count_pass : public gimple_opt_pass { public: - my_pass (gcc::context *ctxt) - : gimple_opt_pass (my_pass_data, ctxt) + split_count_pass (gcc::context *ctxt) + : gimple_opt_pass (split_count_pass_data, ctxt) {} /* opt_pass methods: */ - my_pass *clone () + split_count_pass *clone () { - return new my_pass(g); + return new split_count_pass(g); } @@ -71,6 +84,7 @@ class my_pass : public gimple_opt_pass /* Gate function (shall we apply this pass?) */ bool gate (function * fun) { + printf("=> plugin: split_count_pass... \n"); printf("=> plugin: gate... \n"); return true; } @@ -80,13 +94,54 @@ class my_pass : public gimple_opt_pass /* Execute function */ unsigned int execute (function *fun) { + printf("=> plugin: split_count_pass... \n"); printf("=> plugin: execute...\n"); - printf("... in function %s\n", function_name(fun)); - edit_all_aux_value(fun,(int*)NULL); + printf("... in function %s\n\n", function_name(fun)); + //counter in bb aux + mark_number_of_calls(fun); + //split bb where we find several MPI calls + split_mpi_block(fun); + //writing corresponding MPI Call in corresponding basic block + write_mpi_code(fun); return 0; } }; +class cleanup_pass : public gimple_opt_pass +{ + public: + cleanup_pass (gcc::context *ctxt) + : gimple_opt_pass (cleanup_pass_data, ctxt) + {} + + /* opt_pass methods: */ + cleanup_pass *clone () + { + return new cleanup_pass(g); + } + + + + /* Gate function (shall we apply this pass?) */ + bool gate (function * fun) + { + printf("=> plugin: cleanup_pass... \n"); + printf("=> plugin: gate... \n"); + return true; + } + + + + /* Execute function */ + unsigned int execute (function *fun) + { + printf("=> plugin: cleanup_pass... \n"); + printf("=> plugin: execute...\n"); + printf("... in function %s\n\n", function_name(fun)); + edit_all_aux_value(fun,(int*)NULL); + return 0; + } +}; int plugin_init(struct plugin_name_args * plugin_info, struct plugin_gcc_version * version) { @@ -97,14 +152,31 @@ int plugin_init(struct plugin_name_args * plugin_info, struct plugin_gcc_version if(!plugin_default_version_check(version, &gcc_version)) return 1; - struct register_pass_info my_pass_info; + struct register_pass_info split_count_info; + struct register_pass_info cleanup_info; + + split_count_pass first_pass(g); + + split_count_info.pass = &first_pass; + split_count_info.reference_pass_name = "cfg"; + split_count_info.ref_pass_instance_number = 0; + split_count_info.pos_op = PASS_POS_INSERT_AFTER; + + + + //REGISTER PASS + register_callback(plugin_info->base_name, + PLUGIN_PASS_MANAGER_SETUP, + NULL, + &split_count_info); + - my_pass p(g); + cleanup_pass second_pass(g); - my_pass_info.pass = &p; - my_pass_info.reference_pass_name = "cfg"; - my_pass_info.ref_pass_instance_number = 0; - my_pass_info.pos_op = PASS_POS_INSERT_AFTER; + cleanup_info.pass = &second_pass; + cleanup_info.reference_pass_name = "DDPASS1"; + cleanup_info.ref_pass_instance_number = 0; + cleanup_info.pos_op = PASS_POS_INSERT_AFTER; @@ -112,7 +184,7 @@ int plugin_init(struct plugin_name_args * plugin_info, struct plugin_gcc_version register_callback(plugin_info->base_name, PLUGIN_PASS_MANAGER_SETUP, NULL, - &my_pass_info); + &cleanup_info); // REGISTER PRAGMA register_callback("plugin_name", PLUGIN_PRAGMAS, register_my_pragma, NULL );