【发布时间】:2018-04-26 02:58:06
【问题描述】:
我正在为一种只能处理 int 值的自制语言编写编译器,即i32。条件和表达式类似于 C 语言。因此,我将条件语句视为表达式,即它们返回一个 int 值。它们也可以用在表达式中,例如 (2 > 1) + (3 > 2) 将返回 2。但 LLVM 条件输出 i1 值。
- 现在,我希望在每个条件语句之后,将
i1转换为i32,这样我就可以进行二进制操作了 - 另外,我想使用变量和表达式结果作为条件,例如
if(variable)或if(a + b)。为此,我需要将i32转换为i1
最后,我想要一种从i1 转换为i32 以及从i32 转换为i1 的方法。截至目前,我的代码给出了这些类型的错误:
对于像if(variable)这样的声明:
error: branch condition must have 'i1' type
br i32 %0, label %ifb, label %else
^
对于像a = b > 3这样的声明
error: stored value and pointer type do not match
store i1 %gttmp, i32* @a
^
关于如何做到这一点的任何建议?
【问题讨论】:
-
有TruncInst。我没有立即的答案,但我会编译一个简单的程序到 LLVM IR,看看如何使用 trunc 指令。这个简单的程序必须包含截断
i32 -> i1,以便发出 TruncInst。 -
反之:
i1 -> i32你很可能需要CastInst。 -
IRBuilder::CreateIntCast 将根据需要创建一个 zext / trunc / bitcast。
标签: llvm llvm-clang llvm-ir llvm-gcc llvm-c++-api