2017-11-20 17 views
-3
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'を指し示すように調整することを目指していますが、実際は理解できません。次のコードを理解するには?

+1

コードの理解方法:0)どの言語かを知る1)コメント/文書を読む2)コードを書いた人に尋ねる3)コメント/文書を再度読​​む。 1〜3回適用しない場合は1a)コーヒーを入れる2)何か他のことをしてください – user463035818

+0

サイドノートとして:これを試したり操作したりしてください。ここの答え/コメントのために。マルチラインマクロ定義の途中でコメントが壊れています。他のすべての行の最後に '\'があることに注意してください。 – Yunnosch

+0

「4行のコードは何をしますか?」というコメントは読者の注意を引くために自分で追加されています。私はそれらの4行のコードが実際に動作することを意味します!実際にそこにいくつかの意味があります。 rspをmill_spに変更し、スタックmill_sp内で関数 'fn'を実行し続けます。 – zhangjie

答えて

3

何も分かりません。コードの動作は未定義です。

(char*)&mill_anchor - (char*)(mill_sp)は、同じ配列のポインタである場合にのみ有効です。あなたの場合はそうではありません。

コンパイラはあなたの猫を食べる権利を留保します。

このようなCのビルドマクロは、絶対に忌憚のないものです。それをしないでください。

+0

長さ「0」のVLAを作成する前でさえ、本当に役立たない。 –

+0

mallocによって割り当てられたrspをmill_spに変更します。 – zhangjie

0

上記のコードは、ランタイムスタック割り当てを利用してrspレジスタをメモリ領域mill_spを指すように調整するため、関数fnはmill_spをスタック領域として使用します。

関連する問題