Next: Storage Layout, Previous: Run-time Target, Up: Target Macros
如果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_status
和restore_machine_status
函数指针来处理target特定信息的保存和恢复。
由于单数据区域的方法不再被使用了,这些指针也不再被支持。