Next: Type Layout, Previous: Per-Function Data, Up: Target Macros
注意该表格中的宏定义中,对于以bit为单位的大小或对齐,不需要为常量。
它们可以为引用了静态变量的C表达式,例如target_flags
。
参见Run-time Target。
定义该宏的值为1,如果字节中的最高有效位具有最低编号;否则定义其值为0。 这意味着bit-field指令从最高有效位计数。如果机器没有bit-field指令, 则该宏也需要被定义,但定义什么值都无所谓。该宏不需要为一个常量。
该宏不影响结构体域被打包成字节或者字的方式; 那是由
BYTES_BIG_ENDIAN
来控制的。
定义该宏的值为1,如果在多字(multiword)对象中,最高有效字具有最低编号。 这同时应用于内存位置和寄存器中; GCC从根本上假设在内存中的字的顺序与在寄存器中的一样。该宏不需要为一个常量。
定义该宏如果
WORDS_BIG_ENDIAN
不是常量。该宏必须为一个常量值, 其与WORDS_BIG_ENDIAN
的具有相同的含义, 并只用于编译libgcc2.c的时候。通常该值会根据预处理器定义来设置。
定义该宏值为1,如果
DFmode
,XFmode
或TFmode
浮点数被存储在 内存中,并且包含符号位的字位于最低地址;否则值为0。该宏不需要为一个常量。你不需要定义该宏,如果顺序与多字整数相同。
字中的最小存储单元数。如果没有定义,缺省为
UNITS_PER_WORD
。否则, 其为一个常量,为UNITS_PER_WORD
在运行时可以具有的最小值。
向量化可以产生的向量的单元数。缺省等于
UNITS_PER_WORD
, 因为向量化可以在即使没有专门的SIMD硬件的情况下做一些转换。
指针的宽度,位数。必须指定不比
Pmode
宽的值。 如果其不等于Pmode
的宽度,则必须定义POINTERS_EXTEND_UNSIGNED
。 如果没有指定一个值,则缺省为BITS_PER_WORD
。
一个C表达式,用来确定指针应该如何从
ptr_mode
扩展为Pmode
或者word_mode
。如果指针应该被零扩展,则其比0大,如果应该被符号扩展则为0, 如果需要其它转换方式则为负。对于最后一种情况, 扩展通过target的ptr_extend
指令来完成。你不需要定义该宏,如果
ptr_mode
,Pmode
和word_mode
都为相同的宽度。
用来更新m和unsignedp,当一个类型为type并且具有特定的机器模式 的对象要被存储到寄存器中时。该宏只在type为一个标量类型时才被调用。
在大多数RISC机器上,只有作用于在整个寄存器上的运算, 定义该宏将m设为为
word_mode
, 如果m为一个比BITS_PER_WORD
窄的整数模式。在大多数情况下, 只有整数模式应该被加宽,因为宽精度的浮点运算通常比相应的窄精度的运算代价要更高。大多数机器,宏定义不改变unsignedp。然而, 一些机器具有优先处理特定模式的有符号或者无符号的指令。例如,在DEC Alpha上, 32位load和32位add指令会将结果有符号扩展为64位。在这样的机器上, 根据扩展的类型来设置unsignedp会更加有效。
如果从来不会修改m,则不要定义该宏。
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 andTARGET_FUNCTION_VALUE
must perform the same promotions done here. If it is2
, 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 aspromote_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 byPROMOTE_MODE
.
定义该宏为硬件要求的在该机器上的栈指针的最小对齐。定义为一个C表达式, 为所要的对齐(位数)。该值作为缺省值使用, 如果没有定义
PREFERRED_STACK_BOUNDARY
。在大多数机器上, 这应该与PARM_BOUNDARY
相同。
定义该宏,如果你希望对栈指针维持一个特定的对齐,大于硬件要求的对齐。 定义为一个C表达式,为所要的对齐(位数)。 该宏必须等于或大于
STACK_BOUNDARY
。
Alignment, in bits, a C conformant malloc implementation has to provide. If not defined, the default value is
BITS_PER_WORD
.
Alignment used by the
__attribute__ ((aligned))
construct. If not defined, the default value isBIGGEST_ALIGNMENT
.
如果被定义,则为最小对齐位数,可以分给一个对象并且在一个操作中被应用, 而不需要干扰任何附近的对象。通常为
BITS_PER_UNIT
, 但在没有字节或半字的存储运算的机器上可以更大些。
任何结构体或者联合体域在该机器上需要的最大对齐。如果被定义, 这将只覆盖结构体和联合体的域的
BIGGEST_ALIGNMENT
, 除非域对齐已经通过__attribute__ ((aligned (
n)))
设置。
一个表达式,为结构体域field的对齐方式,如果对齐方式是按照通常方式计算 (包括应用
BIGGEST_ALIGNMENT
和BIGGEST_FIELD_ALIGNMENT
)。 其只覆盖没有通过__attribute__ ((aligned (
n)))
设置的域。
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
.
由该机器的目标文件格式所支持的最大对齐。使用该宏来限制可以使用
__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上无法表示。
如果定义,则为一个C表达式,来计算在静态存储中的变量的对齐。 type为数据类型,basic-align为对象通常具有的对齐。 该宏的值被用于替代那个对齐,并应用的对象上。
如果该宏没有定义,则使用basic-align。
该宏的一种用法是增加中等大小数据的对齐,使得可以放在最少的cache line中。 另一种用法是使得字符数组按照字对齐,这样
strcpy
调用可以通过内联方式完成。
如果定义,为一个C表达式,来计算放在内存中的常量的对齐。constant为常量, basic-align为该对象通常具有的对齐。该宏的值被用于替代那个对齐, 并应用的对象上。
如果该宏没有定义,则使用basic-align。
该宏的典型用法为增加字符串常量的对齐,使其为字对齐, 这样
strcpy
调用可以通过内联方式完成。
如果定义,为一个C表达式,来计算在局部存储中的对象的对齐。type为数据类型, basic-align为对象通常的对齐。该宏的值被用于替代那个对齐,并应用的对象上。
如果该宏没有定义,则使用basic-align。
该宏的一种用法是增加中等大小数据的对齐,使得可以放在最少的cache line中。
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.
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.
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.
任何结构体或联合体的大小必须为该位数的倍数。 每个结构体或联合体的大小都将被舍入到该位数的一个倍数。
如果没有定义该宏,则缺省与
BITS_PER_UNIT
相同。
定义该宏,如果你希望仿效许多其它C编译器处理位域和包含它们的结构体的对齐方式。
该行为是书写为命名位域(
int
,short
或其它整数类型)的类型被实施 用于整个结构体的对齐,就好像结构体包含了一个该类型的普通的域。另外, 位域放在结构体中,使得其将适合这样的域,而不会跨越边界。这样,大多数机器上,书写为
int
的命名位域将不会跨越一个四字节的边界, 并将使得整个结构体为四字节对齐。(可能不使用四字节对齐;其由其它对齐参数控制。)一个没有命名的位域将不会影响包含结构体的对齐。
如果定义了该宏,则其定义为一个C表达式;该表达式的非0值会使用这样方式。
注意如果该宏没有定义,或者其值为0,则一些位域可能跨越多于一个的对齐边界。 编译器可以支持这种引用,如果有‘insv’, ‘extv’和‘extzv’ insns可以直接引用内存。
其它已知的可以使位域工作的的方式为定义
STRUCTURE_SIZE_BOUNDARY
和BIGGEST_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
获得的效果。
当
PCC_BITFIELD_TYPE_MATTERS
为真, 该钩子将确定未命名位域是否要影响包含它的结构体的对齐。 钩子应该返回真,如果结构体应该继承未命名位域的类型所要求的对齐。
该target钩子应该返回
true
,如果访问volatile位域应该尽可能使用最窄的机器模式。其应该返回false
,如果这些访问应该使用位域的容器的类型。缺省为
!TARGET_STRICT_ALIGN
。
返回1,如果一个包含field的结构体或者数组应该使用
BLKMODE
模式来访问。如果field为结构体中唯一的域,则mode为它的机器模式, 否则mode为VOIDmode。
通常,不需要该宏。
定义该宏为一个表达式,为一个类型(由作为树节点的type给定)的对齐, 如果按照通常方式计算的对齐方式为computed并且显示指定的对齐方式为specified。
缺省是使用specified,如果其更大; 否则使用computed和
BIGGEST_ALIGNMENT
中较小的。
一个整数表达式,为实际应该被使用的最大的整数机器模式的位数。 所有该大小或者更小一些的整数机器模式都可以用于结构体和联合体。 如果哦没有定义该宏,则假设为
GET_MODE_BITSIZE (DImode)
。
如果定义,则为一个
enum machine_mode
类型的表达式, 指定名为save_stack_
level的指令模式(参见Standard Names)的save区域操作数的机器模式。 save_level为SAVE_BLOCK
,SAVE_FUNCTION
或SAVE_NONLOCAL
中之一。你不需要定义该宏,如果其总是返回
Pmode
。你通常将会定义该宏, 如果save_stack_
level指令模式需要同时支持32和64位机器模式。
如果定义,为一个
enum machine_mode
类型的表达式, 指定名为allocate_stack
的指令模式(参见Standard Names)的size increment操作数的机器模式。你不需要定义该宏,如果其总是返回
word_mode
。你通常将会定义该宏, 如果allocate_stack
指令模式需要同时支持32和64位机器模式。
该target钩子应该返回扩展为libgcc调用的比较指令的返回值的机器模式。 如果没有定义,则返回
word_mode
,其对于大多数target是正确的。
该target钩子应该返回扩展为libgcc调用的移位指令的shift count操作数的机器模式。 如果没有定义,则返回
word_mode
,其对于大多数target是正确的。
Return machine mode to be used for
_Unwind_Word
type. The default is to useword_mode
.
该宏应该返回真,如果具有size位数的浮点不具有NaN或无穷的表示, 但是使用最大的普通数的指数来替代表示。
定义该宏只影响libgcc.a模拟浮点算术的方式。
该宏缺省定义对所有的size都返回假。
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 returnstrue
, 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.
该钩子在扩展为rtl之前被调用,允许target在扩展前执行额外的实例化或者分析。 例如,rs6000port使用它来分配scratch栈槽,当被扩展的函数具有任何SDmode使用时, 用于在内存和浮点寄存器之间复制SDmode值。
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 notNULL
, 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 ‘u 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 ‘U 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.