在LLVM中嵌套basicblock时如何生成LLVM IR

时间:2018-09-07 07:48:04

标签: llvm

有一个功能块basicblock A,在块A内部的另一个块,如何生成LLVM IR。例如:

int fun()
{/*block A*/
  int i=0;
  {/*block B*/
    int i=1
    printf("i in block B is %d\n",i);
  }
  printf("i in block A is %d\n",i);
 }

1 个答案:

答案 0 :(得分:2)

您的块AB不是基本块,它们只是块。 C(或这是哪种语言)没有基本块的概念,而LLVM有。

LLVM中的基本块不必(通常不必)对应于源语言中的块。基本上,基本块只是一个代码单元,因此您永远不会跳入或跳出它的中间。您只能跳到块的开头,也只能跳到块的结尾。

源语言中的块可以有多种用途。有时它们被用作控制流语句的一部分-有时却没有。有时您可以拥有无​​障碍的控制流程。例如,在许多语言中,循环和if语句可以与不是复合语句的单个语句主体一起使用(例如if (condition) return;-这里没有块,但仍控制流)。同样,switch语句通常在每种情况下都没有障碍,然后当然还有goto

因此,当控制流中没有块时,生成的程序将比源程序中包含的块包含更多的基本块。相反,如果存在没有控制流的块,则生成的程序将包含较少的基本块。

在您的示例中,函数fun不包含任何控制流,除了函数末尾的隐式返回。因此,您应该只为其生成一个基本块。