LLVM 笔记:类型

Type 类

Type 被用于标记 Value 实例的类型。

Type 实例的最主要特异性在于 TypeID 成员,是一个枚举:

TypeID {
  HalfTyID = 0, 
  BFloatTyID, 
  FloatTyID, 
  DoubleTyID,
  X86_FP80TyID, 
  FP128TyID, 
  PPC_FP128TyID, 
  VoidTyID,
  LabelTyID, 
  MetadataTyID, 
  X86_MMXTyID, 
  X86_AMXTyID,
  TokenTyID, 
  IntegerTyID, 
  FunctionTyID, 
  PointerTyID,
  StructTyID, 
  ArrayTyID, 
  FixedVectorTyID, 
  ScalableVectorTyID,
  DXILPointerTyID
}

Phi 指令:自动选择合适的 RHS

a1 = 1;
if (v < 10)
    a2 = 2;
b = PHI(a1, a2);

emplace_back 和 push_back 的区别:

前者,在容器尾部添加一个元素,这个元素原地构造,不需要触发拷贝构造和转移构造。而且调用形式更加简洁,直接根据参数初始化临时对象的成员。

DerivedTypes

包括:

  • IntegerType
    • 也用来表示 Int1Ty, Int8Ty, Int16Ty, Int32Ty
    • 关键属性:NumBits
  • FunctionType
    • 关键属性:Type *Result, ArrayRef<Type*> Params, bool IsVarArgs
  • CompositeType,下分为:
    • ArrayType
    • StructType
    • VectorType
  • PointerType

StructType 分为 Literal structs 与 Identified structs

  • Literal structs:结构体字面量,即创建时必须有 body,像是:{1, 2}。且是唯一的。
  • Identified structs:符号化的结构体,可以有名称,通过 LLVMContext 管理,类似 C 的结构体。
    • 其内部有一个指针 void *SymbolTableEntry 指向其符号表项。
    • 其 Body 为 ArrayRef<Type*> Elements

ArrayType 和 VectorType 同属 SequentialType。表示内存中的数组。

SequentialType 的关键属性:

  • ContainedType:元素类型
  • NumElements:元素个数

ArrayType 的特异性就是其类型 ID 为 ArrayTyID。

相较于 ArrayType ,VectorType 主要是为了 SIMD 而设计。

参考

DerivedTypes.h - llvm