Next: , Previous: File Framework, Up: Assembler Format


17.21.2 数据的输出

— Target Hook: const char * TARGET_ASM_BYTE_OP
— Target Hook: const char * TARGET_ASM_ALIGNED_HI_OP
— Target Hook: const char * TARGET_ASM_ALIGNED_SI_OP
— Target Hook: const char * TARGET_ASM_ALIGNED_DI_OP
— Target Hook: const char * TARGET_ASM_ALIGNED_TI_OP
— Target Hook: const char * TARGET_ASM_UNALIGNED_HI_OP
— Target Hook: const char * TARGET_ASM_UNALIGNED_SI_OP
— Target Hook: const char * TARGET_ASM_UNALIGNED_DI_OP
— Target Hook: const char * TARGET_ASM_UNALIGNED_TI_OP

这些钩子指定了用于创建特定类型的整数对象的汇编伪指令。 TARGET_ASM_BYTE_OP伪指令创建一个字节大小的对象, TARGET_ASM_ALIGNED_HI_OP创建一个两个字节对齐的对象,等等。 这些钩子都可以为NULL,这表示没有合适的伪指令。

编译器将在一个新行中的起始处打印这些字符串,随后紧跟对象的初始化值。 大多数情况下,字符串应该包含一个tab,一个伪操作符,然后是另一个tab。

— Target Hook: bool TARGET_ASM_INTEGER (rtx x, unsigned int size, int aligned_p)

函数assemble_integer使用该钩子来输出一个整数对象。x为对象的值, size为它的以字节为单位的大小,aligned_p指示其是否为对齐的。 函数应该返回真,如果它能够输出对象。如果返回假, 则assemble_integer将尝试把对象分割为更小的部分。

该钩子的缺省实现将使用TARGET_ASM_BYTE_OP字符串家族, 当相应字符串为NULL时返回假。

— Target Hook: bool TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA (FILE *file, rtx x)

A target hook to recognize rtx patterns that output_addr_const can't deal with, and output assembly code to file corresponding to the pattern x. This may be used to allow machine-dependent UNSPECs to appear within constants.

If target hook fails to recognize a pattern, it must return false, so that a standard error message is printed. If it prints an error message itself, by calling, for example, output_operand_lossage, it may just return true.

— Macro: OUTPUT_ADDR_CONST_EXTRA (stream, x, fail)

一条C语句用来识别output_addr_const不能处理的rtx模式, 并输出汇编代码到模式x对应的stream中。 这可以用来允许在常量中出现机器相关的UNSPEC

如果OUTPUT_ADDR_CONST_EXTRA没有能够识别出指令模式, 其必须goto fail, 这样就会打印出一个标准错误消息。 如果其本身打印了一个错误消息, 例如通过调用output_operand_lossage,其可以正常的结束。

— Macro: ASM_OUTPUT_ASCII (stream, ptr, len)

一条C语句,用来输出到stdio流stream中一条汇编指令, 以组合一个在ptr处包含len个字节的字符串常量。 ptr将为一个char *类型的C表达式, len为一个int型的C表达式。

如果汇编器具有一个.ascii伪指令,正如在Berkeley Unix汇编器上的, 则不要定义宏ASM_OUTPUT_ASCII

— Macro: ASM_OUTPUT_FDESC (stream, decl, n)

一条C语句,用来输出decl的函数描述符的字n。 这必须在定义TARGET_VTABLE_USES_DESCRIPTORS时被定义,否则将不起作用。

— Macro: CONSTANT_POOL_BEFORE_FUNCTION

你可以定义该宏为一个C表达式。你应该定义表达式具有非零值, 如果GCC应该在输出函数的代码前,输出常量池,或者定义为0, 如果GCC应该在函数后输出常量池。如果你不定义该宏,则通常情况下, GCC将在函数前输出常量池。

— Macro: ASM_OUTPUT_POOL_PROLOGUE (file, funname, fundecl, size)

一条C语句,用来输出汇编命令,以定义函数的常量池的起始。 funname为一个字符串,给定了函数的名字。如果需要函数的返回类型, 则可以通过fundecl来获得。 size为在该调用之后要立即写入的常量池的大小,以字节为单位。

通常情况下,如果不需要常量池前缀,该宏不需要被定义。

— Macro: ASM_OUTPUT_SPECIAL_POOL_ENTRY (file, x, mode, align, labelno, jumpto)

一条C语句(带有或者不带有分号),用来输出一个常量在常量池中, 如果其需要特殊的处理。(该宏对于可以正常输出的RTL表达式不需要做任何事情。)

参数file为将汇编代码输出到的标准I/O流。x为要输出的常量的RTL表达式, mode为机器模式(用于x为‘const_int’时)。 align为值x所需要的对齐;你应该输出一个汇编伪指令来执行该对齐。

参数labelno为该池中实体的地址的内部标号的编号。 该宏的定义负责在合适的地方输出标号的定义。这里有一个实现的例子:

          (*targetm.asm_out.internal_label) (file, "LC", labelno);

当你专门输出一个池中实体时,你应该结束于一个goto, 以跳转到标号jumpto。这将阻止相同的池中实体通过通常的方式被再一次输出。

如果不做任何事情,则不要定义该宏。

— Macro: ASM_OUTPUT_POOL_EPILOGUE (file funname fundecl size)

一条C语句,用来输出汇编命令到函数常量池的结尾。funname为一个字符串, 给出了函数的名字。如果需要函数的返回类型,可以通过fundecl来获得。 size为GCC在该调用之前立即写入的常量池的大小,以字节为单位。

通常情况下,如果不需要常量池结束语,则不需要定义该宏。

— Macro: IS_ASM_LOGICAL_LINE_SEPARATOR (C, STR)

定义该宏为一个C表达式,其为非零,如果C被汇编器用作逻辑行分隔符。 STR指向在字符串中C被发现的位置; 这可以用于行分隔符使用多个字符的时候。

如果你不定义该宏,则缺省的为只将字符‘;’作为逻辑行的分隔符。

— Target Hook: const char * TARGET_ASM_OPEN_PAREN
— Target Hook: const char * TARGET_ASM_CLOSE_PAREN

这些target钩子为C字符串常量,描述了算术表达式组合的汇编语法。 如果没有被覆盖,它们缺省为通常的括号,这对大多数汇编器都是正确的。

这些宏由real.h提供,用于写ASM_OUTPUT_DOUBLE等的定义:

— Macro: REAL_VALUE_TO_TARGET_SINGLE (x, l)
— Macro: REAL_VALUE_TO_TARGET_DOUBLE (x, l)
— Macro: REAL_VALUE_TO_TARGET_LONG_DOUBLE (x, l)
— Macro: REAL_VALUE_TO_TARGET_DECIMAL32 (x, l)
— Macro: REAL_VALUE_TO_TARGET_DECIMAL64 (x, l)
— Macro: REAL_VALUE_TO_TARGET_DECIMAL128 (x, l)

这些将类型为REAL_VALUE_TYPEx,转换为target的浮点表示, 并将其存储在变量l中。 对于REAL_VALUE_TO_TARGET_SINGLEREAL_VALUE_TO_TARGET_DECIMAL32, 该变量应该为一个简单的long int。对于其它的, 其应该为一个long int的数组。 该数组的元素个数由所需要的target浮点数据类型的大小决定: 每个long int数组元素有32位。每个数组元素存放32位的结果, 即使long int在host机器上比32位宽。

数组元素值被设计成, 可以使用fprintf按照在target机器内存中的顺序来打印它们。