*参照元 [#v191128f]
#backlinks

*説明 [#e9165748]
-パス: [[gcc-8.3/gcc/target-hooks-macros.h]]

-FIXME: これは何?
--HOOK_VECTOR_1() の定義により結果が全く違う。非常にわかりにくい。
--HOOK_VECTOR_1(), HOOKSTRUCT の定義により結果が全く違う。非常にわかりにくい。
---[[gcc-8.3/gcc/HOOK_VECTOR1()]]
---[[gcc-8.3/gcc/HOOKSTRUCT()]]


**引数 [#qb03cedb]
-INIT_NAME
--
-SNAME
--構造体の名前


**返り値 [#e608fbe1]
-なし、関数ではない


**参考 [#r7f08caf]

** target.h の場合 [#z7072a92]

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 {

-target.h 版: [[gcc-8.3/gcc/HOOK_VECTOR1()(target)]]


** genhooks.c の場合 [#u5863d8c]

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要素を定義するために使っている。

-genhooks.c 版: [[gcc-8.3/gcc/HOOK_VECTOR1()(genhooks)]]


*実装 [#af1c8ee3]
 #define HOOK_VECTOR(INIT_NAME, SNAME) HOOK_VECTOR_1 (INIT_NAME, struct SNAME {)
-
--[[gcc-8.3/gcc/HOOK_VECTOR1()]]


*コメント [#oc5d16d8]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS