January 1, 0001
libkoopa中branch
和jump
语句在生成时的递归动作会使得%end
基本块在%else
之前被生成——如果生成%then
时其中已经有jump %end
的话。提了一个issue,然后才知道这其实无所谓,反正在IR里都变成CFG了。
我竟然写出了一个跟evaluation order有关系的bug……
slice_append(&m_curr_basic_block->insts,
koopa_raw_store(InitVal(node->children[1]), ret));
这里m_curr_basic_block
是先被求值的,然后才是koopa_raw_store()
——换句话说,它是「自左向右立即求值」的,所以在koopa_raw_store()
调用中修改的m_curr_basic_block
事实上并没有起作用。
在生成到ret
指令之后的截断处理可能需要花一些心思——似乎这是一个用setjmp()
和longjmp()
的绝佳时机,但是我现在有点懒,留到下一节去处理吧。
最后实在受不了只能测试-koopa
模式,还是重新写了一下寄存器分配,用setjmp()
和longjmp()
搭了一个非常非常hacky的任务队列(协程/迭代器/yield
)机制……然后发现clang默认开启的_FORTIFY_SOURCE
配合-O0
和Asan直接干出无数个假阳性,屡次怀疑自己,最后发现写得竟然没问题。过阵子我自己还得重新看看。