在LLVM中嵌套basicblock时如何生成LLVM IR
有一个函数basicblock a,位于块a内部的另一个块,如何生成LLVM IR。例如:在LLVM中嵌套basicblock时如何生成LLVM IR,llvm,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); } 您的块A和B不是基本块,它们只是块。C(或任何一种语言)没有基本块的概念——LLVM有 LLVM中的基本块不必(通常也不必
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);
}
您的块
A
和B
不是基本块,它们只是块。C(或任何一种语言)没有基本块的概念——LLVM有
LLVM中的基本块不必(通常也不必)与源语言中的块相对应。基本上,一个基本块只是一个代码单元,因此您永远不会跳进或跳出它的中间。你只能跳到块的开头,也只能从块的末尾跳
源语言中的块可以用于多种用途。有时它们被用作控制流语句的一部分,有时则不是。有时,您可以使用不带块的控制流。例如,在许多语言中,循环和if
语句可以与不是复合语句的单个语句体一起使用(例如if(condition)return;
-此处无块,但仍控制流)。同样地,switch
语句通常没有针对每种情况的块,当然还有goto
因此,当有没有块的控制流时,生成的程序将包含比源程序包含的块更多的基本块。在相反的情况下,如果存在没有控制流的块,则生成的程序将包含较少的基本块
在您的示例中,函数
fun
除了函数末尾的隐式返回之外,不包含任何控制流。因此,您应该只为它生成一个基本块。您的块a
和B
不是基本块,它们只是块。C(或任何一种语言)没有基本块的概念——LLVM有
LLVM中的基本块不必(通常也不必)与源语言中的块相对应。基本上,一个基本块只是一个代码单元,因此您永远不会跳进或跳出它的中间。你只能跳到块的开头,也只能从块的末尾跳
源语言中的块可以用于多种用途。有时它们被用作控制流语句的一部分,有时则不是。有时,您可以使用不带块的控制流。例如,在许多语言中,循环和if
语句可以与不是复合语句的单个语句体一起使用(例如if(condition)return;
-此处无块,但仍控制流)。同样地,switch
语句通常没有针对每种情况的块,当然还有goto
因此,当有没有块的控制流时,生成的程序将包含比源程序包含的块更多的基本块。在相反的情况下,如果存在没有控制流的块,则生成的程序将包含较少的基本块
在您的示例中,函数
fun
除了函数末尾的隐式返回之外,不包含任何控制流。因此,您应该只为它生成一个基本块。请回答您的问题并提供一个基本块。基本块不能嵌套。请澄清您的意思。您将高级词汇作用域与基本块混淆,因为sepp2k指出基本块不能嵌套。请回答您的问题并提供答案。基本块不能嵌套。请澄清你的意思。你把高级词汇作用域和基本块混淆了,因为sepp2k指出基本块不能嵌套。嗨,你的答案引用了任何LLVM文档吗?如果是,请提供它们好吗?@linrongbin否,我的回答中没有任何关于LLVM文档的参考。你是说应该这样吗?如果是,那是哪一部分?嗨,你的答案是否引用了任何LLVM文档?如果是,请提供它们好吗?@linrongbin否,我的回答中没有任何关于LLVM文档的参考。你是说应该这样吗?如果有的话,是哪一部分?