Next: Caller Saves, Previous: Scalar Return, Up: Stack and Calling
当函数值的机器模式为BLKmode
(并且在一些其它情况下),
值不根据TARGET_FUNCTION_VALUE
来返回(参见Scalar Return)。
替代的,调用者传递内存块的地址。
该地址被称为结构体地址(structure value address)。
这一节描述了如何控制在内存中返回结构体值。
该target钩子应该返回一个非零值,来指明在内存中返回函数值, 正如返回大的结构体的方式。这里type为值的数据类型, fntype为函数的类型,或者
NULL
,如果是libcall。注意模式
BLKmode
的值必须被该函数显示的处理。 而且,选项-fpcc-struct-return将会其作用, 而不管该宏如何定义。在大多数系统上,可能会没有定义该钩子; 这将使用一个缺省定义,其值为常数1对于BLKmode
值,其它的为0。不要使用该宏来指示结构体和联合体应该总是在内存中返回。 你应该使用
DEFAULT_PCC_STRUCT_RETURN
来做这件事情。
定义该宏为1,如果所有的结构体和联合体返回值必须在内存中。 由于这将使得代码变慢,所以应该只有需要与其它编译器或者ABI兼容时才定义。 如果你定义了该宏为0, 则对于结构体和联合体返回值的约定则由
TARGET_RETURN_IN_MEMORY
target钩子来决定。如果没有定义,将缺省为1。
该target钩子应该返回结构体值的地址位置(通常为
mem
或者reg
), 或者0,如果地址作为“不可视”的第一个参数传递。 注意fndecl可以为NULL
,对于libcall。 你不需要定义该target钩子,如果地址总是作为“不可视”的第一个参数传递。在一些体系结构上, 被调用函数寻找结构体值地址的地方与调用者放入的地方不相同。 这可能是由于寄存器窗口,或者函数序言将其移动到一个不同的地方。 incoming为
1
或者2
, 当地址在被调用函数的上下文中需要, 为0
如果在调用者的上下文中需要。如果incoming为非0并且地址是在栈中找到, 则返回一个
mem
,其引用帧指针。 如果incoming为2
, 则结果用于在函数的起始处获取结构体值的地址。 如果你需要输出调整代码,你应该在这里进行。