Previous: Named Address Spaces, Up: Target Macros
定义该布尔值的宏用来指示你的体系结构是否具有可以跨越所有内存的条件分支。 它用于将可执行程序hot和cold基本块分割到单独的段的优化。 如果该宏被设为false,则gcc将任何穿越段的条件分支转换为无条件分支或间接跳转。
定义该布尔值的宏用来指示你的体系结构是否具有可以跨越所有内存的无条件分支。 它用于将可执行程序hot和cold基本块分割到单独的段的优化。 如果该宏被设为false,则gcc将任何穿越段的无条件分支转换为间接跳转。
可选的:当最小值和最大值位移已知时,返回
addr_diff_vec
的首选机器模式。 如果定义了该宏,这使得在分支缩短中增加了额外的代码来处理addr_diff_vec
。 要使其工作,还必须要定义INSN_ALIGN
, 并且显示的对addr_diff_vec
进行对齐。参数body被提供, 使得可以更新offset_unsigned
和标量标记。
定义该宏为一个C表达式,来指示跳转表什么时候应该包含相对地址。 你不需要定义该宏,如果跳转表从来不包含相对地址, 或者跳转表只在-fPIC或者-fPIC有效时才包含相对地址。
定义该宏为一个C表达式,来指示C switch语句是否可以通过位测试序列来实现。 这在可以通过寄存器中的位数来有效实现左移1位的处理器上很有利, 但不适合需要循环的target。缺省下,该宏返回
true
, 如果target定义了ashlsi3
指令模式,否则返回false
。
定义该宏,如果整数机器模式的小于一个字的寄存器间的运算总是在整个寄存器中执行。 大多数RISC机器具有这个属性,大多数CISC机器不具有。
定义该宏为一个C表达式, 指示当insn使用比一个字窄的的整数模式的mem_mode模式读取内存时, 将读取的数据的mem_mode外的位进行符号扩展或者零扩展。 返回
SIGN_EXTEND
,对于那些要符号扩展的insn, 返回ZERO_EXTEND
对那些零扩展的,对于其它的机器模式返回UNKNOWN
。该宏不会被非整型的,或者宽度大于等于
BITS_PER_WORD
的mem_mode调用, 所以对于这种情况你可以返回任何值。如果总是返回UNKNOWN
,则不要定义该宏。 在定义该宏的机器上,你通常要定义其为常量SIGN_EXTEND
或者ZERO_EXTEND
。你可以返回一个非
UNKNOWN
的值,即使对于一些硬件寄存器并没有执行符号扩展,如果对于这些硬件寄存器的REGNO_REG_CLASS
,当from机器模式为mem_mode,并且to机器模式为任何大于其但是不大于word_mode
的整形机器模式的时候,CANNOT_CHANGE_MODE_CLASS
返回非零。你必须返回
UNKNOWN
,如果一些硬件寄存器允许该机器模式,CANNOT_CHANGE_MODE_CLASS
说它们不能变成word_mode
,但是它们可以变成其它大于mem_mode且仍然小于word_mode
的整形机器模式。
当-ffast-math有效时,GCC尝试使用相同的除数来优化除法, 通过将它们转换为乘以倒数的方式。 缺省实现返回3,如果机器具有除法指令,否则为2。
单个指令可以在内存和寄存器间,或者两个内存位置间快速移动的最大字节数。 如果没有定义,则缺省为
MOVE_MAX
。 否则,其为MOVE_MAX
在运行时可以具有的最大常数值。
一个C表达式,为非零,如果在该机器上,实际用于计算移位运算的位数等同于,用来表示被移位的对象大小的位数。当该宏为非零的时候,编译器将假设可以安全的忽略掉对移位运算的计数进行截取的有符号扩展,零扩展和按位与指令。在一些机器上,具有指令可以作用于可变位置的位域,其可能会包含‘位测试’指令,非零的
SHIFT_COUNT_TRUNCATED
还可以使得作为位域指令参数的值的截取运算。如果指令会截取计数(对于位移运算)和位置(对于位域运算),或者如果没有可变位置的位域指令存在,则你应该定义该宏。
然而,在一些机器上,例如80386和680x0,截取操作只应用在移位运算上,而不在位域运算上。在这样的机器上,定义
SHIFT_COUNT_TRUNCATED
为零。可替代的,在md文件中增加指令模式,包含对移位指令隐式的截取操作。如果其值总是为零,则不需要定义该宏。
该函数描述了标准的移位指令模式,对于mode,如何处理负的数量或者大于机器模式宽度的数量的移位。 参见shift patterns.
在许多机器上,移位指令模式将会应用一个掩码m到移位计数上,意味着将x固定宽度移位y等价于对x任意宽度移位y & m。如果这对机器模式mode为真,则函数应该返回m,否则应该返回0。返回值0意味着不保证特定的行为。
注意,不像
SHIFT_COUNT_TRUNCATED
,该函数不应用到通用的移位rtx上;其只应用到由命名移位指令模式生成的指令上。该函数的缺省实现返回
GET_MODE_BITSIZE (
mode) - 1
,如果SHIFT_COUNT_TRUNCATED
,否则为0。该定义总是安全的,但是如果SHIFT_COUNT_TRUNCATED
为假,并且一些移位指令模式还是截取移位计数,则你可以通过重写覆盖该宏来获得更好的代码。
一个C表达式,其为非零,如果在该机器上,将inprec个位数的整数转换成outprec个位数(outprec比inprec小),通过简单的认为其只具有outprec个位。
在许多机器上,该表达式可以为1。
When
TRULY_NOOP_TRUNCATION
returns 1 for a pair of sizes for modes for whichMODES_TIEABLE_P
is 0, suboptimal code can result. If this is the case, makingTRULY_NOOP_TRUNCATION
return 0 in such cases may improve things.
整型机器模式可以表示为一个值,其总是被扩展为更宽的整型模式。返回
SIGN_EXTEND
,如果机器模式为mode的值被表示为有符号扩展成rep_mode的形式。否则,返回UNKNOWN
。(目前,没有目标机使用零扩展表示,所以不像LOAD_EXTEND_OP
,TARGET_MODE_REP_EXTENDED
被期望返回SIGN_EXTEND
或者UNKNOWN
。而且没有目标机将mode扩展为mode_rep,以至于mode_rep不是下一个最宽的整型机器模式,目前,我们利用了这个事实。)类似于
LOAD_EXTEND_OP
,你可以返回一个非UNKNOWN
的值,即使扩展在特定硬件寄存器上没有被执行,只要对于这些硬件寄存器的REGNO_REG_CLASS
,CANNOT_CHANGE_MODE_CLASS
返回非零。注意,
TARGET_MODE_REP_EXTENDED
和LOAD_EXTEND_OP
描述了两个相关联的属性。如果你定义了TARGET_MODE_REP_EXTENDED (mode, word_mode)
,你可能还要定义LOAD_EXTEND_OP (mode)
,来返回相同类型的扩展。为了加强
mode
的表示,当截取成mode
时,TRULY_NOOP_TRUNCATION
应该返回假。
一个C表达式,描述了整型机器模式的比较运算符返回的值,并且当条件为真时由存储标记指令(‘scond’)存储。该描述必须应用到所有的‘scond’指令模式,并且所有比较运算的结果必须具有
MODE_INT
机器模式。值为1或者-1,意味着实现比较运算的指令当比较为真时返回确切的1或者-1,当比较为假时返回0。否则,值会表示当比较为真时结果的哪些位保证为1。该值按照比较运算的机器模式来解析,其由‘scond’指令模式中的第一个操作数的机器模式给出。目前,编译器只用到了
STORE_FLAG_VALUE
的低位或者符号位。如果
STORE_FLAG_VALUE
不为1或者-1,则编译器将生成只依赖特定位的代码。其还可以用等价的运算来替换比较运算,如果它们会造成需要的位被设置,即使其它位没有被定义。例如,在比较运算返回一个SImode
值的机器上,其STORE_FLAG_VALUE
被定义为‘0x80000000’,说明只有符号位是相关的,表达式(ne:SI (and:SI x (const_int power-of-2)) (const_int 0))可以被转换为
(ashift:SI x (const_int n))
其中n为适当的移位计数,用来将被测试的位移送到符号位。
没有办法来描述,一个机器对于真值,总是设置低顺序的位,而不保证其它位的值。但是,我们不知道是否有机器具有这样的指令。如果你正在尝试将GCC移植到这样的机器上,那么可以在比较运算的指令模式中,包含一条指令来执行将结果和1进行逻辑与,并且通过gcc@gcc.gnu.org让我们知道。
通常,机器将具有多个指令,从比较(或者条件代码)中获得一个值。这里有一些规则用来指导对
STORE_FLAG_VALUE
的值的选择,以及要使用的指令:
- 使用最短的序列,产生
STORE_FLAG_VALUE
的有效定义。对编译器来说,将值正常化(例如,将其转成1或者0)要比进行比较运算更有效,因为可能会有一些机会来合并其它的正常化运算。- 对于等长的序列,使用值1或者-1。在跳转代价比较高的机器上,一般会倾向于-1,其它一些机器喜欢用1。
- 作为第二种选择,选择值‘0x80000001’,如果存在指令,同时设置符号位和低顺序位,但是不定义其它位。
- 否则,使用值‘0x80000000’。
许多机器可以同时产生供
STORE_FLAG_VALUE
选择的值,以及同样数量指令的取反。在那些机器上,你应该还定义这些情况的指令模式,例如,(set A (neg:m (ne:m B C)))一些机器还可以在条件代码值上,执行
and
或者plus
运算,使用少于相应的‘scond’ insn后跟随and
或者plus
的指令数目。在这些机器上,需要定义适当的指令模式。分别使用名字incscc
和decscc
,对于在条件代码值上执行plus
或者minus
运算的指令模式。参见rs6000.md中的一些例子。可以使用GNU Superoptizer来在其它机器上查找这样的指令序列。如果该宏没有被定义,则使用缺省的值1。你不需要定义
STORE_FLAG_VALUE
,如果机器没有存储标记的指令,或者如果这些指令生成的值为1。
一个C表达式,给出一个非零的
REAL_VALUE_TYPE
值,当浮点比较运算的结果为真时返回该值。在一些机器上,具有返回浮点值的比较运算,可以定义该宏。如果没有这样的运算,则不要定义该宏。
一个C表达式,给出一个rtx,表示向量比较中非零的真元素。返回的rtx应该对于mode的内部机器模式是有效的,mode为一个向量机器模式。定义该宏,在一些机器上,具有返回向量结果的向量比较运算。如果没有这样的运算,则不要定义该宏。通常,该宏被定义为
const1_rtx
或者constm1_rtx
。该宏可以返回NULL_RTX
,来阻止编译器优化给定的机器模式的向量比较运算。
一个C表达式,指示体系机构是否为
clz
或者ctz
在操作数为零时,定义了值。结果为0
,表示值未被定义。如果值只被定义为RTL表达式,则宏应该求值为1
;如果还应用到相应的optab项(其通常情况为直接扩展为相应的RTL),则宏应该求值为2
。在值被定义的情况下,value应该被设置为该值。如果该宏没有被定义,则
clz
或者ctz
在操作数为零时,被认为未定义。该宏必须被定义,如果目标机对
ffs
的扩展,依赖于特定的值,以获得正确的结果。否则,没有必要,虽然其可以用于优化一些边角的情况,并且为ffs
optab提供缺省的扩展。注意,不论该宏是否定义,
clz
和ctz
在操作数为0时的定义,都不会被扩展为用户可见的内建函数。因此,可以任意调整该值,来匹配对这些运算的目标机扩展,而无需担心会破坏API。
指针的机器模式别名。在大多数机器上,定义该宏为整型机器模式,对应于硬件指针宽度;32位机器上为
SImode
,64位机器上为DImode
。在一些机器上,你必须定义该宏为部分整型机器模式,例如PSImode
。
Pmode
的宽度必须至少与POINTER_SIZE
的值一样大。如果不相等,你必须定义宏POINTERS_EXTEND_UNSIGNED
来描述指针如何被扩展为Pmode
。
机器模式的别名,在
call
RTL表达式中,用于被调用函数的内存引用。在大多数CISC机器上,指令可以起始于任意字节地址,这应该为QImode
。在大多RISC机器上,所有的指令都具有固定的大小和对齐方式,这应该为与机器指令字具有相同大小和对齐的机器模式,通常为SImode
或者HImode
。
正常的操作中,预处理器会将
__STDC__
扩展为常量1,来表明GCC遵循ISO标准C。在一些主机上,例如Solaris,系统编译器使用不同的约定,__STDC__
通常为0,但是如果用户指出要严格遵循C标准时为1。定义
STDC_0_IN_SYSTEM_HEADERS
使得GNU CPP遵循主机的约定,当处理系统头文件时,但是,当处理用户文件时__STDC__
将总是被扩展为1。
定义该宏,如果系统头文件支持C++,也支持C。该宏抑制了通常在C++中使用系统头文件的方法,即假设文件的内容包含在‘extern "C" {...}’中。
定义该宏,如果你想实现任何目标机特定的pragma。如果被定义,其为一个C表达式,为每个pragma使用一系列的对
c_register_pragma
或者c_register_pragma_with_expansion
调用。该宏还可以做任何pragma所要求的设置。定义该宏的主要原因是提供相同目标机上,与其它编译器的兼容性。大体上,我们不鼓励为GCC定义目标机特定的pragma。
如果pragma可以通过attribute属性来实现,则你也应该考虑定义目标机钩子‘TARGET_INSERT_ATTRIBUTES’。
出现在pragma行中的预处理器宏不被扩展。所有不匹配被注册的‘#pragma’指令,将被安静的忽略,除非用户指定-Wunknown-pragmas。
每个对
c_register_pragma
或者c_register_pragma_with_expansion
的调用,都建立了一个pragma。当预处理器遇到一个形式为#pragma [space] name ...的pragma,则callback函数将被调用。
space为大小写敏感的pragma命名空间,或者为
NULL
,将gragma放在全局命名空间中。回调函数接受pfile作为第一个参数,如果需要其可以被传递给cpplib的函数。你可以通过调用pragma_lex
,来词法分析name之后的token。没有被回调函数读入的token将被安静的忽略。行尾由类型为CPP_EOF
的token来指示。宏扩展发生在使用c_register_pragma_with_expansion
注册的pragma的参数上,但不在使用c_register_pragma
注册的pragma的参数上。注意,使用
pragma_lex
是特定于C和C++编译器的。其在Java或者Fortran编译器上,或者其它语言编译器上无法工作。因此,如果pragma_lex
准备从目标机特定代码中被调用,其必须只在构建C和C++编译器的时候执行。这可以通过在config.gcc文件中的目标机项中,定义变量c_target_objs
和cxx_target_objs
来实现。这些变量应该命名目标机特定的,语言特定的对象文件,其包含了使用pragma_lex
的代码。注意,还有必要增加一个规则到由tmake_file
指定的makefile片断中,来显示如何构建该目标文件。
定义该宏(值为1),如果你想gcc支持System V风格的pragma ‘#pragma pack(<n>)’和‘#pragma weak <name> [=<value>]’。
pack pragma描述了结构体中域的最大对齐方式(以字节为单位),很大程度上等同于使用‘__aligned__’和‘__packed__’
__attribute__
。pack值为零,会将行为重置为缺省。对于目标机支持的微软Visual C/C++风格的位域打包(例如-mms-bitfields),其微妙之处在于:当位域被插入到一个打包了的记录中时,则底层类型的整个大小会被一个或多个相同大小临近的位域使用(也就是说,如果为long:3,则记录会使用32位,任何额外的临近的long位域将被打包到32位块中。然而,如果大小改变了,则会分配一个新的同样大小的域)。
如果MS位域和‘__attribute__((packed))’都被使用,则后者优先。如果当在使用MS位域的时候,‘__attribute__((packed))’被用于一个单独的域,则对于该域是优先的,但是结构体的其它部分的对齐方式会影响它的放置。
weak pragma只有当
SUPPORTS_WEAK
和ASM_WEAKEN_LABEL
被定义时,才工作。如果可用,其允许创建特殊命名的弱标号,以及可选的值。
定义该宏(值为1),如果你想支持Win32风格的pragmas ‘#pragma pack(push[,n])’ and ‘#pragma pack(pop)’。‘pack(push,[n])’ pragma指定结构体内的域的最大对齐方式(按字节),等同于使用‘__aligned__’ 和 ‘__packed__’
__attribute__
。如果pack值为0,则会将行为重置为缺省情况。连续的调用该pragma会造成先前的值被压栈,所以调用‘#pragma pack(pop)’会返回先前的值。
True if
#pragma extern_prefix
is to be supported.
如果你的目标机要求结构体缺省的打包方式不是0(意味着机器缺省方式),则定义该宏为必要的值(以字节为单位)。该值必须还对于‘#pragma pack()’有效(也就是说,2的小的幂数)。
定义该宏,来控制C语言家族,标识符名字中对字符‘$’的使用。0意味着缺省不允许使用‘$’;1意味着允许。缺省为1;对于这种情况,不需要定义该宏。
定义该宏,如果汇编器不接受标号名字中的‘.’。缺省的,G++的构造函数和析构函数的名字会使用‘.’。如果该宏被定义,则这些名字被重写,以避免出现‘.’。
定义该宏为一个C表达式,其为非零,如果对于延迟槽调度器,将指令放在insn的延迟槽中是安全的,即使它们可能会使用insn设置或者破坏的一个资源。insn总是一个
jump_insn
或者insn
;GCC知道每个call_insn
具有这种行为。在一些机器上,一些insn
或者jump_insn
确实为一个函数调用,因此也具有这种行为,你应该定义该宏。如果其总是返回零,则不需要定义该宏。
定义该宏为一个C表达式,其为非零,如果对于延迟槽调度器,将指令放在insn的延迟槽中是安全的,即使它们可能会设置或者破坏insn使用的一个资源。insn总是一个
jump_insn
或者insn
。在一些机器上,一些insn
或者jump_insn
确实为一个函数调用,并且其操作数为寄存器,实际是在其调用的子函数中使用,你应该定义该宏。这使得延迟槽调度器将复制参数到参数寄存器的指令移送到insn的延迟槽中。如果其总是返回零,则不需要定义该宏。
定义该宏为一个C表达式,其为非零,如果对于一些情况,没有用户的介入,一个转换单元中的全局符号可能不会被发现为另一个转换单元中的未定义的符号。例如,在Microsoft Windows下,符号必须被从共享库(DLL)中显式的导入。
如果其总是为零,则不需要定义该宏。
该目标钩子将移植平台希望一个asm可以自动破坏的硬件寄存器增加到clobbers
STRING_CST
tree中。其应该返回最后一个用于增加一个破坏者的tree_cons
。outputs, inputs 和 clobber为asm的相应的参数,可以用来检查以避免破坏asm的输入或者输出寄存器。你可以使用tree.h中声明的tree_overlaps_hard_reg_set
来测试是否与asm声明的寄存器有重叠。
定义该宏为一个C字符串常量,为连接器的参数,作为系统数学库连接,或者‘""’,如果目标机没有单独的数学库。
只有当缺省的‘"-lm"’有错误时,才需要定义该宏。
定义该宏,如果目标机支持下列POSIX文件函数,access, mkdir和使用fcntl / F_SETLKW的文件加锁。其还在运行时为交叉profiling创建目录。
一个C表达式,为通过条件执行指令来替代分支的最大指令数。值
BRANCH_COST
+1为缺省值,如果机器没有使用cc0,如果使用了cc0,则为1。
使用该宏,如果目标机需要在将基本块转为条件执行代码时,对条件进行机器相关的修改。ce_info指向一个数据结构,
struct ce_if_block
,其包含了关于当前被处理的块的信息。true_expr和false_expr为测试,分别用于转换then-block和else-block。如果测试不能被转换,则将true_expr或者false_expr设置为空指针。
类似于
IFCVT_MODIFY_TESTS
,不过用于将更加复杂的if语句转换为由and
和or
运算组合的条件。bb包含的基本块,包含了当前被处理的测试,并将被转换为一个条件。
一个C表达式,来修改INSN的PATTERN,其将被转换为一个条件执行的格式。ce_info指向一个数据结构,
struct ce_if_block
,其包含了关于当前被处理的块的信息。
一个C表达式,用来执行在将代码转换为条件执行时,任何最终机器相关的修改。涉及到的基本块可以在由ce_info指向的
struct ce_if_block
结构体中找到。
一个C表达式,用来取消在将代码转换为条件执行时,任何机器相关的修改。涉及到的基本块可以在由ce_info指向的
struct ce_if_block
结构体中找到。
一个C表达式,来初始化任何
struct ce_if_block
结构体中额外的域,其通过IFCVT_EXTRA_FIELDS
宏来定义。
如果被定义,其应该扩展为一个域声明集合,其将被增加到
struct ce_if_block
结构体中。这些应该通过IFCVT_INIT_EXTRA_FIELDS
宏来初始化。
如果非空,则该钩子对指令流执行目标机特定的编译过程。编译器将在所有优化级别上执行该过程,就在其通常执行延迟分支调度之前的地方。
该钩子的确切目的因目标机不同而不同。一些用来为了正确性执行必要的转换,例如布局函数常量池,或者避免硬件冒险。其它用来作为机器相关的优化。
如果没有什么可做的,则不需要实现该钩子。缺省定义为空。
定义该钩子,如果你有任何需要被定义的机器特定的内建函数。其应该为一个函数,执行必要的设置。
机器特定的内建函数可以用于扩展特定的机器指令,否则其通常不会被生成,因为在源语言中没有等价的对应(例如,SIMD向量指令或者预取指令)。
要创建一个内建函数,调用函数
lang_hooks.builtin_function
,其由语言前端定义。你可以使用任何由build_common_tree_nodes
和build_common_tree_nodes_2
建立的类型节点;只有使用这两个函数的语言前端会调用‘TARGET_INIT_BUILTINS’。
Define this hook if you have any machine-specific built-in functions that need to be defined. It should be a function that returns the builtin function declaration for the builtin function code code. If there is no such builtin and it cannot be initialized at this time if initialize_p is true the function should return
NULL_TREE
. If code is out of range the function should returnerror_mark_node
.
扩展由‘TARGET_INIT_BUILTINS’建立的对一个机器特定的内建函数的调用。exp为函数调用的表达式;如果方便的话,结果应该放到target,并且具有机器模式mode。subtarget可以用作目标,来计算exp的操作数。ignore为非零,如果值将被忽略。该函数应该返回调用内建函数的结果。
为‘TARGET_INIT_BUILTINS’建立的机器特定内建函数选择一个替身。这发生在常规的类型检查之前,因此允许目标机来实现函数重载的粗糙形式。fndecl为内建函数的声明。arglist为传递给内建函数的参数列表。结果为一个完全表达式,实现了该运算,通常为另一个
CALL_EXPR
。
将‘TARGET_INIT_BUILTINS’建立的机器特定的内建函数的调用进行折叠。fndecl为内建函数的声明。arglist为传递给内建函数的参数列表。结果为另一个tree,包含了一个简化的表达式,为调用的结果。如果ignore为真,则值将被忽略。
接受一个指令insn,如果其在一个低开销循环中有效,则返回NULL,否则返回一个字符串说明为什么不能应用doloop。
许多目标机使用特定的寄存器,用于低开销循环。对于任何破坏这些的指令,该函数应该返回一个字符串,指出不能应用doloop的原因。缺省的,RTL循环优化不对包含函数调用或者表指令分支的循环,使用现有的doloop指令模式。
接受一个分支insn branch1和另一个branch2。返回真,如果将branch1重定向到branch2的目的地是可能的。
在一些目标机上,分支可能具有有限的范围。优化延迟槽的填充,可以导致分支可以被重定向,反过来也可能会造成一个分支的偏移量溢出。
该目标钩子返回
true
,如果x被认为是可交换的。通常,这就是COMMUTATIVE_P (x)。但是HP PA不认为PLUS在MEM中是可交换的。outer_code为包含rtl的rtx代码,如果知道,否则为UNKNOWN。
当硬件寄存器的初始值已经被复制到伪寄存器中,通常没有必要为该伪寄存器分配另一个寄存器,因为可以使用原始的硬件寄存器或者被保存到的栈槽。在寄存器分配的起始处,
TARGET_ALLOCATE_INITIAL_VALUE
针对每个其初始值使用get_func_hard_reg_initial_val
或者get_hard_reg_initial_val
复制过的,硬件寄存器被调用一次。可能的值为,NULL_RTX
如果你不想做任何特殊的分配,一个REG
rtx——其通常为硬件寄存器本身,如果知道其不会被破坏——或者一个MEM
。如果返回一个MEM
,这只是一个给分配器的提示;其仍然有可能会决定用另一个寄存器。你可以在钩子中使用current_function_leaf_function
,用来确定被询问的硬件寄存器是否会被破坏。该钩子的缺省值为NULL
,其禁止了任何特殊的分配。
该目标钩子返回非零,如果x,一个
unspec
或者unspec_volatile
运算,可能会造成一个陷阱。目标机可以使用该钩子来加强对unspec
和unspec_volatile
运算的分析的精确性。你可以调用may_trap_p_1
来分析x的内部元素,这种情况下,也应该传递flags。
编译器每当改变当前函数上下文(
cfun
)时,便会调用该钩子。你可以定义该函数,如果后端需要基于每个函数执行任何初始化或者重置行为。例如,其可以用来实现函数属性,影响寄存器的使用或者代码生成指令模式。参数decl为新的函数上下文的声明,可以为空,表示编译器已经离开函数上下文,要返回顶层去处理。缺省钩子函数不做任何事情。GCC将
cfun
设置为一个哑的函数上下文,在初始化后端一些部分的时候。钩子函数在这种情况下不会被调用;你不需要担心钩子函数被递归调用,或者当后端处于部分初始化的状态。
如果被定义,
collect2
将在其命令行中扫描单独的目标文件,并为连接器创建一个导出列表。为AIX这样的系统定义该宏,并使用导出列表,其连接器会丢弃没有从main
中引用的对象文件。
定义该宏为一个C表达式,表示方法调用mdecl的一个变种,如果Java Native Interface (JNI)方法必须通过你目标机上其它方法来调用。例如,在32位Microsoft Windows上,JNI方法必须使用
stdcall
调用约定来调用,该宏则被定义为如下表达式:build_type_attribute_variant (mdecl, build_tree_list (get_identifier ("stdcall"), NULL))
该目标钩子在一个点之后返回
true
,该处应该创建新的跳转指令。在一些机器上,对每个跳转都要求使用寄存器,例如SH5的SHmedia ISA,该点通常为重载,所以该目标钩子应该被定义为这样的函数:static bool cannot_modify_jumps_past_reload_p () { return (reload_completed || reload_in_progress); }
该目标钩子返回一个寄存器类,分支目标寄存器优化将会应用在该类别上。该类别中的所有寄存器应该是可以互换使用的。重载之后,该类别中的寄存器将被重新分配,并且加载将被悬挂在循环之外,从属于块间调度。
分支目标寄存器优化,缺省的会将,被调用者保存的寄存器排除在外,其在当前函数中已经是不活跃的。如果目标钩子返回真,它们将被包含进来。目标代码必须确保在由‘TARGET_BRANCH_TARGET_REGISTER_CLASS’返回的类别中的所有寄存器,如果需要保存的,会被保存。after_prologue_epilogue_gen指出是否序言和尾声已经被生成。注意,即使你只当after_prologue_epilogue_gen为假时返回真,你还可能要在
INITIAL_ELIMINATION_OFFSET
做出特定的预防,来为调用者保存的目标寄存器保留空间。
This target hook returns true if the target supports conditional execution. This target hook is required only when the target has several different modes and they have different conditional execution capability, such as ARM.
This target hook returns a new value for the number of times loop should be unrolled. The parameter nunroll is the number of times the loop is to be unrolled. The parameter loop is a pointer to the loop, which is going to be checked for unrolling. This target hook is required only when the target has special constraints like maximum number of memory accesses.
If defined, this macro is interpreted as a signed integer C expression that specifies the maximum number of floating point multiplications that should be emitted when expanding exponentiation by an integer constant inline. When this value is defined, exponentiation requiring more than this number of multiplications is implemented by calling the system library's
pow
,powf
orpowl
routines. The default value places no upper bound on the multiplication count. 如果被定义,该宏被解析为一个有符号整型C表达式,描述了浮点乘法的最大数。
该钩子用于记录目标机的任何额外的include文件。参数stdinc指示是否存在通常的include文件。参数sysroot为系统根目录。参数iprefix为gcc目录的前缀。
该钩子用于记录目标机的任何先于标准头文件之前的include文件。参数stdinc指示是否存在通常的include文件。参数sysroot为系统根目录。参数iprefix为gcc目录的前缀。
该目标机钩子用来记录目标机特殊的include路径。参数path为要记录的include。在Darwin系统上,被用于Framework include,其语义与-I有所不同。
该目标机钩子返回
true
,如果当为虚函数构造thunk时,使用局部别名是安全的,否则为false
。缺省的,钩子对所有函数返回true
,如果目标机支持别名(即:定义了ASM_OUTPUT_DEF
),否则false
。
如果被定义,则该宏为全局变量的名字,其包含了目标机特定的格式,用来覆盖-Wformat选项。缺省为没有目标机特定的格式覆盖。如果被定义,则
TARGET_FORMAT_TYPES
也必须被定义。
如果设置为
true
,则意味着目标机的内存模型不保证,没有依赖关系的加载操作会按照指令流的顺序来访问主存;如果顺序很重要,那么必须使用显式的内存栅栏。这对许多现在的处理器是这样的,例如Alpha, PowerPC和ia64,其实现了关于内存一致性的“relaxed,” “weak,” 或 “release”策略。缺省为false
。
如果被定义,则当传递参数val给函数原型为typelist的函数funcdecl是非法的时候,该宏会返回诊断信息。
如果被定义,则当从fromtype转换成totype是无效的时候,该宏会返回诊断信息,或者返回
NULL
,如果有效性应该由前端来确定。
如果被定义,则当在类型为type的操作数上执行op(一元的加号通过
CONVERT_EXPR
来表示)是无效的时候,该宏会返回诊断信息,或者返回NULL
,如果有效性应该由前端来确定。
如果被定义,则当在类型为type1和type2的操作数上执行op是无效的时候,该宏会返回诊断信息,或者返回
NULL
,如果有效性应该由前端来确定。
If defined, this macro returns the diagnostic message when it is invalid for functions to include parameters of type type, or
NULL
if validity should be determined by the front end. This is currently used only by the C and C++ front ends.
If defined, this macro returns the diagnostic message when it is invalid for functions to have return type type, or
NULL
if validity should be determined by the front end. This is currently used only by the C and C++ front ends.
If defined, this target hook returns the type to which values of type should be promoted when they appear in expressions, analogous to the integer promotions, or
NULL_TREE
to use the front end's normal promotion rules. This hook is useful when there are target-specific types with special promotion rules. This is currently used only by the C and C++ front ends.
If defined, this hook returns the result of converting expr to type. It should return the converted expression, or
NULL_TREE
to apply the front end's normal conversion rules. This hook is useful when there are target-specific types with special conversion rules. This is currently used only by the C and C++ front ends.
该宏定义是否使用JCR段来记录Java类。缺省的,如果SUPPORTS_WEAK和TARGET_HAVE_NAMED_SECTIONS都为真,则TARGET_USE_JCR_SECTION被定义为1,否则为0。
定义该宏,如果对于libgcc中那些为调用栈展开(call stack unwinding)提供低级别支持的函数上,需要附加目标机特定的属性时。其被用在unwind-generic.h中的声明和那些函数相关的定义中。
定义该宏为动态重对齐参数指针(Dynamic Realign Argument Pointer)的rtx,如果当栈被对齐时,需要用不同的参数指针寄存器来访问函数的参数列表。
当优化被禁止时,该钩子用来指示参数是否应该被分配到栈槽中。通常,GCC当不做优化时,会为参数分配栈槽,以便于调试。然而,当函数使用
__attribute__((naked))
声明时,将没有栈帧,因此编译器不能安全的将参数从用来传递它们的寄存器中移送到栈上。因此,该钩子通常应该返回真,但是对于裸露的函数应该返回假。缺省的实现总是返回真。
On some architectures it can take multiple instructions to synthesize a constant. If there is another constant already in a register that is close enough in value then it is preferable that the new constant is computed from this register using immediate addition or subtraction. We accomplish this through CSE. Besides the value of the constant we also add a lower and an upper constant anchor to the available expressions. These are then queried when encountering new constants. The anchors are computed by rounding the constant up and down to a multiple of the value of
TARGET_CONST_ANCHOR
.TARGET_CONST_ANCHOR
should be the maximum positive value accepted by immediate-add plus one. We currently assume that the value ofTARGET_CONST_ANCHOR
is a power of 2. For example, on MIPS, where add-immediate takes a 16-bit signed value,TARGET_CONST_ANCHOR
is set to ‘0x8000’. The default value is zero, which disables this optimization.