Arrays 5个整数的llvm数组被编译成16字节数组全局变量
我正在尝试创建一个5整数数组并初始化它。我的理解是,它应该显示为一个4*5=20字节的数组,但它总是被编译为一个16字节的数组,初始化最终会覆盖另一个数组 Objdump显示进入对象文件的全局对象的大小是16字节,我不知道发生了什么 由使用llvm8.0.1作为库的可执行文件生成的bc文件,对象由clang-8.0.1生成,ll由llvm-dis8.0.1生成 该代码的思想是将intVectorConstant设置为0、-1、-2、-3、-4 整数向量为0,1,2,3,4 很抱歉,我无法从ll中删除行并编译它们以使其更简单,但是如果我运行llvm,因为它失败了,我不知道为什么Arrays 5个整数的llvm数组被编译成16字节数组全局变量,arrays,assembly,static,llvm,llvm-ir,Arrays,Assembly,Static,Llvm,Llvm Ir,我正在尝试创建一个5整数数组并初始化它。我的理解是,它应该显示为一个4*5=20字节的数组,但它总是被编译为一个16字节的数组,初始化最终会覆盖另一个数组 Objdump显示进入对象文件的全局对象的大小是16字节,我不知道发生了什么 由使用llvm8.0.1作为库的可执行文件生成的bc文件,对象由clang-8.0.1生成,ll由llvm-dis8.0.1生成 该代码的思想是将intVectorConstant设置为0、-1、-2、-3、-4 整数向量为0,1,2,3,4 很抱歉,我无法从ll中
; ModuleID = 'lowerer/test/arraySimulation.bc'
source_filename = "Int Test Simulation"
@intVectorConstant = global [5 x i32] 0
@intVectorConstant_old = global [5 x i32] 0
@intVectorConstant_str = global [18 x i8] c"intVectorConstant\00"
@intVector = global [5 x i32] 0
@intVector_old = global [5 x i32] 0
@intVector_str = global [10 x i8] c"intVector\00"
define internal void @init() {
entry:
%0 = alloca [5 x i32]
%1 = getelementptr [5 x i32], [5 x i32]* %0, i32 0, i32 0
store i32 -1, i32* %1
%2 = getelementptr [5 x i32], [5 x i32]* %0, i32 0, i32 1
store i32 -2, i32* %2
%3 = getelementptr [5 x i32], [5 x i32]* %0, i32 0, i32 2
store i32 -3, i32* %3
%4 = getelementptr [5 x i32], [5 x i32]* %0, i32 0, i32 3
store i32 -4, i32* %4
%5 = getelementptr [5 x i32], [5 x i32]* %0, i32 0, i32 4
store i32 -5, i32* %5
%6 = load [5 x i32], [5 x i32]* %0
store [5 x i32] %6, [5 x i32]* @intVectorConstant
store [5 x i32] %6, [5 x i32]* @intVectorConstant_old
%7 = alloca [5 x i32]
%8 = getelementptr [5 x i32], [5 x i32]* %7, i32 0, i32 0
store i32 1, i32* %8
%9 = getelementptr [5 x i32], [5 x i32]* %7, i32 0, i32 1
store i32 2, i32* %9
%10 = getelementptr [5 x i32], [5 x i32]* %7, i32 0, i32 2
store i32 3, i32* %10
%11 = getelementptr [5 x i32], [5 x i32]* %7, i32 0, i32 3
store i32 4, i32* %11
%12 = getelementptr [5 x i32], [5 x i32]* %7, i32 0, i32 4
store i32 5, i32* %12
%13 = load [5 x i32], [5 x i32]* %7
store [5 x i32] %13, [5 x i32]* @intVector
store [5 x i32] %13, [5 x i32]* @intVector_old
ret void
}
如果我跑
clang -c file.bc -o out
objdump out -t | grep intVector
我明白了
我发现了问题,我使用ConstantAggrerateZero::get(int32Type)作为全局变量的初始值设定项,而不是ConstantAggregateZero::get(int32ArrayType),这产生了
@intVector_old = global [5 x i32] 0
使用正确的初始值设定项,它将变为:
@intVectorConstant = global [5 x i32] zeroinitializer
现在,它们在对象文件中的偏移量为32字节。无法在我的机器上复制。在我的例子中,变量的差异是
0x20
。
@intVectorConstant = global [5 x i32] zeroinitializer