Next: , Previous: Uninitialized Data, Up: Assembler Format


17.21.4 标号的生成和输出

这节是关于标号输出的。

— Macro: ASM_OUTPUT_LABEL (stream, name)

一条C语句(没有分号), 用来将名字为name的标号的汇编定义输出到stdio流stream中。 使用表达式assemble_name (stream, name)来输出name本身; 在此之前和之后,输出定义name的额外的汇编语法,以及换行。 该宏的缺省定义被提供,其对于多数系统都是正确的。

— Macro: ASM_OUTPUT_FUNCTION_LABEL (stream, name, decl)

A C statement (sans semicolon) to output to the stdio stream stream the assembler definition of a label named name of a function. Use the expression assemble_name (stream, name) to output the name itself; before and after that, output the additional assembler syntax for defining the name, and a newline. A default definition of this macro is provided which is correct for most systems.

If this macro is not defined, then the function name is defined in the usual manner as a label (by means of ASM_OUTPUT_LABEL).

— Macro: ASM_OUTPUT_INTERNAL_LABEL (stream, name)

等同于ASM_OUTPUT_LABEL,除了name为已知的,引用了编译器生成的标号。 缺省定义使用assemble_name_raw,其类似于assemble_name, 只不过更加高效。

— Macro: SIZE_ASM_OP

一个C字符串,包含了适当的汇编伪指令,用于指定符号的大小,不需要任何参数。 在使用ELF的系统上,缺省为(在config/elfos.h中)‘"\t.size\t"’; 在其它系统上,缺省为不定义该宏。

只有在你的系统上可以正确的使用ASM_OUTPUT_SIZE_DIRECTIVEASM_OUTPUT_MEASURED_SIZE的缺省定义时,才定义该宏。 如果对于那些宏,你需要自己特定的定义,或者如果你根本不需要显式的符号大小, 则不要定义该宏。

— Macro: ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size)

一条C语句(没有分号),用来将一条伪指令输出到stdio流stream中, 以告诉汇编器符号name的大小为sizesizeHOST_WIDE_INT。 如果你定义了SIZE_ASM_OP,则该宏的缺省定义会被提供。

— Macro: ASM_OUTPUT_MEASURED_SIZE (stream, name)

一条C语句(没有分号),用来将一条伪指令输出到stdio流stream中, 以告诉汇编器通过从当前地址减去符号name的地址,来计算符号的大小。

如果你定义了SIZE_ASM_OP,则该宏的缺省定义会被提供。 缺省定义假设汇编器可以识别特殊的‘.’符号,作为引用当前地址, 并能够计算该处和其它符号的差。如果你的汇编器不识别‘.’,或者不能计算差, 你需要重定义ASM_OUTPUT_MEASURED_SIZE来使用其它技术。

— Macro: TYPE_ASM_OP

一个C字符串,包含了适当的汇编伪指令,用于指定符号的类型,不需要任何参数。 在使用ELF的系统上,缺省为(在config/elfos.h中)‘"\t.type\t"’; 在其它系统上,缺省为不定义该宏。

只有在你的系统上可以正确的使用ASM_OUTPUT_TYPE_DIRECTIVE的缺省定义时, 才定义该宏。如果对于该宏,你需要自己特定的定义, 或者如果你根本不需要显式的符号类型,则不要定义该宏。

— Macro: TYPE_OPERAND_FMT

一个C字符串, 指定了TYPE_ASM_OP的第二个操作数的格式(使用printf语法)。 在使用ELF的系统上,缺省为(在config/elfos.h中)‘"@%s"’; 在其它系统上,缺省为不定义该宏。

只有在你的系统上可以正确的使用ASM_OUTPUT_TYPE_DIRECTIVE的缺省定义时, 才定义该宏。如果对于该宏,你需要自己特定的定义, 或者如果你根本不需要显式的符号类型,则不要定义该宏。

— Macro: ASM_OUTPUT_TYPE_DIRECTIVE (stream, type)

一条C语句(没有分号),用以将一条伪指令输出到stdio流stream中, 以告诉汇编器符号name的类型为typetype是一个C字符串; 目前该字符串总是‘"function"’或者‘"object"’,但你不要依赖于此。

如果你定义了TYPE_ASM_OPTYPE_OPERAND_FMT, 则该宏的缺省定义会被提供。

— Macro: ASM_DECLARE_FUNCTION_NAME (stream, name, decl)

一条C语句(没有分号),用以将任何声明被定义的函数名字name所需要的文本, 输出到stdio流stream中。 该宏负责输出标号定义(或者使用ASM_OUTPUT_LABEL)。 参数decl为表示函数的FUNCTION_DECL树结点。

如果该宏没有被定义, 则函数名被作为标号按照通常的方式来定义(使用ASM_OUTPUT_LABEL)。

你可能希望在定义该宏时使用ASM_OUTPUT_TYPE_DIRECTIVE

— Macro: ASM_DECLARE_FUNCTION_SIZE (stream, name, decl)

一条C语句(没有分号),用以将任何声明被定义的函数的大小所需要的文本, 输出到stdio流stream中。参数name为函数的名字。 参数decl为表示函数的FUNCTION_DECL树结点。

如果该宏没有被定义,则函数大小没有被定义。

你可能希望在定义该宏时使用ASM_OUTPUT_MEASURED_SIZE

— Macro: ASM_DECLARE_OBJECT_NAME (stream, name, decl)

一条C语句(没有分号), 用以将任何声明被定义的初始化变量名字name所需要的文本, 输出到stdio流stream中。 该宏必须输出标号定义(可能使用ASM_OUTPUT_LABEL)。 参数decl为表示变量的VAR_DECL树结点。

如果该宏没有被定义, 则变量名被作为标号按照通常的方式来定义(使用ASM_OUTPUT_LABEL)。

你可能希望在定义该宏时使用ASM_OUTPUT_TYPE_DIRECTIVE和/或ASM_OUTPUT_SIZE_DIRECTIVE

— Target Hook: void TARGET_ASM_DECLARE_CONSTANT_NAME (FILE *file, const char *name, const_tree expr, HOST_WIDE_INT size)

A target hook to output to the stdio stream file any text necessary for declaring the name name of a constant which is being defined. This target hook is responsible for outputting the label definition (perhaps using assemble_label). The argument exp is the value of the constant, and size is the size of the constant in bytes. The name will be an internal label.

The default version of this target hook, define the name in the usual manner as a label (by means of assemble_label).

You may wish to use ASM_OUTPUT_TYPE_DIRECTIVE in this target hook.

— Macro: ASM_DECLARE_REGISTER_GLOBAL (stream, decl, regno, name)

A C statement (sans semicolon) to output to the stdio stream stream any text necessary for claiming a register regno for a global variable decl with name name.

If you don't define this macro, that is equivalent to defining it to do nothing.

— Macro: ASM_DECLARE_REGISTER_GLOBAL (stream, decl, regno, name)

一条C语句(没有分号),用以将任何为具有名字name的全局变量声明一个寄存器regno所需要的文本,输出到stdio流stream中。

如果没有定义该宏,则相当于定义其什么都不做。

— Macro: ASM_FINISH_DECLARE_OBJECT (stream, decl, toplevel, atend)

一条C语句(没有分号),用于在编译器完全处理了初始化者之后, 来完成声明一个变量名,这样当数组的大小由初始化者控制的时候, 就有机会来确定数组的大小。这用于需要声明对象的大小的系统上。

如果没有定义该宏,则相当于定义其什么都不做。

你可能希望在定义该宏时使用ASM_OUTPUT_SIZE_DIRECTIVE和/或ASM_OUTPUT_MEASURED_SIZE

— Target Hook: void TARGET_ASM_GLOBALIZE_LABEL (FILE *stream, const char *name)

该target钩子为一个函数,用于将一些命令输出到stdio流stream中, 从而使得标号name为全局的;也就是,可以从其它文件中引用。

缺省实现依赖于GLOBAL_ASM_OP的适当定义。

— Target Hook: void TARGET_ASM_GLOBALIZE_DECL_NAME (FILE *stream, tree decl)

该target钩子为一个函数,用于将一些命令输出到stdio流stream中, 从而使得decl相关联的名字为全局的;也就是,可以从其它文件中引用。

缺省实现使用TARGET_ASM_GLOBALIZE_LABEL target钩子。

— Macro: ASM_WEAKEN_LABEL (stream, name)

一条C语句(没有分号),用于将一些命令输出到stdio流stream中, 从而使得标号name为弱的;也就是,可以从其它文件中引用, 但只有在没有其它定义的时候。 使用表达式assemble_name (stream, name)来输出name本身; 在此之前和之后,输出使得name为弱的额外的汇编语法,以及换行。

如果没有定义该宏或者ASM_WEAKEN_DECL, GCC将不支持弱符号并且你不要定义宏SUPPORTS_WEAK

— Macro: ASM_WEAKEN_DECL (stream, decl, name, value)

组合(并替换)了函数ASM_WEAKEN_LABELASM_OUTPUT_WEAK_ALIAS, 允许访问相关的函数或变量decl。如果value不为NULL, 该C语句应该将定义弱符号name具有值value的汇编代码, 输出到stdio流stream中。如果valueNULL, 其应该输出命令来使得name为弱的。

— Macro: ASM_OUTPUT_WEAKREF (stream, decl, name, value)

输出一条伪指令,使得name被用来使用弱符号语义引用符号valuedeclname的声明。

— Macro: SUPPORTS_WEAK

一个C表达式,如果target支持弱符号,则求值为真。

如果你没有定义该宏,defaults.h会提供一个缺省的定义。 如果ASM_WEAKEN_LABEL或者ASM_WEAKEN_DECL被定义, 则缺省定义为‘1’;否则为‘0’。如果你想使用编译器标记, 例如-melf,来控制弱符号的支持,则定义该宏。

— Macro: MAKE_DECL_ONE_ONLY (decl)

一条C语句(没有分号),用来标记decl作为public符号生成, 这样在多个转换单元中额外的副本将被连接器丢弃。 如果你的目标文件格式提供了这样的支持, 例如在Microsoft Windows PE/COFF格式中的‘COMDAT’ section标记, 并且这种支持需要对decl进行改动,例如将其放到独立的section中,则定义该宏。

— Macro: SUPPORTS_ONE_ONLY

一个C表达式,如果target支持one-only语义,则其求值为真。

如果你没有定义该宏,varasm.c会提供一个缺省的定义。 如果MAKE_DECL_ONE_ONLY被定义,则缺省定义为‘1’;否则为‘0’。 如果你想使用编译器标记来控制one-only符号的支持, 或者如果设置DECL_ONE_ONLY标记就足以标记声明被作为one-only生成时, 定义该宏。

— Target Hook: void TARGET_ASM_ASSEMBLE_VISIBILITY (tree decl, const char *visibility)

该target钩子为一个函数,用来将一些命令输出到asm_out_file, 其将使得与decl相关的符号具有通过visibility指定的隐藏, 保护或者内部可见的属性。

— Macro: TARGET_WEAK_NOT_IN_ARCHIVE_TOC

一个C表达式,如果target的连接器期望弱符号不出现在静态归档的目录表中, 则其求值为真。缺省为0

将弱符号置于归档的目录表之外,意味着如果符号将只在一个转换单元中有一个定义, 并且有从其它转换单元中进行未定义的引用,则该符号将不为弱的。定义该宏为非零, 将使得这样通常为弱的符号成为非弱的。

C++ ABI要求该宏为0。当target不能完全遵守C++ ABI, 并且连接器要求弱符号在静态归档的目录表外面时,定义该宏。

— Macro: ASM_OUTPUT_EXTERNAL (stream, decl, name)

一条C语句(没有分号), 用于将声明在该编译中被引用但没有被定义的外部符号名字name, 所需要的任何文本输出到stdio流stream中。decl的值为声明的树结点。

如果不需要输出任何东西,则不需要定义该宏。 GNU汇编器和大多数Unix汇编器不需要做任何事情。

— Target Hook: void TARGET_ASM_EXTERNAL_LIBCALL (rtx symref)

该target钩子是一个函数,用于将一条汇编伪指令输出到asm_out_file中, 用以声明一个库函数名字为外部的。库函数的名字由symref给出, symref为一个symbol_ref

— Target Hook: void TARGET_ASM_MARK_DECL_PRESERVED (tree decl)

该target钩子为一个函数,用于将一条汇编伪指令输出到asm_out_file中, 用以注释使用的符号。Darwin target使用.no_dead_code_strip伪指令。

— Macro: ASM_OUTPUT_LABELREF (stream, name)

一条C语句(没有分号), 用于将名为name的标号的引用的汇编语法输出到stdio流stream中。 这应该在name前加上‘_’。该宏用于assemble_name

— Macro: ASM_OUTPUT_SYMBOL_REF (stream, sym)

一条C语句(没有分号),用于输出对SYMBOL_REF sym的引用。 如果没有定义,assemble_name将被用来输出符号的名字。 该宏可以用于修改符号被引用的方式,根据TARGET_ENCODE_SECTION_INFO的信息。

— Macro: ASM_OUTPUT_LABEL_REF (stream, buf)

一条C语句(没有分号),用于输出对ASM_GENERATE_INTERNAL_LABEL的结果, buf的引用。如果没有定义,assemble_name将被用来输出符号的名字。 该宏不被调用它的output_asm_label或者%l指示符使用;

— Target Hook: void TARGET_ASM_INTERNAL_LABEL (FILE *stream, const char *prefix, unsigned long labelno)

一个函数,将标号输出到stdio流stream中, 标号的名字由字符串prefix和编号labelno组成。

当然这些标号应该与用户级别函数和变量使用的标号不同。 否则,程序将具有与内部标号的命名冲突。

通常要求内部标号不包含在目标文件的符号表中。大多数汇编器具有命名约定, 来处理这些标号。在许多系统上,位于标号的起始处的字母‘L’,具有这样的效果。 你应该找到你的系统使用的约定,并遵守。

该函数的缺省版本利用ASM_GENERATE_INTERNAL_LABEL了。

— Macro: ASM_OUTPUT_DEBUG_LABEL (stream, prefix, num)

一条C语句,用来将调试信息标号输出到stdio流stream中, 标号的名字由字符串prefix和编号num组成。这对VLIW target很有用, 因为调试信息标号可能需要与分支目标标号进行不同的处理。在一些系统上, 分支目标标号必须在指令束的起始处,但是调试信息标号可以出现在指令束的中间。

如果该宏没有被定义,则会使用(*targetm.asm_out.internal_label)

— Macro: ASM_GENERATE_INTERNAL_LABEL (string, prefix, num)

一条C语句,用于将标号存储到字符串string中, 标号的名字由字符串prefix和编号num组成。

This string, when output subsequently by assemble_name, should produce the output that (*targetm.asm_out.internal_label) would produce with the same prefix and num.

如果字符串起始于‘*’, 则assemble_name将按照不改变剩余字符串的方式被输出。 这对于ASM_GENERATE_INTERNAL_LABEL非常方便。 如果字符串不起始于‘*’,则会使用ASM_OUTPUT_LABELREF来输出字符串, 并且可能会做改变。(当然,ASM_OUTPUT_LABELREF也是你的机器描述的一部分, 所以你知道它在你的机器上做了什么。)

— Macro: ASM_FORMAT_PRIVATE_NAME (outvar, name, number)

一个C表达式,给outvar(类型为char **的变量) 赋值一个新分配的字符串,该字符串由字符串name和编号number组成, 并增加适当的标点符号。使用alloca为字符串获得空间。

字符串将被ASM_OUTPUT_LABELREF作为参数使用, 来产生一个名字为name的内部静态变量的汇编标号。 因此,字符串必须为有效的汇编代码。参数number在每次执行该宏时都不相同; 其使得在不同作用域下的内部静态变量的名字不会有冲突。

理想情况下,该字符串应该不是一个有效的C标识符, 以阻止任何与用户自己的符号的冲突。大多数汇编器运行点或者百分号在汇编符号中; 在名字和编号之间加入至少一个这样的字符便可以。

如果该宏没有被定义,一个缺省的定义将被提供,其在大多数系统上都是正确的。

— Macro: ASM_OUTPUT_DEF (stream, name, value)

一条C语句,用于将定义符号name具有值value的汇编代码输出到stdio流stream中。

如果定义了SET_ASM_OP,一个缺省的定义将被提供, 其在大多数系统上都是正确的。

— Macro: ASM_OUTPUT_DEF_FROM_DECLS (stream, decl_of_name, decl_of_value)

一条C语句,用于将定义树结点为decl_of_name的符号, 具有树结点decl_of_value的值的汇编代码输出到stdio流stream中。 该宏将优先于`ASM_OUTPUT_DEF'被使用,如果其被定义,并且如果树结点有效。

如果定义了SET_ASM_OP,一个缺省的定义将被提供, 其在大多数系统上都是正确的。

— Macro: TARGET_DEFERRED_OUTPUT_DEFS (decl_of_name, decl_of_value)

一条C语句,如果定义树结点为decl_of_name的符号具有树结点为 decl_of_value的值的汇编代码,应该在当前编译单元结尾处被生成, 则求值为真。缺省为不推迟定义的输出。 该宏影响`ASM_OUTPUT_DEF' 和 `ASM_OUTPUT_DEF_FROM_DECLS'的定义输出。

— Macro: ASM_OUTPUT_WEAK_ALIAS (stream, name, value)

一条C语句,用来将定义弱符号name具有值value的汇编代码输出 到stdio流stream中。如果valueNULL, 其定义name为未定义的符号。

如果target只支持弱别名时,定义该宏;否则尽量定义ASM_OUTPUT_DEF

— Macro: OBJC_GEN_METHOD_LABEL (buf, is_inst, class_name, cat_name, sel_name)

定义该宏来覆盖缺省的用于Objective-C方法的汇编名。

缺省名为一个唯一的方法编号,跟随class的名字(例如‘_1_Foo’)。 对于在category中的方法,category也包含在汇编名中(例如‘_1_Foo_Bar’)。

这些名字在大多数系统上是安全的,但是使得调试变得困难, 因为方法selector不在名字中。因此一些特定的系统定义了其它计算名字的方式。

bufchar *类型的表达式,给出一个缓存来存储名字; 其长度等于class_namecat_namesel_name的和, 再加上额外的50个字符。

参数is_inst指定了方法是一个实例方法,还是一个类方法; class_name为类的名字;cat_name为category的名字(或者为空, 如果方法不在category中);sel_name为selector的名字。

在汇编器可以处理带引号的名字的系统上,你可以使用该宏来提供更加可读的名字。

— Macro: ASM_DECLARE_CLASS_REFERENCE (stream, name)

一条C语句(没有分号),用于将命令输出到stdio流stream中, 来声明标号name为Objective-C class引用。 这只在连接器具有对NeXT-style运行时的特殊支持的target上需要。

— Macro: ASM_DECLARE_UNRESOLVED_REFERENCE (stream, name)

一条C语句(没有分号),用于将命令输出到stdio流stream中, 来声明标号name为未解决的Objective-C class引用。 这只在连接器具有对NeXT-style运行时的特殊支持的target上需要。