注: 私の質問が明確ではなかったことを認識しています。私は今それを修正しました。そもそも間違いを犯してしまったことをお詫びします。
組み込みシステムで実行する大規模な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() を最適化することは理にかなっています。
コード全体を実行するためのアイデア/ツールはありますか?
私が考えた方法の 1 つは、メイン関数を次のように変更することでした。
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;
}
このようにして、元のコードを実行します。このタイプの変更方法について何か考えはありますか?