Here are run-time target specifications.
TARGET_CPU_CPP_BUILTINS()
builtin_define
, builtin_define_std
and
builtin_assert
defined in c-common.c
. When the front end
calls this macro it provides a trailing semicolon, and since it has
finished command line option processing your code can use those
results freely.
builtin_assert
takes a string in the form you pass to the
command-line option -A
, such as cpu=mips
, and creates
the assertion. builtin_define
takes a string in the form
accepted by option -D
and unconditionally defines the macro.
builtin_define_std
takes a string representing the name of an
object-like macro. If it doesn't lie in the user's namespace,
builtin_define_std
defines it unconditionally. Otherwise, it
defines a version with two leading underscores, and another version
with two leading and trailing underscores, and defines the original
only if an ISO standard was not requested on the command line. For
example, passing unix
defines __unix
, __unix__
and possibly unix
; passing _mips
defines __mips
,
__mips__
and possibly _mips
, and passing _ABI64
defines only _ABI64
.
You can also test for the C dialect being compiled. The variable
c_language
is set to one of clk_c
, clk_cplusplus
or clk_objective_c
. Note that if we are preprocessing
assembler, this variable will be clk_c
but the function-like
macro preprocessing_asm_p()
will return true, so you might want
to check for that first. If you need to check for strict ANSI, the
variable flag_iso
can be used. The function-like macro
preprocessing_trad_p()
can be used to check for traditional
preprocessing.
With TARGET_OS_CPP_BUILTINS
this macro obsoletes the
CPP_PREDEFINES
target macro.
TARGET_OS_CPP_BUILTINS()
TARGET_CPU_CPP_BUILTINS
but this macro is optional
and is used for the target operating system instead.
With TARGET_CPU_CPP_BUILTINS
this macro obsoletes the
CPP_PREDEFINES
target macro.
CPP_PREDEFINES
-D
options to
define the predefined macros that identify this machine and system.
These macros will be predefined unless the -ansi
option (or a
-std
option for strict ISO C conformance) is specified.
In addition, a parallel set of macros are predefined, whose names are
made by appending __
at the beginning and at the end. These
__
macros are permitted by the ISO standard, so they are
predefined regardless of whether -ansi
or a -std
option
is specified.
For example, on the Sun, one can use the following value:
"-Dmc68000 -Dsun -Dunix"
The result is to define the macros __mc68000__
, __sun__
and __unix__
unconditionally, and the macros mc68000
,
sun
and unix
provided -ansi
is not specified.
extern int target_flags;
TARGET_...
TARGET_68020
that tests a bit in
target_flags
.
Define a macro TARGET_
featurename for each such option.
Its definition should test a bit in
target_flags
. It is
recommended that a helper macro TARGET_MASK_
featurename
is defined for each bit-value to test, and used in
TARGET_
featurename and
TARGET_SWITCHES
. For
example:
#define TARGET_MASK_68020 1 #define TARGET_68020 (target_flags & TARGET_MASK_68020)
One place where these macros are used is in the condition-expressions
of instruction patterns. Note how TARGET_68020
appears
frequently in the 68000 machine description file, m68k.md
.
Another place they are used is in the definitions of the other
macros in the machine
.h
file.
TARGET_SWITCHES
target_flags
. Its definition is an initializer
with a subgrouping for each command option.
Each subgrouping contains a string constant, that defines the option
name, a number, which contains the bits to set in
target_flags
, and a second string which is the description
displayed by --help
. If the number is negative then the bits specified
by the number are cleared instead of being set. If the description
string is present but empty, then no help information will be displayed
for that option, but it will not count as an undocumented option. The
actual option name is made by appending -m
to the specified name.
Non-empty description strings should be marked with N_(...)
for
xgettext
. Please do not mark empty strings because the empty
string is reserved by GNU gettext. gettext("")
returns the header entry
of the message catalog with meta information, not the empty string.
In addition to the description for --help
,
more detailed documentation for each option should be added to
invoke.texi
.
One of the subgroupings should have a null string. The number in
this grouping is the default value for target_flags
. Any
target options act starting with that value.
Here is an example which defines -m68000
and -m68020
with opposite meanings, and picks the latter as the default:
#define TARGET_SWITCHES \ { { "68020", TARGET_MASK_68020, "" }, \ { "68000", -TARGET_MASK_68020, \ N_("Compile for the 68000") }, \ { "", TARGET_MASK_68020, "" }}
TARGET_OPTIONS
TARGET_SWITCHES
but defines names of command
options that have values. Its definition is an initializer with a
subgrouping for each command option.
Each subgrouping contains a string constant, that defines the fixed part
of the option name, the address of a variable, and a description string.
Non-empty description strings should be marked with N_(...)
for
xgettext
. Please do not mark empty strings because the empty
string is reserved by GNU gettext. gettext("")
returns the header entry
of the message catalog with meta information, not the empty string.
The variable, type char *
, is set to the variable part of the
given option if the fixed part matches. The actual option name is made
by appending -m
to the specified name. Again, each option should
also be documented in invoke.texi
.
Here is an example which defines -mshort-data-
number. If the
given option is
-mshort-data-512
, the variable m88k_short_data
will be set to the string "512"
.
extern char *m88k_short_data; #define TARGET_OPTIONS \ { { "short-data-", &m88k_short_data, \ N_("Specify the size of the short data section") } }
TARGET_VERSION
stderr
a string
describing the particular machine description choice. Every machine
description should define TARGET_VERSION
. For example:
#ifdef MOTOROLA #define TARGET_VERSION \ fprintf (stderr, " (68k, Motorola syntax)"); #else #define TARGET_VERSION \ fprintf (stderr, " (68k, MIT syntax)"); #endif
OVERRIDE_OPTIONS
OVERRIDE_OPTIONS
to take account of this. This macro, if
defined, is executed once just after all the command options have been
parsed.
Don't use this macro to turn on various extra optimizations for
-O
. That is what OPTIMIZATION_OPTIONS
is for.
OPTIMIZATION_OPTIONS (
level,
size)
level is the optimization level specified; 2 if -O2
is
specified, 1 if -O
is specified, and 0 if neither is specified.
size is nonzero if -Os
is specified and zero otherwise.
You should not use this macro to change options that are not machine-specific. These should uniformly selected by the same optimization level on all supported machines. Use this macro to enable machine-specific optimizations.
Do not examine write_symbols
in
this macro! The debugging options are not supposed to alter the
generated code.
CAN_DEBUG_WITHOUT_FP
-fomit-frame-pointer
option whenever -O
is specified.