如何在gcc的-fdump-tree上使用“graph”选项?

时间:2018-04-17 11:32:10

标签: c testing gcc control-flow-graph

我正在尝试查看gcc是否可以提供更多信息,我可以使用它从C源代码创建控制流图,然后使用它来检查Gcov {{1}执行的测试用例采用的路径输出。到目前为止,我最好的候选人使用.gcov-fdump-tree-cfg选项(lineno),但由于节点信息是针对每个函数分开的,因此生成的文件仍然限制我。像这样:

-fdump-tree-cfg-lineno

这意味着我的解析器需要识别;; Function main (main, funcdef_no=13, decl_uid=3054, cgraph_uid=13, symbol_order=13) Removing basic block 7 Merging blocks 5 and 6 ;; 1 loops found ;; ;; Loop 0 ;; header 0, latch 1 ;; depth 0, outer -1 ;; nodes: 0 1 2 3 4 5 6 ;; 2 succs { 3 4 } ;; 3 succs { 5 } ;; 4 succs { 5 } ;; 5 succs { 6 } ;; 6 succs { 1 } main () { int number; int D.3066; <bb 2> [0.00%]: [evenodd.c:7:5] printf ([evenodd.c:7:12] "\nEnter a number: "); [evenodd.c:8:5] scanf ([evenodd.c:8:11] "%d", [evenodd.c:8:5] &number); [evenodd.c:10:2] number.0_1 = number; [evenodd.c:10:2] checkNegative (number.0_1); [evenodd.c:12:17] number.1_2 = number; [evenodd.c:12:17] number.2_3 = (unsigned int) number.1_2; [evenodd.c:12:17] _4 = number.2_3 & 1; [evenodd.c:12:7] if (_4 == 0) goto <bb 3>; [0.00%] else goto <bb 4>; [0.00%] <bb 3> [0.00%]: [evenodd.c:13:9] number.3_5 = number; [evenodd.c:13:9] printf ([evenodd.c:13:16] "%d is Even\n", number.3_5); [0:0] goto <bb 5>; [0.00%] <bb 4> [0.00%]: [evenodd.c:15:9] number.4_6 = number; [evenodd.c:15:9] printf ([evenodd.c:15:16] "%d is Odd\n", number.4_6); <bb 5> [0.00%]: [evenodd.c:18:9] D.3066 = 0; number = {CLOBBER}; <L4> [0.00%]: return D.3066; } ;; Function checkNegative (checkNegative, funcdef_no=14, decl_uid=3057, cgraph_uid=14, symbol_order=14) ;; 1 loops found ;; ;; Loop 0 ;; header 0, latch 1 ;; depth 0, outer -1 ;; nodes: 0 1 2 3 4 5 ;; 2 succs { 3 4 } ;; 3 succs { 5 } ;; 4 succs { 5 } ;; 5 succs { 1 } checkNegative (int number) { <bb 2> [0.00%]: [evenodd.c:23:4] if (number < 0) goto <bb 3>; [0.00%] else goto <bb 4>; [0.00%] <bb 3> [0.00%]: [evenodd.c:24:9] printf ([evenodd.c:24:16] "%d is Negative\n", number); [0:0] goto <bb 5>; [0.00%] <bb 4> [0.00%]: [evenodd.c:26:9] printf ([evenodd.c:26:16] "%d is Positive\n", number); <bb 5> [0.00%]: [evenodd.c:28:1] return; } 函数内的每个函数调用,然后合并它们的节点信息,这对我来说是一项非常艰巨的任务。

所以我来自this documentationmain -graph选项,但我不知道如何使用它。正如医生所描述的那样:

-fdump-tree

我不知道GraphViz是如何工作的,但是因为它能够将所有函数的子图渲染为单个图(我假设它意味着所有子图与主图合并为单个图),这意味着提供的信息通过‘graph’ For each of the other indicated dump files (-fdump-rtl-pass), dump a representation of the control flow graph suitable for viewing with GraphViz to file.passid.pass.dot. Each function in the file is pretty-printed as a subgraph, so that GraphViz can render them all in a single plot. This option currently only works for RTL dumps, and the RTL is always dumped in slim form. 更加完整,简化了创建控制流图的过程。

由于我无法理解它的含义,我尝试使用该选项(-graph),但结果仍然与-fdump-tree-cfg-lineno-graph的结果相同。

我该如何使用它?

1 个答案:

答案 0 :(得分:0)

解决方案很简单:

gcc -fdump-tree-all-graph main.c -o main

还可以看看:How can I dump an abstract syntax tree generated by gcc into a .dot file?

相关问题