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

Leslie Zhai lesliezhai@llvm.org.cn
Fri Aug 4 02:29:00 GMT 2017


Hi David,

Thanks for your kind response!


在 2017年08月03日 21:54, David Malcolm 写道:
> 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?

The warning disappeared after recompiled GCC v6.3


>
>> 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.

Add as your suggestion. 
https://github.com/xiangzhai/dragonegg/blob/gcc-6_3-branch/src/Backend.cpp#L2110


>
> Is this definitely the correct pass?  What does
>
>     (gdb) p *pass
>
> print?

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c7b730) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
...
(gdb) p pass->name
$1 = 0x11a2369 "*warn_unused_result"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86270) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$2 = 0x1181b98 "*diagnose_omp_blocks"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c862d0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$3 = 0x119d740 "*diagnose_tm_blocks"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86330) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$4 = 0x1181bad "omplower"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86390) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$5 = 0x11be968 "lower"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c863f0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$6 = 0x119d738 "tmlower"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86450) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$7 = 0x11a711e "ehopt"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c864b0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$8 = 0x119b9cf "eh"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86510) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$9 = 0x11972bb "cfg"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86570) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$10 = 0x11a237d "*warn_function_return"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c865d0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$11 = 0x1181bc0 "ompexp"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86630) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$12 = 0x114b9f2 "*build_cgraph_edges"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c7b730) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$13 = 0x11a2369 "*warn_unused_result"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86270) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$14 = 0x1181b98 "*diagnose_omp_blocks"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c862d0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$15 = 0x119d740 "*diagnose_tm_blocks"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86330) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$16 = 0x1181bad "omplower"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86390) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$17 = 0x11be968 "lower"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c863f0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$18 = 0x119d738 "tmlower"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86450) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$19 = 0x11a711e "ehopt"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c864b0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$20 = 0x119b9cf "eh"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86510) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$21 = 0x11972bb "cfg"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86570) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$22 = 0x11a237d "*warn_function_return"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c865d0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$23 = 0x1181bc0 "ompexp"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86630) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$24 = 0x114b9f2 "*build_cgraph_edges"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86690) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$25 = 0x11c48af "*free_lang_data"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c866f0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$26 = 0x1733a04 "visibility"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86750) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$27 = 0x1174ac2 "chkp_versioning"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c867b0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$28 = 0x1174ab4 "chkp_ecleanup"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86810) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$29 = 0x11875e7 "build_ssa_passes"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86870) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$30 = 0x11a235f "fixup_cfg"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c868d0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$31 = 0x11bd439 "*init_datastructures"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86930) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$32 = 0x119be9c "ssa"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86990) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$33 = 0x16bc156 "*nonnullcmp"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c869f0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$34 = 0x119c247 "ubsan"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86a50) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$35 = 0x11bcf84 "*early_warn_uninitialized"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86ab0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$36 = 0x16c2588 "nothrow"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86870) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$37 = 0x11a235f "fixup_cfg"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c868d0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$38 = 0x11bd439 "*init_datastructures"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86930) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$39 = 0x119be9c "ssa"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86990) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$40 = 0x16bc156 "*nonnullcmp"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c869f0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$41 = 0x119c247 "ubsan"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86a50) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$42 = 0x11bcf84 "*early_warn_uninitialized"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86ab0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$43 = 0x16c2588 "nothrow"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86b10) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$44 = 0x11875db "chkp_passes"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86c90) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$45 = 0x11875ca "opt_local_passes"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86cf0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$46 = 0x11a235f "fixup_cfg"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86d50) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$47 = 0x114b9dc "*rebuild_cgraph_edges"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86db0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$48 = 0x11777bd "inline_param"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86e10) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$49 = 0x16c1baa "einline"
...
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86e70) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$51 = 0x11875b6 "early_optimizations"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c87550) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$52 = 0x11bda8d "release_ssa"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c875b0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$53 = 0x114b9dc "*rebuild_cgraph_edges"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c87610) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$54 = 0x11777bd "inline_param"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86cf0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$55 = 0x11a235f "fixup_cfg"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86d50) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$56 = 0x114b9dc "*rebuild_cgraph_edges"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86db0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$57 = 0x11777bd "inline_param"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86e10) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$58 = 0x16c1baa "einline"
...
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c86e70) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$60 = 0x11875b6 "early_optimizations"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c87550) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$61 = 0x11bda8d "release_ssa"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c875b0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$62 = 0x114b9dc "*rebuild_cgraph_edges"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c87610) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$63 = 0x11777bd "inline_param"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c87670) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$64 = 0x11b67d5 "ipa_oacc"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c87b10) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$65 = 0x1174aa7 "chkp_cleanup"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c87b70) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$66 = 0x16b5c18 "afdo"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c87bd0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$67 = 0x11790ca "free-inline-summary"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c87c30) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$68 = 0x119b6d4 "profile"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c87cf0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$69 = 0x11c35d3 "increase_alignment"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c87d50) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$70 = 0x119d713 "tmipa"
(gdb) c
Continuing.

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c87db0) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
$71 = 0x11a8196 "emutls"
(gdb) c
Continuing.
DEBUG: /data/project/xiangzhai/dragonegg/src/Backend.cpp, line 2187: 
llvm_emit_globals
DEBUG: /data/project/xiangzhai/dragonegg/src/Backend.cpp, line 791: 
InitializeBackend: x86_64-redhat-linux-gnu
DEBUG: /data/project/xiangzhai/dragonegg/src/Backend.cpp, line 554: 
CreateTargetMachine: test/hello.c
^[[ADEBUG: /data/project/xiangzhai/dragonegg/src/Backend.cpp, line 719: 
CreateModule: e-m:e-i64:64-f80:128-n8:16:32:64-S128
DEBUG: /data/project/xiangzhai/dragonegg/src/Backend.cpp, line 2122: 
emit_file_scope_asms
DEBUG: /data/project/xiangzhai/dragonegg/src/Backend.cpp, line 2147: 
emit_cgraph_weakrefs
DEBUG: /data/project/xiangzhai/dragonegg/src/Backend.cpp, line 2162: 
emit_varpool_weakrefs
DEBUG: /data/project/xiangzhai/dragonegg/src/Backend.cpp, line 687: 
output_ident:       .ident  "GCC: (GNU) 6.3.0 LLVM: 3.9.1"
DEBUG: /data/project/xiangzhai/dragonegg/src/Backend.cpp, line 2280: 
llvm_finish_unit
Pass Arguments:  -targetlibinfo
Pass Arguments:  -assumption-cache-tracker -profile-summary-info 
-targetlibinfo -forceattrs -basiccg -always-inline

Execution times (seconds)
  phase setup             :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 
0%) wall    1071 kB (66%) ggc
  phase parsing           :   0.01 (50%) usr   0.00 ( 0%) sys   0.01 ( 
0%) wall     527 kB (33%) ggc
  phase opt and generate  :   0.01 (50%) usr   0.01 (100%) sys 588.89 
(100%) wall      15 kB ( 1%) ggc
  phase last asm          :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.03 ( 
0%) wall       0 kB ( 0%) ggc
  callgraph construction  :   0.00 ( 0%) usr   0.00 ( 0%) sys  84.67 
(14%) wall       1 kB ( 0%) ggc
  callgraph optimization  :   0.00 ( 0%) usr   0.00 ( 0%) sys 503.77 
(86%) wall       2 kB ( 0%) ggc
  ipa lto gimple out      :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 
0%) wall       0 kB ( 0%) ggc
  lexical analysis        :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 
0%) wall       0 kB ( 0%) ggc
  parser (global)         :   0.01 (50%) usr   0.00 ( 0%) sys   0.00 ( 
0%) wall     283 kB (17%) ggc
  tree gimplify           :   0.00 ( 0%) usr   0.01 (100%) sys   0.00 ( 
0%) wall       1 kB ( 0%) ggc
  plugin execution        :   0.01 (50%) usr   0.00 ( 0%) sys   0.47 ( 
0%) wall       0 kB ( 0%) ggc
  TOTAL                 :   0.02             0.01 588.94               
1622 kB
[Inferior 1 (process 26374) exited normally]
(gdb)


so strange: *NO* rtl_emit_function PASS at all!

but gcc plugin testcase has it:

/opt/gcc-6.3/bin/gcc -fplugin=./plugin.so 1.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 
1.c 
-iplugindir=/opt/gcc-6.3/lib/gcc/x86_64-redhat-linux-gnu/6.3.0/plugin 
-quiet -dumpbase 1.c -mtune=generic -march=x86-64 -auxbase 1 
-fplugin=./plugin.so -o /tmp/ccnGZ571.s
...
DEBUG: plugin.cpp, line 64: llvm_start_unit

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c7b730) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
Missing separate debuginfos, use: dnf debuginfo-install 
gmp-6.1.1-1.fc25.x86_64 libgcc-6.4.1-1.fc25.x86_64 
libmpc-1.0.2-5.fc24.x86_64 mpfr-3.1.5-1.fc25.x86_64
(gdb) p pass->name
$1 = 0x11a2369 "*warn_unused_result"
(gdb) c
Continuing.

...

Breakpoint 1, execute_one_pass (pass=pass@entry=0x1c66370) at 
../../gcc/passes.c:2288
2288      current_pass = pass;
(gdb) p pass->name
warning: RTTI symbol not found for class 'pass_rtl_emit_function'
$81 = 0x7fffefe5561c "rtl_emit_function"
(gdb) s
2292      gate_status = pass->gate (cfun);
(gdb) s
opt_pass::gate (this=0x1c66370) at ../../gcc/passes.c:95
95      }
(gdb)


I need to deepin to it :)

>
>
> 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 <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.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.
>>>
>>

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





More information about the Gcc mailing list