.\icu

Blog of @megakite.


January 1, 0001

靠着debug信息逆向一个IR Builder出来,好玩么?好像有点好玩,但更多的还是折磨,我感觉( 但是没办法,拼字符串生成文本IR实在太捞了,你能受得了么?我反正受不了,所以还是把能搓的都搓一搓。

# Lv3.1. 一元表达式

所以这整个IR的结构就很有趣了——它已经不是树了,而是根据SSA形式生成的有向有环图。所以首先要考虑的问题就是针对树的析构方法已经不再适用,我们需要考虑一种更有效的方法。 去问LLM说「我能不能把所有结点的指针记录在一个vector里然后一起free」,它告诉我这不好,但也没说为什么不好。主要是我隐约觉得,从这种方法再进一步可能就是池化,但听起来也挺麻烦的。 Lv4回顾:最后还是从朋友那里听说了一种名叫bump allocator的东西,似乎在GC领域有extensive use,于是就按这个实现了。所以说,AI好用,但最能解决问题的方式,还是去问有实际工程经验的人

此外,在codegen的过程中采用了一个struct either_t作为codegen_value()的返回值——我确实不太能想到有什么更好的办法可以做到:让一次函数调用拥有处理新结点引用旧结点两种情况的能力。实际上如果不这么干,那ht_find()两遍也是可以的,但是不太好。

# Lv3.2. 算术表达式

EMIT("t%d, t%d", --g_reg_t_n, --g_reg_t_n);

没想到我真的有一天会用到这种语义。 写着玩的,unsequenced,别学。

# Lv3.3. 比较和逻辑表达式

ret = value_binary_new(KOOPA_RBO_NOT_EQ,
					   memir_Exp(lhs, ret),
					   memir_Exp(rhs, ret),
					   used_by);

我想这么写,结果不行:因为ret在传进去之前还没被分配……封装构造函数的梦想破灭了,我还是先好好手写吧。说实话,之后应该好好看看怎么把这些东西封装成IR Builder。