使用gcc插件插入全局变量声明

时间:2014-09-23 14:51:51

标签: c++ c gcc plugins

我想知道是否可以使用gcc插件插入全局变量声明。例如,如果我有以下代码:

test.c的:

int main(void) {
  return 0;
}

我希望将其转换为:

int fake_var;

int main(void) {
  return 0;
}

这可能吗? 如果可能,通过哪个通道,我该怎么做?

5 个答案:

答案 0 :(得分:2)

我想你想看看varpool.c中的varpool_add_new_variable()。您应该能够将使用VAR_DECL类型构建的声明传递给它。同样地,看一下add_new_static_var(),但我认为前者是你想要的,因为它是专门添加的,允许在中间/后端声明全局变量。

答案 1 :(得分:1)

下面有一个创建全局整数var的例子:

//add_new_static_var, in cgraph.h
tree global_var = add_new_static_var(integer_type_node);
//if you want to name the var:
tree name = get_identifier("my_global_name");
DECL_NAME(global_var) = name;
/*AND if you have thought to use in another subsequent compilation, you 
  will need to give it an assembler name like this*/
change_decl_assembler_name(global_var, name);

请记住,在另一个编译中,您应该在之前的编译之后进行链接,您还需要声明全局变量,但是您必须在所有编译中声明所有变量与DECL_EXTERNAL(global_var)= 1原始的,只有一个编译(即原始:保存原始var的编译)你必须只添加属性TREE_PUBLIC(global_var)= 1

答案 2 :(得分:0)

嗯,没有。唐'吨。你为什么想要?你无法使用它。

您最接近的是在新.c文件中定义变量并将其单独链接,但仍需在extern中声明(test.c}让test.c使用它。

答案 3 :(得分:0)

您可以创建一个文件,其中包含要添加到输入文件顶部的代码,并使用-include yourfile选项。

建议预处理器在输入文件的顶部假设#include "yourfile"

看到这个问题:
Include header files using command line option?

但是你必须单独构建那个c文件,因为这个文件将被添加到所有编译单元。

答案 4 :(得分:0)

使用GCC -D选项你可以将值传递给C程序。 例如:

int main()
{
printf("global decl %d\n", gvar);
}
  

gcc -Dgvar = 10 gcc.c

这可能会提供您正在寻找的最接近的行为,尽管这不等同于全局变量声明。这是编译时的宏替换。