### 17.1 The Global `targetm` Variable

— Variable: struct gcc_target targetm

> The target `.c` file must define the global `targetm` variable which contains pointers to functions and data relating to the target machine. The variable is declared in `target.h`; `target-def.h` defines the macro `TARGET_INITIALIZER` which is used to initialize the variable, and macros for the default initializers for elements of the structure. The `.c` file should override those macros for which the default definition is inappropriate. For example:

>               #include "target.h"
>               #include "target-def.h"

>               /* Initialize the GCC target structure.  */

>               #undef TARGET_COMP_TYPE_ATTRIBUTES
>               #define TARGET_COMP_TYPE_ATTRIBUTES machine_comp_type_attributes

>               struct gcc_target targetm = TARGET_INITIALIZER;

Where a macro should be defined in the `.c` file in this manner to form part of the `targetm` structure, it is documented below as a “Target Hook” with a prototype. Many macros will change in future from being defined in the `.h` file to being part of the `targetm` structure.

Similarly, there is a `targetcm` variable for hooks that are specific to front ends for C-family languages, documented as “C Target Hook”. This is declared in `c-family/c-target.h`, the initializer `TARGETCM_INITIALIZER` in `c-family/c-target-def.h`. If targets initialize `targetcm` themselves, they should set `target_has_targetcm=yes` in `config.gcc`; otherwise a default definition is used.

Similarly, there is a `targetm_common` variable for hooks that are shared between the compiler driver and the compilers proper, documented as “Common Target Hook”. This is declared in `common/common-target.h`, the initializer `TARGETM_COMMON_INITIALIZER` in `common/common-target-def.h`. If targets initialize `targetm_common` themselves, they should set `target_has_targetm_common=yes` in `config.gcc`; otherwise a default definition is used.