Arrays 5个整数的llvm数组被编译成16字节数组全局变量

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中

我正在尝试创建一个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,因为它失败了,我不知道为什么

; 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