源码路径
llvm\include\llvm\IR\Constant.h
llvm ConstantData class
ConstantData类是所有简单常量的基类,继承树如下:
ConstantData仅用于表示常量本身,使用了Flyweight设计模式,可以在不相关的Module之间共享。既比如1个的常量i32 100,可以用于所有需要表示常量i32 100的地方,仅需要1个对象实例。
ConstantInt
表示任意位宽的整型常量。如下代码:
int constant_int() {
return 100;
}
生成的IR中就存在1个ConstantInt:i32 100
define dso_local i32 @_Z12constant_intv() #0 {
entry:
ret i32 100
}
ConstantFP
表示任意位宽的浮点常量。如下代码:
float constant_float() {
return 1.1;
}
生成的IR中就存在1个ConstantFP:float 0x3FF19999A0000000
define dso_local float @_Z14constant_floatv() #0 {
entry:
ret float 0x3FF19999A0000000
}
ConstantAggregateZero
表示复合零常量,通常用于全零初始化。如下代码:
extern const int a[10] = {0};
int constant_aggregate_zero() {
int b = a[0];
return b;
}
生成的IR中就存在1个ConstantAggregateZero:zeroinitializer
@a = dso_local constant [10 x i32] zeroinitializer, align 16
define dso_local i32 @_Z23constant_aggregate_zerov() #0 {
entry:
%0 = load i32, i32* getelementptr inbounds ([10 x i32], [10 x i32]* @a, i64 0, i64 0), align 16
ret i32 %0
}
ConstantPointerNull
表示空指针,如下代码:
int* constant_pointer_null() {
return nullptr;
}
生成的IR中就存在1个ConstantPointerNull:i32* null
define dso_local i32* @_Z21constant_pointer_nullv() #0 {
entry:
ret i32* null
}
UndefValue
表示Undef Value,如下代码:
int constant_undef() {
int a;
return a;
}
生成的IR中就存在1个UndefValue:i32 undef
define dso_local i32 @_Z14constant_undefv() #0 {
entry:
ret i32 undef
}
ConstantTokenNone
待补充
ConstantDataArray
常量数组,成员必须是1/2/4/8 byte的整形,或者是float/double。如下代码:
extern const int arr[5] = {1,2,3,4,5};
int constant_data_array(int b) {
return arr[b];
}
生成的IR中就存在1个ConstantDataArray:[i32 1, i32 2, i32 3, i32 4, i32 5]
@arr = dso_local constant [5 x i32] [i32 1, i32 2, i32 3, i32 4, i32 5], align 16
define dso_local i32 @_Z19constant_data_arrayi(i32 %b) #0 {
entry:
%idxprom = sext i32 %b to i64
%arrayidx = getelementptr inbounds [5 x i32], [5 x i32]* @arr, i64 0, i64 %idxprom
%0 = load i32, i32* %arrayidx, align 4
ret i32 %0
}
ConstantDataVector
待补充