On Mon, 2013-08-05 at 15:24 -0700, Diego Novillo wrote: > This looks almost ready to commit. Some comments below:
[...] > > +/* Definition of this optimization pass. */ > > + > > +struct gimple_opt_pass pass_vtable_verify = > > +{ > > + { > > + GIMPLE_PASS, > > + "vtable-verify", /* name */ > > + OPTGROUP_NONE, /* optinfo_flags */ > > + gate_tree_vtable_verify, /* gate */ > > + vtable_verify_main, /* execute */ > > + NULL, /* sub */ > > + NULL, /* next */ > > + 0, /* static_pass_number */ > > + TV_VTABLE_VERIFICATION, /* tv_id */ > > + PROP_cfg | PROP_ssa, /* properties_required */ > > + 0, /* properties_provided */ > > + 0, /* properties_destroyed */ > > + 0, /* todo_flags_start */ > > + TODO_update_ssa /* todo_flags_finish */ > > + } > > +}; > > So, David M (CC'd) has just pulled the rug from under you a little (Looks like I wasn't CCed, but I happened to see this given we were chatting on IRC about it; have added myself to CC now) > bit. The pass manager now has a different API. The changes are not > too drastic, but you'll need to rework the registration of the pass. > (http://gcc.gnu.org/ml/gcc-patches/2013-08/msg00231.html). I'm sorry for the inconvenience; a lot changed in trunk with these changes. A description of the API change can be seen in this mail: http://gcc.gnu.org/ml/gcc-patches/2013-07/msg01259.html and perhaps by reading: https://github.com/davidmalcolm/gcc-refactoring-scripts/blob/master/test_refactor_passes.py > David wrote a refactoring tool to use, but this being a single pass it > should be easy to convert it manually. See the other passes, and I'm > sure David will be only too happy to help you if you run into trouble. The script is "refactor_passes.py" within: https://github.com/davidmalcolm/gcc-refactoring-scripts I had a go at running the script on your branch; currently it fails with: File "refactor_passes.py", line 372, in make_replacement2 assert extra != d[extra] AssertionError which is an overly terse way of reporting that a callback in an IPA pass has the same identifier name as the name of the corresponding field, which leads to the code breaking under the new API: specifically, I believe the branch is missing the commit that's r201020 on trunk: 2013-07-18 David Malcolm <dmalc...@redhat.com> * ipa-pure-const.c (generate_summary): Rename to... (pure_const_generate_summary): ... this. (see http://gcc.gnu.org/ml/gcc-patches/2013-07/msg00687.html for more details on this one). On running it on just vtable-verify.c thusly: $ python refactor_passes.py ../src/gcc/vtable-verify.c it generated the attached patch, which looks correct to me (I haven't attempted to remerge the branches to see if it compiles, but it looks like it should); I kept the generated ChangeLog in the patchfile. You'll also need to change the extern decl in tree-pass.h: extern struct gimple_opt_pass pass_vtable_verify; to that of the factory function: extern gimple_opt_pass *make_pass_vtable_verify (gcc::context *ctxt); (the refactoring script will also do this, but currently in the branch there are ~200 other passes that also get touched, so the specific change would be lost in the noise). Note that the vtable_verify pass appears to be single-instanced within the pass tree. For future reference, if someone wants to run the script on a *multi-instanced* pass, they'll need to supply a clone method (the refactor script only adds them for those that it "knows" are multi-instanced, using a hardcoded list). Writing a dummy clone method is trivial, though. > > Index: gcc/passes.def > > =================================================================== > > --- gcc/passes.def (revision 201377) > > +++ gcc/passes.def (working copy) > > @@ -292,6 +292,7 @@ along with GCC; see the file COPYING3. > > NEXT_PASS (pass_tm_memopt); > > NEXT_PASS (pass_tm_edges); > > POP_INSERT_PASSES () > > + NEXT_PASS (pass_vtable_verify); > > This will also need changes after David's changes. If I reading this right, I don't think so - I think the above ought to just work; r201505 updated the meaning of NEXT_PASS (actually for pass-instances.def) so that it will use make_PASS_NAME i.e. this becomes a call to "make_pass_vtable_verify" (wrapped in other stuff). Hope this is helpful; sorry again for the inconvenience. Dave
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f357e85..f1d8aed 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2013-08-05 David Malcolm <dmalc...@redhat.com> + + Patch autogenerated by refactor_passes.py from + https://github.com/davidmalcolm/gcc-refactoring-scripts + revision 03fe39476a4c4ea450b49e087cfa817b5f92021e + + * vtable-verify.c (pass_vtable_verify): Convert from a global struct + to a subclass of gimple_opt_pass along with... + (pass_data_vtable_verify): ...new pass_data instance and... + (make_pass_vtable_verify): ...new function. + 2013-05-31 Yuri Rumyantsev <yuri.s.rumyant...@intel.com> Igor Zamyatin <igor.zamya...@intel.com> diff --git a/gcc/vtable-verify.c b/gcc/vtable-verify.c index e48f21f..e7b58fd 100644 --- a/gcc/vtable-verify.c +++ b/gcc/vtable-verify.c @@ -762,24 +762,42 @@ gate_tree_vtable_verify (void) /* Definition of this optimization pass. */ -struct gimple_opt_pass pass_vtable_verify = +namespace { + +const pass_data pass_data_vtable_verify = { - { - GIMPLE_PASS, - "vtable-verify", /* name */ - OPTGROUP_NONE, /* optinfo_flags */ - gate_tree_vtable_verify, /* gate */ - vtable_verify_main, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_VTABLE_VERIFICATION, /* tv_id */ - PROP_cfg | PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - TODO_update_ssa /* todo_flags_finish */ - } + GIMPLE_PASS, /* type */ + "vtable-verify", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_VTABLE_VERIFICATION, /* tv_id */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_update_ssa, /* todo_flags_finish */ }; +class pass_vtable_verify : public gimple_opt_pass +{ +public: + pass_vtable_verify(gcc::context *ctxt) + : gimple_opt_pass(pass_data_vtable_verify, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_tree_vtable_verify (); } + unsigned int execute () { return vtable_verify_main (); } + +}; // class pass_vtable_verify + +} // anon namespace + +gimple_opt_pass * +make_pass_vtable_verify (gcc::context *ctxt) +{ + return new pass_vtable_verify (ctxt); +} + #include "gt-vtable-verify.h"