HOOK_VECTOR は構造体の定義を宣言するために使われる。
/* The target structure. This holds all the backend hooks. */ #define DEFHOOKPOD(NAME, DOC, TYPE, INIT) TYPE NAME; #define DEFHOOK(NAME, DOC, TYPE, PARAMS, INIT) TYPE (* NAME) PARAMS; #define DEFHOOK_UNDOC DEFHOOK #define HOOKSTRUCT(FRAGMENT) FRAGMENT //★★★★(2) #include "target.def"
HOOK_VECTOR_1 は未定義のまま target.def をインクルードする。
target.def
#include "target-hooks-macros.h" #undef HOOK_TYPE #define HOOK_TYPE "Target Hook" HOOK_VECTOR (TARGET_INITIALIZER, gcc_target)
target-hooks-macros.h
/* HOOK_VECTOR: Start a struct declaration, which then gets its own initializer. HOOK_VECTOR_END: Close a struct declaration, providing a member declarator name for nested use. */ #ifndef HOOK_VECTOR_1 #define HOOK_VECTOR_1(NAME, FRAGMENT) HOOKSTRUCT (FRAGMENT) //★★★★(1) #endif
となっているため、
HOOK_VECTOR (TARGET_INITIALIZER, gcc_target) ↓ 定義より HOOK_VECTOR_1(TARGET_INITIALIZER, struct gcc_target {) ↓ (1) より HOOKSTRUCT (struct gcc_target{) ↓ (2) より struct gcc_target {
HOOK_VECTOR は static struct hook_desc hook_array[] の 1要素を定義するために使われる。
#define HOOK_VECTOR_1(NAME, FRAGMENT) \ { 0, 0, #NAME, 0, 0, HOOK_TYPE }, //★★★★(1) //... #include "target.def"
target.def
#include "target-hooks-macros.h" #undef HOOK_TYPE #define HOOK_TYPE "Target Hook" HOOK_VECTOR (TARGET_INITIALIZER, gcc_target)
となっているため、
HOOK_VECTOR (TARGET_INITIALIZER, gcc_target) ↓ 定義より HOOK_VECTOR_1(TARGET_INITIALIZER, struct gcc_target {) ↓ (1) より { 0, 0, "TARGET_INITIALIZER", 0, 0, HOOK_TYPE },
となる。target.def の周りはこのような構造体の定義になっているため、
struct hook_desc { const char *doc, *type, *name, *param, *init, *docname; }; static struct hook_desc hook_array[] = { //... #include "target.def" #include "c-family/c-target.def" #include "common/common-target.def" #undef DEFHOOK };
HOOK_VECTOR は hook_array の 1要素を定義するために使っている。
#define HOOK_VECTOR(INIT_NAME, SNAME) HOOK_VECTOR_1 (INIT_NAME, struct SNAME {)