如何理解以下代码?

时间:2017-11-20 15:13:16

标签: c stack

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',但我真的无法理解。

2 个答案:

答案 0 :(得分:3)

没有什么可以理解的。代码的行为未定义。

只有当指针来自同一个数组时,

(char*)&mill_anchor - (char*)(mill_sp)才有效。在你的情况下,他们不是。

编译器保留吃猫的权利。

即使在C中构建这样的宏也是绝对应该受到谴责的。不要这样做。

答案 1 :(得分:0)

上面的代码利用运行时堆栈分配来调整rsp寄存器以指向内存区域mill_sp,因此函数fn将使用mill_sp作为堆栈区域。