How to migrate struct rtl_opt_pass to class for GCC v6.x?

Leslie Zhai lesliezhai@llvm.org.cn
Thu Aug 3 09:22:00 GMT 2017


/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.
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?
(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/Backend.cpp#L2103



在 2017年08月03日 11:24, Leslie Zhai 写道:
> Hi GCC developers,
>
> As ChangeLog-2013 mentioned:
>
> 2013-08-05  David Malcolm <dmalcolm@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.cpp#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/Backend.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.cpp#L67 
> in this testcase, I will check the source code about 
> register_callback, rtl_opt_pass, and opt_pass.
>

-- 
Regards,
Leslie Zhai - a LLVM developer https://reviews.llvm.org/p/xiangzhai/





More information about the Gcc mailing list