LLVM IR:C ++ API:从i1到i32和i32到i1的{Typecast

时间:2017-11-13 12:12:50

标签: llvm llvm-clang llvm-ir llvm-gcc llvm-c++-api

我正在编写一个自制语言的编译器,它只能处理int值,即i32。条件和表达式与C语言类似。因此,我将条件语句视为表达式,即它们返回一个int值。它们也可用于表达式,例如(2 > 1) + (3 > 2)将返回2。但LLVM条件输出i1值。

  • 现在,我希望在每个条件语句之后,i1应转换为i32,以便我可以执行二进制操作
  • 另外,我想使用变量和表达式结果作为条件,例如if(variable)if(a + b)。为此,我需要将i32转换为i1

最后,我想要一种从i1i32以及从i32i1进行类型转换的方法。我的代码现在给出了这些错误:

对于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
      ^

有关如何做到这一点的任何建议吗?

1 个答案:

答案 0 :(得分:2)

我明白了。要按照here by Ismail Badawi指出要从i1转换为i32,我使用了IRBuilder::CreateIntCast。因此,如果v是指向导致Value *的表达式的i1指针,我会将其转换为i32

v = Builder.CreateIntCast(v, Type::getInt32Ty(getGlobalContext()), true);

但同样不能用于将i32转换为i1。它会将值截断为最低有效位。因此i32 2会产生i1 0。对于非零i1 1,我需要i32。如果vValue *指针指向导致i32的表达式,我会在i1中进行转换:

v = Builder.CreateICmpNE(v, ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 0, true))