Next: Plugins, Previous: Header Dirs, Up: Top
GCC使用了一些相当复杂微妙的内存管理技术,包括从GCC源代码中确定GCC的数据结构的信息,并使用该信息来执行垃圾收集和实现预编译头文件。
使用完整的C解析器来完成这项工作会非常复杂,因此只解析C的有限子集,并且使用特定的标记来确定源代码的哪些部分需要分析。所有的struct
和union
声明,如果所定义的数据结构要在垃圾收集器的控制下进行分配,则必须被标记。所有的全局变量,如果所保存的指针是指向垃圾收集的内存,则也必须被标记。最后,所有的全局变量,如果需要通过预编译头文件来保存和恢复,则必须被标记。(预编译头文件机制只能保存标量,复杂的数据结构必须被分配在垃圾收集内存中,从而被保存在预编译头文件中。)
标记的完整格式是
GTY (([option] [(param)], [option] [(param)] ...))
不过大多数情况下,不需要选项。虽然这样,外面的双括号依然是必须的:GTY(())
。标记可以出现在:
static
或者 extern
之后;
这里有一些标记简单数据结构和全局变量的例子。
struct tag GTY(()) { fields... }; typedef struct tag GTY(()) { fields... } *typename; static GTY(()) struct tag *list; /* points to GC memory */ static GTY(()) int counter; /* save counter in a PCH */
解析器能够理解简单的typedef,例如typedef struct
tag *
name;
和typedef int
name;
。这些不需要被标记。