注意
由于优化,所以很多函数被inline之后名字变了,lldb打了断点可能没用。所以在函数前加_attribute__((noinline)),如:
__attribute__((noinline)) static void MainLoop()
或者不要-O3优化了,直接-O0不优化就好。
问题
这章的添加pass很直观,只需要按着做就好了。难点是实现JIT编译器计算一个函数调用的结果。因此,此处仅调试一个简单的函数定义和函数调用,并讨论其中遇到的问题。
调试代码
ready> def f(x) 1+2+x;
ready> Read function definition:define double @f(double %x) {
entry:
%addtmp = fadd double %x, 1.000000e+00
%addtmp1 = fadd double %addtmp, 2.000000e+00
ret double %addtmp1
}
ready> f(1);
ready> Evaluated to 4.000000
ready> f(2);
ready> Evaluated to 5.000000
调试及讨论
从main函数开始,执行到manloop(),再到HandleDefinition()。
解析完定义后我们得到了函数的AST——FnAST。这个很简单,在前面的章节已经很熟悉了。
然后进行代码产生,得到FnIR。
Function *FunctionAST::codegen() {
// Transfer ownership of the prototype to the FunctionProtos map, but keep a
// reference to it for use below.
auto &P = *Proto;
FunctionProtos[Proto->getName()] = std