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 <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.
--
Regards,
Leslie Zhai - a LLVM developer https://reviews.llvm.org/p/xiangzhai/