私は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 ダンプにグローバル変数のマングルされた名前を持つ追加のノードがあります (非静的な場合)。
これを解決する方法はありますか?