美文网首页
[DEBUG]类型冲突错误调试(整数类型转换)

[DEBUG]类型冲突错误调试(整数类型转换)

作者: HAPPYers | 来源:发表于2019-10-02 11:06 被阅读0次

调试过程

最近在写创建loop的IR maker,但是在边界条件比较的地方,直接assert退出了。

Assertion failed: getOperand(0)->getType() == getOperand(1)->getType() && "Both operands to ICmp instruction are not of the same type!", file ***\llvm-8.0.1.src\include\llvm/IR/Instructions.h, line 1195

跟踪到相关源代码

Value* EndCond = Builder.CreateICmpULT ( IndVar, EndVal, "endcond" );
        outs() << EndCond->getType();
EndCond = Builder.CreateICmpNE ( EndCond, Builder.getInt32 ( 0 ), "loopcond" );

这块地方报了上述错误,提示操作数间类型不匹配。
CreateICmpNE的第二个操作数是i32类型的。那么我们看第一个操作数的类型。
翻看Value类的实现,有getType()函数,但是在Type类中,类型只有如下17种,没有对integer作位数的细化。

enum TypeID {
    // PrimitiveTypes - make sure LastPrimitiveTyID stays up to date.
    VoidTyID = 0,    ///<  0: type with no size
    HalfTyID,        ///<  1: 16-bit floating point type
    FloatTyID,       ///<  2: 32-bit floating point type
    DoubleTyID,      ///<  3: 64-bit floating point type
    X86_FP80TyID,    ///<  4: 80-bit floating point type (X87)
    FP128TyID,       ///<  5: 128-bit floating point type (112-bit mantissa)
    PPC_FP128TyID,   ///<  6: 128-bit floating point type (two 64-bits, PowerPC)
    LabelTyID,       ///<  7: Labels
    MetadataTyID,    ///<  8: Metadata
    X86_MMXTyID,     ///<  9: MMX vectors (64 bits, X86 specific)
    TokenTyID,       ///< 10: Tokens

    // Derived types... see DerivedTypes.h file.
    // Make sure FirstDerivedTyID stays up to date!
    IntegerTyID,     ///< 11: Arbitrary bit width integers
    FunctionTyID,    ///< 12: Functions
    StructTyID,      ///< 13: Structures
    ArrayTyID,       ///< 14: Arrays
    PointerTyID,     ///< 15: Pointers
    VectorTyID       ///< 16: SIMD 'packed' format, or other vector type
  };

通过IntegerTyID的注释,我们找到llvm/IR/DerivedTypes.h头文件,在里面找到了获取整数位数的函数

unsigned Type::getIntegerBitWidth() const {
  return cast<IntegerType>(this)->getBitWidth();
}

我们调试后发现CreateICmpULT返回的是i1类型的,和i32类型的不匹配。这个时候需要转换一下,这里选择把i1转为i32,当然也可以把i32的改为i1类型(会有截断问题,下面会介绍)。
注意需要引入DerivedTypes.h头文件

#include "llvm/IR/DerivedTypes.h"
    Value* EndCond = Builder.CreateICmpULT ( IndVar, EndVal, "endcond" );
        outs() << "TypeID is :"<<(EndCond->getType())->getTypeID();
    if ( EndCond->getType()->isIntegerTy() )
        outs() <<"\nthe bit width is : "<< EndCond->getType()->getIntegerBitWidth() << "\n";
    else
        outs() << "\nNot integer\n";
    EndCond = Builder.CreateIntCast (
            EndCond, Type::getInt32Ty ( Context ),
            true );
    EndCond = Builder.CreateICmpNE ( EndCond, Builder.getInt32 ( 0 ), "loopcond" );

调试出EndCond的类型

TypeID is :11
the bit width is : 1

i1与i32的类型互转

i1转i32

使用IRBuilder::CreateIntCast
例如如果vValue *指向i1的表达式的指针,将其转换为i32

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

i32转i1

上个方法不能用于将i32转换为i1 。 它会将值截断为最低有效位。 所以i32 2将导致i1 0
但是我们需要把非零i32转换为i1 1i32 0转换为i1 0
如果vValue *指针指向一个i32的表达式,将其转换为i1

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

这里相当于间接用到了上面调试出来的,CreateICmpNE的返回值是i1的特性,巧妙地转换了类型。

PS

更多的类型在doxygen可以看到

相关文章

  • [DEBUG]类型冲突错误调试(整数类型转换)

    调试过程 最近在写创建loop的IR maker,但是在边界条件比较的地方,直接assert退出了。 跟踪到相关源...

  • Swift 里容易被忽略的类型转换工具

    Swift 类型转换 整数类型之间的转换 实例代码如下: 相比numericCast与使用整数类型的构造方法来转换...

  • SAS 导出excel错误

    错误提示: WARNING: 插入期间: : 无法为列转换数据类型值: debug方法: outfile='c:...

  • 四、SQL函数④(其他函数)

    类型转换 隐式转换:数据库系统自动将字符串类型转换为整数类型显式转换:使用类型转换函数转换。使用类型转换函数不仅可...

  • Swift-数字类型转换、别名

    整数和浮点转换 整数和浮点数字类型之间的转换必须显式: 浮点到整数转换也必须显式。 整数类型可以使用Double或...

  • 猿学-Java基础教程运算详解及简单的练习

    数据类型转换 自动类型转换 存储容量小的数据类型的数据可以直接转换成存储容量大的数据类型的数据 整数和整数之间的转...

  • 从零开始学swift之基本类型

    浮点数和类型转换 浮点数 2.类型转换在swift中没有类型的自动转换,因为很多错误都可能因为类型隐式转换导致错误...

  • 学习记录

    类型转换as?类型转换,转换成功,返回一个可选类型,转换不成功返回nilas!类型转换,转换失败回报运行错误备注:...

  • java基础篇二(数据类型)

    一、分类: 二、数据类型的转换: 自动类型转换: boolean类型不可能与其他任何数据类型进行转换,整数与浮点数...

  • 4.函数

    数据类型转换 Python内置的常用函数还包括数据类型转换函数,比如int()函数可以把其他数据类型转换为整数: ...

网友评论

      本文标题:[DEBUG]类型冲突错误调试(整数类型转换)

      本文链接:https://www.haomeiwen.com/subject/byglpctx.html