注意:我意识到我的问题并不清楚。我现在已经修改了它,并为首先犯的错误道歉。
我有一个要在嵌入式系统上运行的大型C 项目。我使用ARM 编译器。代码分布在多个子文件夹中,由 .c 和 .h 文件组成。
我想盘点一下什么函数被调用了多少次,这样我就可以识别死代码,也可以加速最常用的函数。ARM 编译器有一些用于删除无法访问的代码的选项,当函数指针起作用时它会失败所以,我想遍历代码的每个分支并记录对函数的调用次数。
例如(这是一个非常简单的程序来演示我在寻找什么,而不是原始代码):
void foo1(void)
{
printf("Number is divisible by 5");
}
void foo2(void)
{
printf("Number is divisible by 10");
}
void foo3(void)
{
printf("Number is divisible by neither 10 nor 5");
}
void foo4(void)
{
printf("foo4 called");
}
int main (void)
{
int x;
x = rand (11);
if (! x%10)
{
foo2();
foo1();
}
else if (! x%5) foo1();
else foo3();
return 0;
}
我想运行整个代码以便访问 if 分支的所有部分(即 foo1、foo2 和 foo3)。这将帮助我确定哪个函数被调用了多少次。在上面的示例中,foo1() 的调用频率高于 foo2(),而 foo4() 从未被调用。因此,识别和删除 foo4() 并优化 foo1() 是有意义的。
运行整个代码的任何想法/工具?
我认为的一种方法是修改 main 函数,如下所示:
int main (void)
{
int x ;
x = rand (11);
//*************************************************
//starting modification
int a = 1; //added by me
if_1: //added by me
if (a == 1)
{
foo1(); //original code
foo2(); //original code
a=2; //added by me
goto if_1; //added by me
}
else if (a==2)
{
foo2(); //original code
a=3; //added by me
goto if_1: //added by me
}
else foo3(); //original code
//end of modification
//********************************************************
return 0;
}
这样它就可以通过原始代码运行。知道如何进行这种类型的修改吗?