Next: , Previous: Scalar Return, Up: Stack and Calling


17.10.9 如何返回大的值

当函数值的机器模式为BLKmode(并且在一些其它情况下), 值不根据TARGET_FUNCTION_VALUE来返回(参见Scalar Return)。 替代的,调用者传递内存块的地址。 该地址被称为结构体地址(structure value address)。

这一节描述了如何控制在内存中返回结构体值。

— Target Hook: bool TARGET_RETURN_IN_MEMORY (tree type, tree fntype)

该target钩子应该返回一个非零值,来指明在内存中返回函数值, 正如返回大的结构体的方式。这里type为值的数据类型, fntype为函数的类型,或者NULL,如果是libcall。

注意模式BLKmode的值必须被该函数显示的处理。 而且,选项-fpcc-struct-return将会其作用, 而不管该宏如何定义。在大多数系统上,可能会没有定义该钩子; 这将使用一个缺省定义,其值为常数1对于BLKmode值,其它的为0。

不要使用该宏来指示结构体和联合体应该总是在内存中返回。 你应该使用DEFAULT_PCC_STRUCT_RETURN来做这件事情。

— Macro: DEFAULT_PCC_STRUCT_RETURN

定义该宏为1,如果所有的结构体和联合体返回值必须在内存中。 由于这将使得代码变慢,所以应该只有需要与其它编译器或者ABI兼容时才定义。 如果你定义了该宏为0, 则对于结构体和联合体返回值的约定则由TARGET_RETURN_IN_MEMORY target钩子来决定。

如果没有定义,将缺省为1。

— Target Hook: rtx TARGET_STRUCT_VALUE_RTX (tree fndecl, int incoming)

该target钩子应该返回结构体值的地址位置(通常为mem或者reg), 或者0,如果地址作为“不可视”的第一个参数传递。 注意fndecl可以为NULL,对于libcall。 你不需要定义该target钩子,如果地址总是作为“不可视”的第一个参数传递。

在一些体系结构上, 被调用函数寻找结构体值地址的地方与调用者放入的地方不相同。 这可能是由于寄存器窗口,或者函数序言将其移动到一个不同的地方。 incoming1或者2, 当地址在被调用函数的上下文中需要, 为0如果在调用者的上下文中需要。

如果incoming为非0并且地址是在栈中找到, 则返回一个mem,其引用帧指针。 如果incoming2, 则结果用于在函数的起始处获取结构体值的地址。 如果你需要输出调整代码,你应该在这里进行。

— Macro: PCC_STATIC_STRUCT_RETURN

定义该宏,如果在target机器上的通常的系统约定, 对于返回结构体和联合体,为被调用函数返回包含该值的静态变量的地址。

不要定义该宏,如果通常的系统约定为调用者将地址传给子程序。

该宏具有-fpcc-struct-return模式下的效果, 但是当你使用-freg-struct-return模式时,其将不做任何事。