Next: , Up: Assembler Format


17.21.1 汇编文件的总体框架

这章描述了汇编文件的总体框架。

— Target Hook: void TARGET_ASM_FILE_START ()

将汇编器期望在文件起始处发现的任何文本输出到asm_out_file。 缺省行为由两个标志控制,将在下面介绍。除非你target的汇编器十分不常见, 如果你覆盖了缺省,则应该在你的target钩子上的某处调用default_file_start。 这将让其它target文件依赖于这些变量。

— Target Hook: bool TARGET_ASM_FILE_START_APP_OFF

如果该标记为真,则宏ASM_APP_OFF的文本将作为汇编文本的第一行被打印, 除非正在使用-fverbose-asm。(如果那个宏被定义为空字符串, 则该变量将不起作用。)对于ASM_APP_OFF的通常定义, 其效果是告知GNU汇编器不需要费功夫从输入中去除掉注释或额外的空格。 这将使得运行更快些。

缺省为假。不要将其设为真,除非你已经核实你的port不会产生任何额外的空格或者注释, 这将使得GAS在NO_APP模式下产生错误。

— Target Hook: bool TARGET_ASM_FILE_START_FILE_DIRECTIVE

如果该标记为真,对于主源文件,output_file_directive将被调用, 就在打印了ASM_APP_OFF之后(如果启用了该功能)。 大多数ELF汇编器期望做这件事。缺省为假。

— Target Hook: void TARGET_ASM_FILE_END ()

将汇编器期望在文件结尾发现的任何文本输出到中。缺省为什么也不输出。

— Function: void file_end_indicate_exec_stack ()

一些系统使用通用的约定,用特定的‘.note.GNU-stack’ section, 来指示一个依赖栈的目标文件是否被执行。如果你的系统使用了该约定, 你应该将TARGET_ASM_FILE_END定义为该函数。 如果你需要在钩子中做其它事情,则要在你的钩子函数中调用该函数。

— Target Hook: void TARGET_ASM_LTO_START (void)
— Target Hook: void TARGET_ASM_LTO_END (void)
— Target Hook: void TARGET_ASM_CODE_END (void)
— Macro: ASM_COMMENT_START

一个C字符串常量,描述了如何在target汇编语言中起始一条注释。 编译器假设注释将结束于行尾。

— Macro: ASM_APP_ON

一个C字符串常量,将在每个asm语句或者一组连续的asm语句之前被输出。 通常为"#APP",其为一条注释,对于多数汇编器不起作用, 但可以告诉GNU汇编器必须对随后的行检查所有的有效汇编结构。

— Macro: ASM_APP_OFF

一个C字符串常量,将在每个asm语句或者一组连续的asm语句之前被输出。 通常为"#NO_APP",告诉GNU汇编器继续进行省时的假设, 认为通常的编译器输出是有效的。

— Macro: ASM_OUTPUT_SOURCE_FILENAME (stream, name)

一条C语句,输出COFF信息或者DWARF调试信息, 用来指示文件名name为当前的对于标准输入输出流stream的源文件。

该宏不需要被定义,如果输出的标准形式适用于正在使用的文件格式。

— Target Hook: void TARGET_ASM_OUTPUT_SOURCE_FILENAME (FILE *file, const char *name)

Output COFF information or DWARF debugging information which indicates that filename name is the current source file to the stdio stream file.

This target hook need not be defined if the standard form of output for the file format in use is appropriate.

— Macro: OUTPUT_QUOTED_STRING (stream, string)

一条C语句,将字符串string输出到stdio流stream中。 如果你不在你的配置文件中调用函数output_quoted_string, 则GCC将只调用它来输出文件名到汇编源文件中。 所以你可以使用它来规范使用该宏的文件名的格式。

— Macro: ASM_OUTPUT_IDENT (stream, string)

一条C语句,用来输出一些东西到汇编文件中, 以处理包含文本string的‘#ident’伪指令。如果没有定义该宏, 对于‘#ident’伪指令,将不输出任何东西。

— Target Hook: void TARGET_ASM_NAMED_SECTION (const char *name, unsigned int flags, unsigned int align)

输出汇编伪指令来切换section名字。section应该具有flags指定的属性, 其为output.h中定义的SECTION_*标记的位掩码。如果align非零, 则其包含了用于section的对齐字节数,否则将使用target缺省的。 只有那些必须在section伪指令里指定对齐的target才需要关注align — 我们仍然使用ASM_OUTPUT_ALIGN

— Target Hook: bool TARGET_HAVE_NAMED_SECTIONS

该标记为真,如果target支持TARGET_ASM_NAMED_SECTION

— Target Hook: bool TARGET_HAVE_SWITCHABLE_BSS_SECTIONS

该标记为真,如果我们能够通过切换到BSS section来创建初始化为0的数据, 并且使用ASM_OUTPUT_SKIP来分配空间。这在大多数ELF target上为真。

— Target Hook: unsigned int TARGET_SECTION_TYPE_FLAGS (tree decl, const char *name, int reloc)

根据变量或函数decl,section名name,和声明的初始化是否可以包含运行时重定位, 来选择供TARGET_ASM_NAMED_SECTION使用的section属性集。 decl可以为null,这种情况下,将假设为可读写数据。

该函数的缺省版本用来处理选择代码和数据,只读数据和可读写数据, 以及flag_pic。 你应该只有在你的target具有通过__attribute__设置的特定标记时, 才需要覆盖该函数。

— Target Hook: int TARGET_ASM_RECORD_GCC_SWITCHES (print_switch_type type, const char * text)

使得target能够记录传给编译器的gcc命令行开关,和打开的选项。 参数type指定了要记录的内容。其可以为下面的值:

SWITCH_TYPE_PASSED
text为用户设置的命令行开关。
SWITCH_TYPE_ENABLED
text为开启的选项。这可能为命令行开关的直接结果,或者是因为其被缺省打开, 或者因为其被不同的命令行开关的副作用打开。例如, -O2开关打开了各种不同的独立的优化过程。
SWITCH_TYPE_DESCRIPTIVE
text或者为NULL,或者为一些应该被忽略的描述文本。如果texttext为NULL, 则其被用来警告target钩子记录开始或者结束。第一次, type为SWITCH_TYPE_DESCRIPTIVE并且text为NULL,这是警告记录开始了, 第二次,是警告结束了。该特征可以允许target钩子来做任何需要的准备, 在其开始记录开关的时候,并执行一些比较的整理,在其完成记录开关之后。
SWITCH_TYPE_LINE_START
该选项可以被该target钩子忽略掉。
SWITCH_TYPE_LINE_END
该选项可以被该target钩子忽略掉。

钩子的返回值必须为0。其它返回值可能在将来被支持。

缺省下,该钩子被设为NULL,但是对于基于ELF的target,有一个实现例子。 叫做elf_record_gcc_switches,其记录了开关, 并作为ASCII文本放在汇编输出文件中一个新的,可以字符串合并的section。 新section的名字由target钩子TARGET_ASM_RECORD_GCC_SWITCHES_SECTION提供。

— Target Hook: const char *

这是TARGET_ASM_RECORD_GCC_SWITCHES target钩子的ELF实现的例子所创建的section名字。