llvm libLLVMCore源码分析 16 - ConstantData

源码路径

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

待补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值