Next: , Previous: Register Arguments, Up: Stack and Calling


17.10.8 标量函数值如何被返回

这节讨论了控制返回标量值的宏,值可以放在寄存器中。

— Target Hook: rtx TARGET_FUNCTION_VALUE (tree ret_type, tree fn_decl_or_type, bool outgoing)

定义该宏返回一个RTX,用来表示函数返回或者接受数据类型为ret_type的值的 地方。ret_type为一个树节点,表示一个数据类型。 fn_decl_or_type为一个树节点,表示被调用的函数的FUNCTION_DECL或者 FUNCTION_TYPE。如果outgoing为假, 则钩子应该计算调用者将要看到返回值的寄存器。否则,钩子应该返回一个RTX, 其表示函数在哪儿返回一个值。

在许多机器上,只有TYPE_MODE (ret_type)是相关的。 (实际上,在大多数机器上,标量值不管机器模式如何,都在同一地方返回。) 表达式的值通常为一个硬件寄存器的reg RTX,为存放返回值的地方。 该值还可以为一个parallel RTX,如果返回值在多个地方。 对于parallel形式的解释,参见FUNCTION_ARG。 m68k port使用了这种parallel类型来返回指针, 在‘%a0’(规范化位置) 和‘%d0’中。

如果TARGET_PROMOTE_FUNCTION_RETURN返回真,如果valtype为一个标量类型, 则你必须应用在PROMOTE_MODE中指定的相同的提升规则。

如果确切的知道被调用的函数,则func为它的树节点(FUNCTION_DECL); 否则,func为一个空指针。这是的可以使用不同的值返回约定, 对于所有调用都知道的特定的函数。

一些target机器具有“寄存器窗口”, 这使得函数返回它的值所用的寄存器与调用者看到值所在的寄存器不同。 对于这样的机器,你应该返回不同的RTX,根据outgoing

TARGET_FUNCTION_VALUE不用于返回聚合数据类型的值, 因为这些通过其它方式返回。参见下面的TARGET_STRUCT_VALUE_RTX以及相关的宏。

— Macro: FUNCTION_VALUE (valtype, func)

该宏已经不赞成被使用。对于新的target,使用TARGET_FUNCTION_VALUE来替代。

— Macro: LIBCALL_VALUE (mode)

一个C表达式,用来创建一个RTX,表示库函数返回模式mode的值的地方。 如果确切的知道被调用的函数,则func为它的树节点(FUNCTION_DECL); 否则func为一个空指针。这使得可以使用不同的值返回约定, 对于所有调用都知道的特定的函数。

注意“库函数”在该上下文中意味着是编译器支持的程序,用于执行算术运算, 其名字由编译器知道并且没有在被编译的C代码中提到。

— Target Hook: rtx TARGET_LIBCALL_VALUE (enum machine_mode mode, const_rtx fun)

Define this hook if the back-end needs to know the name of the libcall function in order to determine where the result should be returned.

The mode of the result is given by mode and the name of the called library function is given by fun. The hook should return an RTX representing the place where the library function result will be returned.

If this hook is not defined, then LIBCALL_VALUE will be used.

— Macro: FUNCTION_VALUE_REGNO_P (regno)

A C expression that is nonzero if regno is the number of a hard register in which the values of called function may come back.

A register whose use for returning values is limited to serving as the second of a pair (for a value of type double, say) need not be recognized by this macro. So for most machines, this definition suffices:

          #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0)

If the machine has register windows, so that the caller and the called function use different registers for the return value, this macro should recognize only the caller's register numbers.

This macro has been deprecated. Use TARGET_FUNCTION_VALUE_REGNO_P for a new target instead.

— Target Hook: bool TARGET_FUNCTION_VALUE_REGNO_P (const unsigned int regno)

A target hook that return true if regno is the number of a hard register in which the values of called function may come back.

A register whose use for returning values is limited to serving as the second of a pair (for a value of type double, say) need not be recognized by this target hook.

If the machine has register windows, so that the caller and the called function use different registers for the return value, this target hook should recognize only the caller's register numbers.

If this hook is not defined, then FUNCTION_VALUE_REGNO_P will be used.

— Macro: APPLY_RESULT_SIZE

Define this macro if ‘untyped_call’ and ‘untyped_return’ need more space than is implied by FUNCTION_VALUE_REGNO_P for saving and restoring an arbitrary return value.

— Target Hook: bool TARGET_RETURN_IN_MSB (tree type)

该钩子应该返回真,如果类型type的值按照在寄存器中的最高有效位返回 (换句话说,如果他们在最低有效位进行被padded)。 你可以假设该type在寄存器中被返回;调用者被要求进行该检查。

注意TARGET_FUNCTION_VALUE提供的寄存器必须能够保存完整的返回值。 例如,如果一个1,2或者3字节的结构体被返回,按照4字节寄存器中的最高有效位的方式, 则TARGET_FUNCTION_VALUE应该提供一个SImode rtx。