How to migrate struct rtl_opt_pass to class for GCC v6.x?
Leslie Zhai
lesliezhai@llvm.org.cn
Wed Aug 16 09:32:00 GMT 2017
å¨ 2017å¹´08æ03æ¥ 17:21, Leslie Zhai åé:
> /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.
I found it!
with -flto option, for example: gcc -mmpx -fplugin=./plugin.so -flto
bare.c -wrapper gdb,--args
or add
flag_lto = "";
to the testcase plugin.cpp
https://github.com/xiangzhai/dragonball/blob/master/tests/plugin.cpp#L110
then pass_rtl_emit_function's execute will not be called, position_pass
(gcc/passes.c) failed to Insert the *new pass* info at the proper
position, then traverse the list of pass in the execute_pass_list_1,
there is *no* pass_rtl_emit_function at all, so execute_one_pass never
call its execute hook.
but as ChangeLog-2014 mentioned:
2014-11-13 Ilya Verbin <ilya.verbin@intel.com>
Ilya Tocar <ilya.tocar@intel.com>
Andrey Turetskiy <andrey.turetskiy@intel.com>
Bernd Schmidt <bernds@codesourcery.com>
...
Replace flag_lto with flag_generate_lto before lto_streamer_hooks_init.
...
why GCC v4.6 is still able to work
https://github.com/xiangzhai/dragonegg/blob/master/src/Backend.cpp#L1939
but GCC v6.x or v8.x (git-20170816) couldn't, please give me some hint
about the difference between GCC v4.6's LTO and GCC v6.x or v8.x (git),
thanks a lot!
>>
>
--
Regards,
Leslie Zhai - a LLVM developer https://reviews.llvm.org/p/xiangzhai/
More information about the Gcc
mailing list