Уровень области видимости переменных с плагином GCC
Я пытаюсь написать простой плагин GCC, который идентифицирует все объявления переменных (глобальные и локальные) и их область действия, до сих пор я смог определить только локальные / глобальные.
Я бы хотел сделать что-то вроде:
int a = 3; /* Scope 0. */
int main()
{
int a; /* Scope 1. */
a = 5;
{
int a; /* Scope 2 and so on... */
a = 9;
}
}
и мой реальный код выглядит так:
static void handle_finish_type (void *gcc_data, void *user_data)
{
(void) user_data;
tree t = (tree) gcc_data;
/* Skip everything that is not var decl. */
if (TREE_CODE (t) == VAR_DECL)
printf("scope: %d\n", TREE_PUBLIC(t));
}
int plugin_init (struct plugin_name_args *plugin_info,
struct plugin_gcc_version *version)
{
(void) version;
const char *plugin_name = plugin_info->base_name;
struct plugin_info pi = { "0.1", "Variable scope test" };
register_callback (plugin_name, PLUGIN_INFO, NULL, &pi);
register_callback (plugin_name, PLUGIN_FINISH_DECL,
&handle_finish_type, NULL);
return 0;
}
Я не знаю, возможно ли это с помощью плагинов, и если да, то какой проход следует искать и / или какую функцию / макрос следует использовать для этого?