llvm教程Kaleidoscope--chapter4笔记

link of chapter4

注意

由于优化,所以很多函数被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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值