Next: , Previous: Driver, Up: Target Macros


17.3 运行时的target指定

这些是运行时的target指定。

— Macro: TARGET_CPU_CPP_BUILTINS ()

该类函数的宏扩展成一块代码,其定义了target CPU内建的预处理器宏和断言, 使用函数builtin_define, builtin_define_stdbuiltin_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()可以用来检查传统的预处理。

— Macro: TARGET_OS_CPP_BUILTINS ()

类似于TARGET_CPU_CPP_BUILTINS,不过该宏是可选的,用于target操作系统。

— Macro: TARGET_OBJFMT_CPP_BUILTINS ()

类似于TARGET_CPU_CPP_BUILTINS,不过该宏是可选的,用于target目标文件格式。 elfos.h使用该宏来定义__ELF__,所以你可能不需要自己定义。

— Variable: extern int target_flags

该变量在options.h中声明,其在任何target特定的头文件之前被包含进来。

— Variable: Target Hook int TARGET_DEFAULT_TARGET_FLAGS

该变量指定了target_flags的初始值。其缺省设置为0。

— Target Hook: bool TARGET_HANDLE_OPTION (size_t code, const char *arg, int value)

该宏当用户指定了在.opt定义文件(参见Options)中描述的target特定选项 时被调用。其可以做一些选项特定的处理,并且如果选项有效时应该返回真。 缺省的定义不做任何事情,只是返回真。

code指定了与选项相关的OPT_name枚举值; 这里的name只是对选项名的重写,将非字母和数字的字符替换为下划线。 arg指定了字符串参数,如果没有参数则为空。 如果选项被标记为UInteger(参见Option properties), 则value为参数的数值。否则value为1,如果使用了正的选项, 为0如果使用了“no-”形式。

— Target Hook: bool TARGET_HANDLE_C_OPTION (size_t code, const char *arg, int value)

宏当用户指定了在.opt定义文件(参见“选项”)中描述的target特定的C语言家族 的选项时被调用。其可以做一些选项特定的处理,并且如果选项有效时应该返回真。 缺省的定义不做任何事情,只是返回假。

通常,你应该使用TARGET_HANDLE_OPTION来处理选项。然而, 如果选项处理只需要在C(和相关语言)前端中有效时, 你再使用TARGET_HANDLE_C_OPTION

— Macro: TARGET_VERSION

该宏为C语句,用来在stderr上打印表示特定机器描述选择的字符串。 每个机器描述都应该定义TARGET_VERSION。例如:

          #ifdef MOTOROLA
          #define TARGET_VERSION \
            fprintf (stderr, " (68k, Motorola syntax)");
          #else
          #define TARGET_VERSION \
            fprintf (stderr, " (68k, MIT syntax)");
          #endif
— Macro: OVERRIDE_OPTIONS

有时特定的命令选项组合在特定的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.

— Target Hook: void TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE (void)

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 when TARGET_OPTION_OVERRIDE is called so if you want to perform these actions then, you should have TARGET_OPTION_OVERRIDE call TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE.

— Macro: C_COMMON_OVERRIDE_OPTIONS

类似于OVERRIDE_OPTIONS,但只用于C语言的前端(C, Objective-C, C++, Objective-C++),所以可以用于修改只存在于那些前端中的选项标志变量。

— Macro: OPTIMIZATION_OPTIONS (level, size)

一些机器可能需要改变不同优化级别所做的优化。该宏,如果定义, 将在优化级别被确定后,剩余命令选项被解析前执行。 该宏中设定的值将被作为其它命令行选项的缺省值。

level为指定的优化级别;如果指定-O2则为2, 如果指定-O则为1,如果都没指定则为0。

如果指定-Ossize为非零,否则为0。

不要使用该宏来改变不是机器特定的选项。 这些应该在所有支持的机器上的相同优化级别上被统一选择。 使用该宏来打开机器特定的优化。

不要在该宏中检查write_symbols

— Target Hook: bool TARGET_HELP (void)

该钩子当用户在命令行中执行--target-help时被调用。 使得target可以显示在其.opt文件中找到的机器特定的命令行选项信息。

— Macro: CAN_DEBUG_WITHOUT_FP

定义该宏,如果没有帧指针也可以进行调试。如果定义了该宏, 则只要指定-O,GCC便打开-fomit-frame-pointer选项。

— Macro: SWITCHABLE_TARGET

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 and nomips16 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.