从具有多个llvm返回的函数构建AST

从具有多个llvm返回的函数构建AST,llvm,Llvm,例如,我有以下功能: def max(a,b) { if(a < b) return b; if(a > b) return a; } def最大值(a、b){ 如果(ab)返回a; } 我很好奇如何将其解析为AST。 如果我理解得很好,那么它的主体节点应该返回ReturnInst* 但是在我的AST中,这个主体由两个节点(作为表达式)包含,一个用于第一个if,另一个用于另一个if 是否有一些技巧或设计是错误的开始 编辑:我刚刚提出了一个可能的解决方案: 在主体的开头

例如,我有以下功能:

def max(a,b) {
   if(a < b) return b;
   if(a > b) return a;
}
def最大值(a、b){
如果(ab)返回a;
}
我很好奇如何将其解析为AST。 如果我理解得很好,那么它的主体节点应该返回ReturnInst*

但是在我的AST中,这个主体由两个节点(作为表达式)包含,一个用于第一个if,另一个用于另一个if

是否有一些技巧或设计是错误的开始

编辑:我刚刚提出了一个可能的解决方案:

  • 在主体的开头创建Alloca
  • 创建存储并在每次返回时跳转到结束标签
  • 在标签末尾返回变量

  • 这是个好主意吗?以及如何使用llvm跳转/跳转?

    如果我理解正确,您概述的alloca+store+jump解决方案肯定有效。是的,LLVM优化器会处理得很好。或者,对于给定函数中ret指令的数量没有任何限制


    不确定生成goto时你在问什么;如果您已经成功地编写了一条if语句,那么它将与一条语句末尾所需的br指令相同。通常,在一些简单的代码上运行“clang-S-emit llvm”是了解如何生成简单构造的一种好方法。此外,“LLC—Max= CPP”是一个很好的方法来查看如何在C++中构建指令。

    < P>你可以尝试在线演示:在C或C++中键入你想要做的事情,它将显示LLVM输出。

    演示页面C++后端严重过时,并且呈现在LLVM(3)的最新版本中不起作用的代码。对于这个特殊的结构,这并不重要,但是在建议人们依靠它来理解API时要注意这一点