rei*_*ost 10 c gcc call-graph
在给定C文件的情况下,gcc可以吐出所有函数调用的列表,其中包含调用本身和函数声明的文件名和行号吗?
我知道gcc不知何故用-g(调试器依赖它)保留这些信息,并且它可以使用-dr转储控制流图(但没有文件名或行号); 但是有一个现成的工具,需要gcc输出并做我想要的吗?
我希望这样一个工具使用gcc的原因是,这将允许我使用大多数基于gcc的软件附带的标准构建系统(例如./configure && make),即使在依赖于他们自己的预处理器的工具的情况下也是如此和/或解析器是一个很大的麻烦.我已经知道了几个这样的工具,例如ctags.所以这个问题是问题525899的后续问题.
qrd*_*rdl 10
尝试gcc选项-fdump-tree-fixupcfg-lineno.
它将"漂亮地打印"解析AST(带行号)的方式可以使用相对简单的词法分析器或任何正则表达式引擎轻松解析.只需找到前面带有'='的所有非关键字,然后是'(' - 它将是函数调用.
所有复杂的表达式将被分成几行,因此一行上不会出现两个函数调用.
采取简单的程序:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI (3.1415926536)
int main(int argc, char *argv[]) {
double angle = PI / 2.0;
printf("Sine = %lf, cosine = %lf\n", sin(angle), cos(angle));
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
编译它,-fdump-tree-fixupcfg-lineno你得到这样的东西:
main (argc, argv)
{
double angle;
int D.3381;
double D.3380;
double D.3379;
# BLOCK 2, starting at line 8
# PRED: ENTRY (fallthru)
[test.c : 8] angle = 1.57079632680000003119857865385711193084716796875e+0;
[test.c : 9] D.3379 = [test.c : 9] cos (angle);
[test.c : 9] D.3380 = [test.c : 9] sin (angle);
[test.c : 9] printf (&"Sine = %lf, cosine = %lf\n"[0], D.3380, D.3379);
[test.c : 10] D.3381 = 0;
return D.3381;
# SUCC: EXIT
}
Run Code Online (Sandbox Code Playgroud)
你不会得到任何复杂的表达式 - 只是赋值和函数调用而且没有CPP宏,非常容易解析.循环和条件不会让事情变得更加困难.