4

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

测试.c:

int main(void) {
  return 0;
}

我想把它变成:

int fake_var;

int main(void) {
  return 0;
}

那可能吗?如果可能的话,在哪一关,我该怎么做?

4

5 回答 5

2

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

于 2014-09-25T02:47:17.317 回答
1

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

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

gcc -Dgvar=10 gcc.c

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

于 2014-09-23T17:11:10.677 回答
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

于 2015-06-19T16:49:38.273 回答
0

嗯,没有。不。你为什么想要?你不能使用它。

您可以获得的最接近的方法是在新.c文件中定义变量并将其单独链接,但仍然必须在for中声明(使用extern)才能使用它。test.ctest.c

于 2014-09-23T14:54:39.703 回答
0

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

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

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

但是您必须单独构建该 c 文件,因为该文件将添加到所有编译单元中。

于 2014-09-23T15:34:52.577 回答