int mill_unoptimisable1_ = 0
void *mill_unoptimisable2_ = NULL;
#define mill_go_(fn) \
do {\
void *mill_sp;\
mill_ctx ctx = mill_getctx_();\
if(!mill_setjmp_(ctx)) {\
mill_sp = mill_prologue_(MILL_HERE_);\
// what does following 4 lines code do ? Modify %rsp ? How ?
int mill_anchor[mill_unoptimisable1_];\
mill_unoptimisable2_ = &mill_anchor;\
char mill_filler[(char*)&mill_anchor - (char*)(mill_sp)];\
mill_unoptimisable2_ = &mill_filler;\
fn;\
mill_epilogue_();\
}\
} while(0)
上記のコードを理解するには、%rspを 'mill_sp'を指し示すように調整することを目指していますが、実際は理解できません。次のコードを理解するには?
コードの理解方法:0)どの言語かを知る1)コメント/文書を読む2)コードを書いた人に尋ねる3)コメント/文書を再度読む。 1〜3回適用しない場合は1a)コーヒーを入れる2)何か他のことをしてください – user463035818
サイドノートとして:これを試したり操作したりしてください。ここの答え/コメントのために。マルチラインマクロ定義の途中でコメントが壊れています。他のすべての行の最後に '\'があることに注意してください。 – Yunnosch
「4行のコードは何をしますか?」というコメントは読者の注意を引くために自分で追加されています。私はそれらの4行のコードが実際に動作することを意味します!実際にそこにいくつかの意味があります。 rspをmill_spに変更し、スタックmill_sp内で関数 'fn'を実行し続けます。 – zhangjie