Cha*_*tel 6 llvm llvm-gcc llvm-clang llvm-ir llvm-c++-api
我正在编写一个自制语言的编译器,它只能处理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
^
Run Code Online (Sandbox Code Playgroud)
对于声明 a = b > 3
error: stored value and pointer type do not match
store i1 %gttmp, i32* @a
^
Run Code Online (Sandbox Code Playgroud)
有关如何做到这一点的任何建议?
我想到了。要转换i1到i32,正如指出的伊斯梅尔巴达维在这里,我用IRBuilder::CreateIntCast。所以,如果v是Value *指针指向导致的表达i1,我下面将其转换为i32:
v = Builder.CreateIntCast(v, Type::getInt32Ty(getGlobalContext()), true);
Run Code Online (Sandbox Code Playgroud)
但同样不能用于转换i32为i1. 它会将值截断为最低有效位。所以i32 2会导致i1 0. 我需要i1 1非零i32。如果v是Value *指向导致 的表达式的指针i32,我执行以下操作将其转换为i1:
v = Builder.CreateICmpNE(v, ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 0, true))
Run Code Online (Sandbox Code Playgroud)