Next: , Previous: Run-time Target, Up: Target Macros


17.4 为基于每个函数的信息定义数据结构

如果target需要存储基于每个函数的信息,则GCC为此提供了一个宏和一些变量。 注意,只是使用静态变量来保存信息是一个糟糕的想法,因为GCC支持嵌套函数, 所以可能会在编码一个函数的中途遇到另一个。

GCC定义了称为struct function的数据结构体, 包含了特定于单个函数的所有数据。该结构体包含一个称为machine的域, 其类型为struct machine_function *, 可以被target用于指向它们自己的特定数据。

如果一个target需要基于每个函数的特定数据, 则应该定义类型struct machine_function, 以及宏INIT_EXPANDERS。 该宏将被用于初始化函数指针init_machine_status。 该指针将在下面说明。

一个典型的基于每个函数的target特定数据, 是用于创建一个RTX来存放含有函数返回地址的寄存器。 该RTX随后可以被用于实现__builtin_return_address函数。

注意,早期的GCC实现使用了单个数据区域来存放所有的基于每个函数的信息。 因此当开始处理嵌套函数时,旧式的基于每个函数的数据不得不被压入栈中, 并且当处理完成,还要出栈。 GCC曾经提供名为save_machine_statusrestore_machine_status 函数指针来处理target特定信息的保存和恢复。 由于单数据区域的方法不再被使用了,这些指针也不再被支持。

— Macro: INIT_EXPANDERS

被调用的宏,用来初始化任何target特定信息。 该宏在任何RTL生成开始之前,基于每个函数被调用一次。 该宏的目的是允许函数指针init_machine_status的初始化。

— Variable: void (*)(struct function *) init_machine_status

如果该函数指针非空,则会在函数编译开始之前,基于每个函数被调用一次, 用于允许target来执行对struct function结构体的任何target特定初始化。 它将被用于初始化那个结构体的machine域。

结构体struct machine_function将期望被GC来释放。通常, 它们所引用的任何内存都必须使用ggc_alloc来分配,包括结构体本身。