.\icu

Blog of @megakite.


January 1, 0001

libkoopa中branchjump语句在生成时的递归动作会使得%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直接干出无数个假阳性,屡次怀疑自己,最后发现写得竟然没问题。过阵子我自己还得重新看看。