On Thu, 2017-08-03 at 17:21 +0800, Leslie Zhai wrote: > /opt/gcc-6.3/bin/gcc -fplugin=./dragonegg.so test/hello.c -wrapper > gdb,--args > GNU gdb (GDB) Fedora 7.12.1-48.fc25 > ... > Reading symbols from > /opt/gcc-6.3/libexec/gcc/x86_64-redhat-linux-gnu/6.3.0/cc1...done. > (gdb) b /data/project/xiangzhai/gcc-6.3.0/gcc/passes.c:2288 > Breakpoint 1 at 0x91b8d4: file ../../gcc/passes.c, line 2288. > (gdb) r > Starting program: > /opt/gcc-6.3/libexec/gcc/x86_64-redhat-linux-gnu/6.3.0/cc1 -quiet > -iplugindir=/opt/gcc-6.3/lib/gcc/x86_64-redhat-linux- > gnu/6.3.0/plugin > test/hello.c > -iplugindir=/opt/gcc-6.3/lib/gcc/x86_64-redhat-linux- > gnu/6.3.0/plugin > -quiet -dumpbase hello.c -mtune=generic -march=x86-64 -auxbase hello > -fplugin=./dragonegg.so -o /tmp/cco7mKtB.s > ... > > Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c7b730) at > ../../gcc/passes.c:2288 > warning: Source file is more recent than executable.
This warning is somewhat unnerving; have you updated the source code for the compiler since you last recompiled it? > 2288 current_pass = pass; > > (gdb) p pass > $1 = (opt_pass *) 0x1c7b730 > (gdb) p current_pass > $2 = (opt_pass *) 0x0 > (gdb) n > 2292 gate_status = pass->gate (cfun); > (gdb) p current_pass > $3 = (opt_pass *) 0x1c7b730 > (gdb) p gate_status > $4 = false > (gdb) n > 2293 gate_status = override_gate_status (pass, > current_function_decl, gate_status); > (gdb) p gate_status > $5 = false > (gdb) n > 2292 gate_status = pass->gate (cfun); > (gdb) p gate_status > $6 = false > (gdb) n > 2293 gate_status = override_gate_status (pass, > current_function_decl, gate_status); > (gdb) n > 2296 invoke_plugin_callbacks (PLUGIN_OVERRIDE_GATE, > &gate_status); > (gdb) p gate_status > $7 = true > (gdb) n > 2293 gate_status = override_gate_status (pass, > current_function_decl, gate_status); > (gdb) n > 2296 invoke_plugin_callbacks (PLUGIN_OVERRIDE_GATE, > &gate_status); > (gdb) n > 2298 if (!gate_status) > (gdb) p gate_status > $8 = true > (gdb) n > ... > (gdb) n > 2336 todo_after = pass->execute (cfun); <--- gcc called execute > hook? Try "step" here rather than "n" for "next"; that way you can see exactly what is being called. I had a hunch that you might be running into the default implementation of opt_pass::execute, which is a no-op. opt_pass::execute used to take "void", but was changed to take a "function *" in r209482 (aka 65b0537f9e9741318f7c8e738b6dd3b8f82f58b5) on 2014-04-17. If you're using a >= C++11 compiler, you might want to try adding "final override" to the execute method of your pass to ensure that it's an override of the execute virtual function. We have macros "FINAL" and "OVERRIDE" for this in recent versions of gcc. Is this definitely the correct pass? What does (gdb) p *pass print? Dave > (gdb) p todo_after > $9 = 0 > (gdb) n > 2338 if (todo_after & TODO_discard_function) > (gdb) p todo_after > $10 = 0 > (gdb) > > > 2336 todo_after = pass->execute (cfun); <--- gcc called execute > hook? but why not dragonegg > https://github.com/xiangzhai/dragonegg/blob/gcc-6_3-branch/src/Backen > d.cpp#L2103 > > > > 在 2017年08月03日 11:24, Leslie Zhai 写道: > > Hi GCC developers, > > > > As ChangeLog-2013 mentioned: > > > > 2013-08-05 David Malcolm <dmalc...@redhat.com> > > > > This is the automated part of the conversion of passes from C > > structs to C++ classes. > > > > ... > > > > * auto-inc-dec.c (pass_inc_dec): Convert from a global struct > > to a > > subclass of rtl_opt_pass along with... > > > > > > so I migrate struct rtl_opt_pass: > > https://github.com/llvm-mirror/dragonegg/blob/master/src/Backend.cp > > p#L1731 > > > > > > static struct rtl_opt_pass pass_rtl_emit_function = { { > > RTL_PASS, "rtl_emit_function", /* name */ > > #if (GCC_MINOR > 7) > > OPTGROUP_NONE, /* optinfo_flags */ > > #endif > > NULL, /* gate */ > > rtl_emit_function, /* execute */ > > NULL, /* sub */ > > NULL, /* next */ > > 0, /* static_pass_number */ > > TV_NONE, /* tv_id */ > > PROP_ssa | PROP_gimple_leh | PROP_cfg, /* properties_required */ > > 0, /* properties_provided */ > > PROP_ssa | PROP_trees, /* properties_destroyed */ > > TODO_verify_ssa | TODO_verify_flow | TODO_verify_stmts, /* > > todo_flags_start */ > > TODO_ggc_collect /* todo_flags_finish */ > > } }; > > > > > > to GCC v6.x C++ classes' style: > > https://github.com/xiangzhai/dragonegg/blob/gcc-6_3-branch/src/Back > > end.cpp#L2072 > > > > > > const pass_data pass_data_rtl_emit_function = { > > RTL_PASS, /* type */ > > "rtl_emit_function", /* name */ > > OPTGROUP_NONE, /* optinfo_flags */ > > TV_NONE, /* tv_id */ > > PROP_ssa | PROP_gimple_leh | PROP_cfg, /* properties_required */ > > 0, /* properties_provided */ > > PROP_ssa | PROP_trees, /* properties_destroyed */ > > 0, /* todo_flags_start */ > > 0, /* todo_flags_finish */ > > }; > > > > class pass_rtl_emit_function : public rtl_opt_pass { > > public: > > pass_rtl_emit_function(gcc::context *ctxt) > > : rtl_opt_pass(pass_data_rtl_emit_function, ctxt) {} > > > > unsigned int execute(function *) { return rtl_emit_function(); } > > > > opt_pass *clone() { return this; } > > }; > > > > > > GCC v4.6 will call the callback `rtl_emit_function`, but GCC v6.x > > will > > not, did I forget something? is there some options need to be set? > > please give me some hint, thanks a lot! > > > > PS: GCC v6.x *call* the callback `rtl_emit_function` > > https://github.com/xiangzhai/dragonball/blob/master/tests/plugin.cp > > p#L67 > > in this testcase, I will check the source code about > > register_callback, rtl_opt_pass, and opt_pass. > > > >