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

应该产生“glob”

“函数/类之外”和“const”很容易,但我无法获得“静态”限定符。

我正在爬取全局命名空间子树并观察没有 const 标志的 VAR_DECL 节点。

但是“静态”关键字是如何处理的呢?它似乎不是位域标志之一。节点上的“静态谓词”也具有误导性,因为它只是说变量进入静态存储(glob 确实如此——还有 moduleGlob 和内部)。我的问题是“它会以 .so 格式导出”

那么“外部”声明呢?这在 AST 中是如何映射的?

目前我尝试在 *free_lang_data 传递中执行此操作(这是否为时已晚?)

到目前为止,我唯一的提示是:当通过 -fdump-tree-all 开关在 .tu 转储中转储树时,还有一个带有全局变量名称错误的附加节点(在非静态情况下)。

有什么想法可以解决这个问题吗?

4

1 回答 1

0

文档看来,您应该使用DECL_THIS_STATICand DECL_THIS_EXTERN

于 2013-10-30T17:55:53.550 回答