Next: Per-Function Data, Previous: Driver, Up: Target Macros
该类函数的宏扩展成一块代码,其定义了target CPU内建的预处理器宏和断言, 使用函数
builtin_define
,builtin_define_std
和builtin_assert
。当前端调用该宏时,其提供一个尾部的分号, 由于其已经结束了命令行选项处理,所以你的代码可以自由的使用那些结果。
builtin_assert
接受一个字符串,按照传给命令行选项-A的形式, 例如cpu=mips
,并且创建一个断言。builtin_define
接受一个字符串, 按照传给命令行选项-D的形式,并且无条件的定义一个宏。
builtin_define_std
接受一个字符串,来表示对象的名字。 如果其不在用户命名空间,则builtin_define_std
无条件的定义它。否则, 定义一个具有两个前导下划线的版本,和另一个具有两个前导和后缀的下划线的版本。 例如传递unix
,将定义__unix
,__unix__
以及可能的unix
; 传递_mips
,将定义__mips
,__mips__
和可能的_mips
, 传递_ABI64
,将指定义_ABI64
。你还可以测试被编译的C方言。变量
c_language
被设为clk_c
,clk_cplusplus
或者clk_objective_c
。注意,如果我们在预处理汇编, 则该变量将为clk_c
,不过类函数的宏preprocessing_asm_p()
将返回真, 所以你可能要先检查它。如果你需要检查严格的ANSI,可以使用变量flag_iso
。 类函数的宏preprocessing_trad_p()
可以用来检查传统的预处理。
类似于
TARGET_CPU_CPP_BUILTINS
,不过该宏是可选的,用于target目标文件格式。 elfos.h使用该宏来定义__ELF__
,所以你可能不需要自己定义。
该宏当用户指定了在.opt定义文件(参见Options)中描述的target特定选项 时被调用。其可以做一些选项特定的处理,并且如果选项有效时应该返回真。 缺省的定义不做任何事情,只是返回真。
code指定了与选项相关的
OPT_
name枚举值; 这里的name只是对选项名的重写,将非字母和数字的字符替换为下划线。 arg指定了字符串参数,如果没有参数则为空。 如果选项被标记为UInteger
(参见Option properties), 则value为参数的数值。否则value为1,如果使用了正的选项, 为0如果使用了“no-”形式。
宏当用户指定了在.opt定义文件(参见“选项”)中描述的target特定的C语言家族 的选项时被调用。其可以做一些选项特定的处理,并且如果选项有效时应该返回真。 缺省的定义不做任何事情,只是返回假。
通常,你应该使用
TARGET_HANDLE_OPTION
来处理选项。然而, 如果选项处理只需要在C(和相关语言)前端中有效时, 你再使用TARGET_HANDLE_C_OPTION
。
该宏为C语句,用来在
stderr
上打印表示特定机器描述选择的字符串。 每个机器描述都应该定义TARGET_VERSION
。例如:#ifdef MOTOROLA #define TARGET_VERSION \ fprintf (stderr, " (68k, Motorola syntax)"); #else #define TARGET_VERSION \ fprintf (stderr, " (68k, MIT syntax)"); #endif
有时特定的命令选项组合在特定的target机器上没有意义。 你可以定义该宏
OVERRIDE_OPTIONS
。 如果定义,则在所有的命令选项被解析后执行。不要使用该宏来打开-O额外的优化。 使用
OPTIMIZATION_OPTIONS
来做这件事情。If you need to do something whenever the optimization level is changed via the optimize attribute or pragma, see
TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE
This macros is obsolete, new ports should use the target hook
TARGET_OPTION_OVERRIDE
instead.
This target function is similar to the hook
TARGET_OPTION_OVERRIDE
but is called when the optimize level is changed via an attribute or pragma or when it is reset at the end of the code affected by the attribute or pragma. It is not called at the beginning of compilation whenTARGET_OPTION_OVERRIDE
is called so if you want to perform these actions then, you should haveTARGET_OPTION_OVERRIDE
callTARGET_OVERRIDE_OPTIONS_AFTER_CHANGE
.
类似于
OVERRIDE_OPTIONS
,但只用于C语言的前端(C, Objective-C, C++, Objective-C++),所以可以用于修改只存在于那些前端中的选项标志变量。
一些机器可能需要改变不同优化级别所做的优化。该宏,如果定义, 将在优化级别被确定后,剩余命令选项被解析前执行。 该宏中设定的值将被作为其它命令行选项的缺省值。
level为指定的优化级别;如果指定-O2则为2, 如果指定-O则为1,如果都没指定则为0。
如果指定-Os则size为非零,否则为0。
不要使用该宏来改变不是机器特定的选项。 这些应该在所有支持的机器上的相同优化级别上被统一选择。 使用该宏来打开机器特定的优化。
不要在该宏中检查
write_symbols
!
该钩子当用户在命令行中执行--target-help时被调用。 使得target可以显示在其.opt文件中找到的机器特定的命令行选项信息。
Some targets need to switch between substantially different subtargets during compilation. For example, the MIPS target has one subtarget for the traditional MIPS architecture and another for MIPS16. Source code can switch between these two subarchitectures using the
mips16
andnomips16
attributes.Such subtargets can differ in things like the set of available registers, the set of available instructions, the costs of various operations, and so on. GCC caches a lot of this type of information in global variables, and recomputing them for each subtarget takes a significant amount of time. The compiler therefore provides a facility for maintaining several versions of the global variables and quickly switching between them; see target-globals.h for details.
Define this macro to 1 if your target needs this facility. The default is 0.