10

Cファイルが与えられた場合、gccは、発生したすべての関数呼び出しのリストを、呼び出し自体と関数の宣言の両方のファイル名と行番号とともに吐き出すことができますか?

gcc は -g を使用してこの情報を何らかの形で保持し (デバッガーはそれに依存します)、-dr を使用して制御フロー グラフをダンプできることを知っています (ただし、ファイル名や行番号はありません)。しかし、gcc 出力を受け取り、私が望むことを行うすぐに使用できるツールはありますか?

そのようなツールで gcc を使用したい理由は、ツールが独自のプリプロセッサに依存している場合でも、ほとんどの gcc ベースのソフトウェアに付属している標準のビルド システム (./configure && make など) で使用できるようにするためです。および/またはパーサーは、適合するのが非常に面倒です。私はすでに、ctags などのいくつかのそのようなツールを認識しています。したがって、この質問は質問 525899のフォローアップです。

4

3 に答える 3

10

gcc オプションを試してください-fdump-tree-fixupcfg-lineno

比較的単純なレクサーまたは任意の正規表現エンジンを使用して簡単に解析できる方法で、AST 解析 (行番号付き) を「きれいに印刷」します。「=」が前にあり、「(」が後に続くすべての非キーワードを検索するだけです。これは関数呼び出しになります。

すべての複雑な式は複数の行に分割されるため、2 つの関数呼び出しが 1 行に表示されることはありません。

簡単なプログラムを見てみましょう:

#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;
}

でコンパイルすると-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

}

複雑な式は得られません。代入と関数呼び出しだけで、CPP マクロはなく、非常に簡単に解析できます。ループと条件は、それほど難しくはありません。

于 2009-03-30T17:21:31.657 に答える
3
于 2009-12-11T16:52:27.857 に答える