Next: , Previous: Per-Function Data, Up: Target Macros


17.5 存储布局

注意该表格中的宏定义中,对于以bit为单位的大小或对齐,不需要为常量。 它们可以为引用了静态变量的C表达式,例如target_flags。 参见Run-time Target

— Macro: BITS_BIG_ENDIAN

定义该宏的值为1,如果字节中的最高有效位具有最低编号;否则定义其值为0。 这意味着bit-field指令从最高有效位计数。如果机器没有bit-field指令, 则该宏也需要被定义,但定义什么值都无所谓。该宏不需要为一个常量。

该宏不影响结构体域被打包成字节或者字的方式; 那是由BYTES_BIG_ENDIAN来控制的。

— Macro: BYTES_BIG_ENDIAN

定义该宏的值为1,如果字中的最高有效字节具有最低编号。该宏不需要为一个常量。

— Macro: WORDS_BIG_ENDIAN

定义该宏的值为1,如果在多字(multiword)对象中,最高有效字具有最低编号。 这同时应用于内存位置和寄存器中; GCC从根本上假设在内存中的字的顺序与在寄存器中的一样。该宏不需要为一个常量。

— Macro: LIBGCC2_WORDS_BIG_ENDIAN

定义该宏如果WORDS_BIG_ENDIAN不是常量。该宏必须为一个常量值, 其与WORDS_BIG_ENDIAN的具有相同的含义, 并只用于编译libgcc2.c的时候。通常该值会根据预处理器定义来设置。

— Macro: FLOAT_WORDS_BIG_ENDIAN

定义该宏值为1,如果DFmode, XFmodeTFmode浮点数被存储在 内存中,并且包含符号位的字位于最低地址;否则值为0。该宏不需要为一个常量。

你不需要定义该宏,如果顺序与多字整数相同。

— Macro: BITS_PER_UNIT

定义该宏为一个可寻址的存储单元(字节)中的位数。如果没有定义,缺省为8。

— Macro: BITS_PER_WORD

字的位数。如果没有定义,缺省为BITS_PER_UNIT * UNITS_PER_WORD

— Macro: MAX_BITS_PER_WORD

字的最大位数。如果没有定义,缺省为BITS_PER_WORD。 否则其为一个常量,为BITS_PER_WORD在运行时可以具有的最大值。

— Macro: UNITS_PER_WORD

字中的存储单元数;通常为通用目的寄存器的大小,2的1到8次幂。

— Macro: MIN_UNITS_PER_WORD

字中的最小存储单元数。如果没有定义,缺省为UNITS_PER_WORD。否则, 其为一个常量,为UNITS_PER_WORD在运行时可以具有的最小值。

— Macro: UNITS_PER_SIMD_WORD (mode)

向量化可以产生的向量的单元数。缺省等于UNITS_PER_WORD, 因为向量化可以在即使没有专门的SIMD硬件的情况下做一些转换。

— Macro: POINTER_SIZE

指针的宽度,位数。必须指定不比Pmode宽的值。 如果其不等于Pmode的宽度,则必须定义POINTERS_EXTEND_UNSIGNED。 如果没有指定一个值,则缺省为BITS_PER_WORD

— Macro: POINTERS_EXTEND_UNSIGNED

一个C表达式,用来确定指针应该如何从ptr_mode扩展为Pmode或者 word_mode。如果指针应该被零扩展,则其比0大,如果应该被符号扩展则为0, 如果需要其它转换方式则为负。对于最后一种情况, 扩展通过target的ptr_extend指令来完成。

你不需要定义该宏,如果ptr_mode, Pmodeword_mode都为相同的宽度。

— Macro: PROMOTE_MODE (m, unsignedp, type)

用来更新munsignedp,当一个类型为type并且具有特定的机器模式 的对象要被存储到寄存器中时。该宏只在type为一个标量类型时才被调用。

在大多数RISC机器上,只有作用于在整个寄存器上的运算, 定义该宏将m设为为word_mode, 如果m为一个比BITS_PER_WORD窄的整数模式。在大多数情况下, 只有整数模式应该被加宽,因为宽精度的浮点运算通常比相应的窄精度的运算代价要更高。

大多数机器,宏定义不改变unsignedp。然而, 一些机器具有优先处理特定模式的有符号或者无符号的指令。例如,在DEC Alpha上, 32位load和32位add指令会将结果有符号扩展为64位。在这样的机器上, 根据扩展的类型来设置unsignedp会更加有效。

如果从来不会修改m,则不要定义该宏。

— Target Hook: enum machine_mode TARGET_PROMOTE_FUNCTION_MODE (const_tree type, enum machine_mode mode, int *punsignedp, const_tree funtype, int for_return)

Like PROMOTE_MODE, but it is applied to outgoing function arguments or function return values. The target hook should return the new mode and possibly change *punsignedp if the promotion should change signedness. This function is called only for scalar or pointer types.

for_return allows to distinguish the promotion of arguments and return values. If it is 1, a return value is being promoted and TARGET_FUNCTION_VALUE must perform the same promotions done here. If it is 2, the returned mode should be that of the register in which an incoming parameter is copied, or the outgoing result is computed; then the hook should return the same mode as promote_mode, though the signedness may be different.

The default is to not promote arguments and return values. You can also define the hook to default_promote_function_mode_always_promote if you would like to apply the same rules given by PROMOTE_MODE.

— Macro: PARM_BOUNDARY

函数参数在栈上的对齐方式,位数。所有栈参数都接受这样的对齐, 而不论数据类型是什么。在大多数机器上,这与整数的大小相同。

— Macro: STACK_BOUNDARY

定义该宏为硬件要求的在该机器上的栈指针的最小对齐。定义为一个C表达式, 为所要的对齐(位数)。该值作为缺省值使用, 如果没有定义PREFERRED_STACK_BOUNDARY。在大多数机器上, 这应该与PARM_BOUNDARY相同。

— Macro: PREFERRED_STACK_BOUNDARY

定义该宏,如果你希望对栈指针维持一个特定的对齐,大于硬件要求的对齐。 定义为一个C表达式,为所要的对齐(位数)。 该宏必须等于或大于STACK_BOUNDARY

— Macro: INCOMING_STACK_BOUNDARY
— Macro: FUNCTION_BOUNDARY

函数入口点所需的对齐位数。

— Macro: BIGGEST_ALIGNMENT

该机器上任何数据类型可以需要的最大对齐位数。注意这不是所支持的最大对齐, 而是如果违反该对齐则可能会造成错误。

— Macro: MALLOC_ABI_ALIGNMENT

Alignment, in bits, a C conformant malloc implementation has to provide. If not defined, the default value is BITS_PER_WORD.

— Macro: ATTRIBUTE_ALIGNED_VALUE

Alignment used by the __attribute__ ((aligned)) construct. If not defined, the default value is BIGGEST_ALIGNMENT.

— Macro: MINIMUM_ATOMIC_ALIGNMENT

如果被定义,则为最小对齐位数,可以分给一个对象并且在一个操作中被应用, 而不需要干扰任何附近的对象。通常为BITS_PER_UNIT, 但在没有字节或半字的存储运算的机器上可以更大些。

— Macro: BIGGEST_FIELD_ALIGNMENT

任何结构体或者联合体域在该机器上需要的最大对齐。如果被定义, 这将只覆盖结构体和联合体的域的BIGGEST_ALIGNMENT, 除非域对齐已经通过__attribute__ ((aligned (n)))设置。

— Macro: ADJUST_FIELD_ALIGN (field, computed)

一个表达式,为结构体域field的对齐方式,如果对齐方式是按照通常方式计算 (包括应用BIGGEST_ALIGNMENTBIGGEST_FIELD_ALIGNMENT)。 其只覆盖没有通过__attribute__ ((aligned (n)))设置的域。

— Macro: MAX_STACK_ALIGNMENT

Biggest stack alignment guaranteed by the backend. Use this macro to specify the maximum alignment of a variable on stack.

If not defined, the default value is STACK_BOUNDARY.

— Macro: MAX_OFILE_ALIGNMENT

由该机器的目标文件格式所支持的最大对齐。使用该宏来限制可以使用 __attribute__ ((aligned (n)))结构来指定的对齐。 如果没有定义,则缺省值为BIGGEST_ALIGNMENT

在使用ELF的系统上,缺省(在config/elfos.h中)为在32位host上可以表示的 32位ELF section对齐,即‘(((unsigned HOST_WIDEST_INT) 1 << 28) * 8)’。 在32位ELF上,最大支持的section对齐位数是‘(0x80000000 * 8)’, 但这在32位host上无法表示。

— Macro: DATA_ALIGNMENT (type, basic-align)

如果定义,则为一个C表达式,来计算在静态存储中的变量的对齐。 type为数据类型,basic-align为对象通常具有的对齐。 该宏的值被用于替代那个对齐,并应用的对象上。

如果该宏没有定义,则使用basic-align

该宏的一种用法是增加中等大小数据的对齐,使得可以放在最少的cache line中。 另一种用法是使得字符数组按照字对齐,这样strcpy调用可以通过内联方式完成。

— Macro: CONSTANT_ALIGNMENT (constant, basic-align)

如果定义,为一个C表达式,来计算放在内存中的常量的对齐。constant为常量, basic-align为该对象通常具有的对齐。该宏的值被用于替代那个对齐, 并应用的对象上。

如果该宏没有定义,则使用basic-align

该宏的典型用法为增加字符串常量的对齐,使其为字对齐, 这样strcpy调用可以通过内联方式完成。

— Macro: LOCAL_ALIGNMENT (type, basic-align)

如果定义,为一个C表达式,来计算在局部存储中的对象的对齐。type为数据类型, basic-align为对象通常的对齐。该宏的值被用于替代那个对齐,并应用的对象上。

如果该宏没有定义,则使用basic-align

该宏的一种用法是增加中等大小数据的对齐,使得可以放在最少的cache line中。

— Macro: STACK_SLOT_ALIGNMENT (type, mode, basic-align)

If defined, a C expression to compute the alignment for stack slot. type is the data type, mode is the widest mode available, and basic-align is the alignment that the slot would ordinarily have. The value of this macro is used instead of that alignment to align the slot.

If this macro is not defined, then basic-align is used when type is NULL. Otherwise, LOCAL_ALIGNMENT will be used.

This macro is to set alignment of stack slot to the maximum alignment of all possible modes which the slot may have.

— Macro: LOCAL_DECL_ALIGNMENT (decl)

If defined, a C expression to compute the alignment for a local variable decl.

If this macro is not defined, then LOCAL_ALIGNMENT (TREE_TYPE (decl), DECL_ALIGN (decl)) is used.

One use of this macro is to increase alignment of medium-size data to make it all fit in fewer cache lines.

— Macro: MINIMUM_ALIGNMENT (exp, mode, align)

If defined, a C expression to compute the minimum required alignment for dynamic stack realignment purposes for exp (a type or decl), mode, assuming normal alignment align.

If this macro is not defined, then align will be used.

— Macro: EMPTY_FIELD_BOUNDARY

允许像int : 0;;这样的空域的结构体位域的对齐位数。

如果PCC_BITFIELD_TYPE_MATTERS为真,则其覆盖该宏。

— Macro: STRUCTURE_SIZE_BOUNDARY

任何结构体或联合体的大小必须为该位数的倍数。 每个结构体或联合体的大小都将被舍入到该位数的一个倍数。

如果没有定义该宏,则缺省与BITS_PER_UNIT相同。

— Macro: STRICT_ALIGNMENT

定义该宏值为1,如果给定数据不在通常对齐方式上,则指令无法工作。 如果对于这种情况指令只不过是变慢,则定义该宏为0。

— Macro: PCC_BITFIELD_TYPE_MATTERS

定义该宏,如果你希望仿效许多其它C编译器处理位域和包含它们的结构体的对齐方式。

该行为是书写为命名位域(int,short或其它整数类型)的类型被实施 用于整个结构体的对齐,就好像结构体包含了一个该类型的普通的域。另外, 位域放在结构体中,使得其将适合这样的域,而不会跨越边界。

这样,大多数机器上,书写为int的命名位域将不会跨越一个四字节的边界, 并将使得整个结构体为四字节对齐。(可能不使用四字节对齐;其由其它对齐参数控制。)

一个没有命名的位域将不会影响包含结构体的对齐。

如果定义了该宏,则其定义为一个C表达式;该表达式的非0值会使用这样方式。

注意如果该宏没有定义,或者其值为0,则一些位域可能跨越多于一个的对齐边界。 编译器可以支持这种引用,如果有‘insv’, ‘extv’和‘extzv’ insns可以直接引用内存。

其它已知的可以使位域工作的的方式为定义STRUCTURE_SIZE_BOUNDARYBIGGEST_ALIGNMENT一样大。

除非机器具有位域指令或者你按照那种方式定义了STRUCTURE_SIZE_BOUNDARY, 否则你必须定义PCC_BITFIELD_TYPE_MATTERS具有非0值。

如果你的目标是使得GCC使用与其它编译器相同的约定来布局位域, 则这里有一种方式可以调查其它编译器是如何做的。编译运行该程序:

          struct foo1
          {
            char x;
            char :0;
            char y;
          };
          
          struct foo2
          {
            char x;
            int :0;
            char y;
          };
          
          main ()
          {
            printf ("Size of foo1 is %d\n",
                    sizeof (struct foo1));
            printf ("Size of foo2 is %d\n",
                    sizeof (struct foo2));
            exit (0);
          }

如果其打印2和5,则编译器的行为就是你通过PCC_BITFIELD_TYPE_MATTERS获得的效果。

— Macro: BITFIELD_NBYTES_LIMITED

PCC_BITFIELD_TYPE_MATTERS相似,除了它只影响结构体中的位域的对齐。

— Target Hook: bool TARGET_ALIGN_ANON_BITFIELD (void)

PCC_BITFIELD_TYPE_MATTERS为真, 该钩子将确定未命名位域是否要影响包含它的结构体的对齐。 钩子应该返回真,如果结构体应该继承未命名位域的类型所要求的对齐。

— Target Hook: bool TARGET_NARROW_VOLATILE_BITFIELD (void)

该target钩子应该返回true,如果访问volatile位域应该尽可能使用最窄的机器模式。其应该返回false,如果这些访问应该使用位域的容器的类型。

缺省为!TARGET_STRICT_ALIGN

— Macro: MEMBER_TYPE_FORCES_BLK (field, mode)

返回1,如果一个包含field的结构体或者数组应该使用BLKMODE模式来访问。

如果field为结构体中唯一的域,则mode为它的机器模式, 否则mode为VOIDmode。

通常,不需要该宏。

— Macro: ROUND_TYPE_ALIGN (type, computed, specified)

定义该宏为一个表达式,为一个类型(由作为树节点的type给定)的对齐, 如果按照通常方式计算的对齐方式为computed并且显示指定的对齐方式为specified

缺省是使用specified,如果其更大; 否则使用computedBIGGEST_ALIGNMENT中较小的。

— Macro: MAX_FIXED_MODE_SIZE

一个整数表达式,为实际应该被使用的最大的整数机器模式的位数。 所有该大小或者更小一些的整数机器模式都可以用于结构体和联合体。 如果哦没有定义该宏,则假设为GET_MODE_BITSIZE (DImode)

— Macro: STACK_SAVEAREA_MODE (save_level)

如果定义,则为一个enum machine_mode类型的表达式, 指定名为save_stack_level的指令模式(参见Standard Names)的save区域操作数的机器模式。 save_levelSAVE_BLOCK, SAVE_FUNCTIONSAVE_NONLOCAL中之一。

你不需要定义该宏,如果其总是返回Pmode。你通常将会定义该宏, 如果save_stack_level指令模式需要同时支持32和64位机器模式。

— Macro: STACK_SIZE_MODE

如果定义,为一个enum machine_mode类型的表达式, 指定名为allocate_stack的指令模式(参见Standard Names)的size increment操作数的机器模式。

你不需要定义该宏,如果其总是返回word_mode。你通常将会定义该宏, 如果allocate_stack指令模式需要同时支持32和64位机器模式。

— Target Hook: enum machine_mode TARGET_LIBGCC_CMP_RETURN_MODE ()

该target钩子应该返回扩展为libgcc调用的比较指令的返回值的机器模式。 如果没有定义,则返回word_mode,其对于大多数target是正确的。

— Target Hook: enum machine_mode TARGET_LIBGCC_SHIFT_COUNT_MODE ()

该target钩子应该返回扩展为libgcc调用的移位指令的shift count操作数的机器模式。 如果没有定义,则返回word_mode,其对于大多数target是正确的。

— Target Hook: enum machine_mode TARGET_UNWIND_WORD_MODE (void)

Return machine mode to be used for _Unwind_Word type. The default is to use word_mode.

— Macro: ROUND_TOWARDS_ZERO

如果定义,该宏应该为真,如果舍入的模式是朝向0。

定义该宏只影响libgcc.a模拟浮点算术的方式。

不定义该宏,等价于其返回0。

— Macro: LARGEST_EXPONENT_IS_NORMAL (size)

该宏应该返回真,如果具有size位数的浮点不具有NaN或无穷的表示, 但是使用最大的普通数的指数来替代表示。

定义该宏只影响libgcc.a模拟浮点算术的方式。

该宏缺省定义对所有的size都返回假。

— Target Hook: bool TARGET_MS_BITFIELD_LAYOUT_P (const_tree record_type)

This target hook returns true if bit-fields in the given record_type are to be laid out following the rules of Microsoft Visual C/C++, namely: (i) a bit-field won't share the same storage unit with the previous bit-field if their underlying types have different sizes, and the bit-field will be aligned to the highest alignment of the underlying types of itself and of the previous bit-field; (ii) a zero-sized bit-field will affect the alignment of the whole enclosing structure, even if it is unnamed; except that (iii) a zero-sized bit-field will be disregarded unless it follows another bit-field of nonzero size. If this hook returns true, other macros that control bit-field layout are ignored.

When a bit-field is inserted into a packed record, the whole size of the underlying type is used by one or more same-size adjacent bit-fields (that is, if its long:3, 32 bits is used in the record, and any additional adjacent long bit-fields are packed into the same chunk of 32 bits. However, if the size changes, a new field of that size is allocated). In an unpacked record, this is the same as using alignment, but not equivalent when packing.

If both MS bit-fields and ‘__attribute__((packed))’ are used, the latter will take precedence. If ‘__attribute__((packed))’ is used on a single field when MS bit-fields are in use, it will take precedence for that field, but the alignment of the rest of the structure may affect its placement.

— Target Hook: bool TARGET_DECIMAL_FLOAT_SUPPORTED_P (void)

返回真,如果target支持十进制浮点。

— Target Hook: bool TARGET_FIXED_POINT_SUPPORTED_P (void)

返回真,如果target支持定点算术。

— Target Hook: void TARGET_EXPAND_TO_RTL_HOOK (void)

该钩子在扩展为rtl之前被调用,允许target在扩展前执行额外的实例化或者分析。 例如,rs6000port使用它来分配scratch栈槽,当被扩展的函数具有任何SDmode使用时, 用于在内存和浮点寄存器之间复制SDmode值。

— Target Hook: void TARGET_INSTANTIATE_DECLS (void)

该钩子允许后端执行额外的rtl实例化,这些实际上不存在于任何insn中,但在之后会有。

— Target Hook: const char * TARGET_MANGLE_TYPE (const_tree type)

If your target defines any fundamental types, or any types your target uses should be mangled differently from the default, define this hook to return the appropriate encoding for these types as part of a C++ mangled name. The type argument is the tree structure representing the type to be mangled. The hook may be applied to trees which are not target-specific fundamental types; it should return NULL for all such types, as well as arguments it does not recognize. If the return value is not NULL, it must point to a statically-allocated string constant.

Target-specific fundamental types might be new fundamental types or qualified versions of ordinary fundamental types. Encode new fundamental types as ‘n name’, where name is the name used for the type in source code, and n is the length of name in decimal. Encode qualified versions of ordinary types as ‘n name code’, where name is the name used for the type qualifier in source code, n is the length of name as above, and code is the code used to represent the unqualified version of this type. (See write_builtin_type in cp/mangle.c for the list of codes.) In both cases the spaces are for clarity; do not include any spaces in your string.

This hook is applied to types prior to typedef resolution. If the mangled name for a particular type depends only on that type's main variant, you can perform typedef resolution yourself using TYPE_MAIN_VARIANT before mangling.

The default version of this hook always returns NULL, which is appropriate for a target that does not define any new fundamental types.