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 :(得分:3)
没有什么可以理解的。代码的行为未定义。
只有当指针来自同一个数组时, (char*)&mill_anchor - (char*)(mill_sp)
才有效。在你的情况下,他们不是。
编译器保留吃猫的权利。
即使在C中构建这样的宏也是绝对应该受到谴责的。不要这样做。
答案 1 :(得分:0)
上面的代码利用运行时堆栈分配来调整rsp寄存器以指向内存区域mill_sp,因此函数fn将使用mill_sp作为堆栈区域。