1

私はgcc 4.6プラグインAPIで遊んでいます。便宜上、API に Python ラッパー/プラグインを使用します。

私の目標は、次のようにすべての変数の宣言を見つけることです。

  • グローバル スコープ
  • constではなく
  • 静的ではない (エクスポートまたは可視を意味する)

コンパイル単位で警告を発します。例:

int glob;              // exported
static int moduleGlob; // not exported
const int aModConst=42;
int f() {static int inner; return inner;}

「グロブ」を生成する必要があります

「関数/クラスの外側」と「const」は簡単ですが、「静的」修飾子を取得できません。

グローバル名前空間サブツリーをクロールして、const フラグを持たない VAR_DECL ノードを監視しています。

しかし、「static」キーワードはどのように処理されるのでしょうか? ビットフィールド フラグの 1 つではないようです。また、ノードの「静的述語」は誤解を招く可能性があります。これは、変数が静的ストレージに格納されると単純に言っているためです(glob は格納されますが、moduleGlob と inner も格納されます)。私の質問はむしろ「.soでエクスポートされますか」です

「extern」宣言はどうですか?それはASTでどのようにマッピングされていますか?

現在、* free_lang_data パスでこれを実行しようとしています (これは遅すぎますか?)

私がこれまでに持っている唯一のヒントはこれです: -fdump-tree-all スイッチを介してツリーをダンプすると、.tu ダンプにグローバル変数のマングルされた名前を持つ追加のノードがあります (非静的な場合)。

これを解決する方法はありますか?

4

1 に答える 1

0

ドキュメントから、DECL_THIS_STATICとを使用する必要があるようですDECL_THIS_EXTERN

于 2013-10-30T17:55:53.550 に答える