5 个整数的 llvm 数组被编译成 16 个字节的数组全局变量
llvm array of 5 ints is compiled into 16 bytes array global var
我正在尝试创建一个 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
和 intVector 到 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[=10=]"
@intVector = global [5 x i32] 0
@intVector_old = global [5 x i32] 0
@intVector_str = global [10 x i8] c"intVector[=10=]"
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
我明白了
0000000000000020 g O .bss 0000000000000014 intVector
0000000000000000 g O .bss 0000000000000014 intVectorConstant
0000000000000010 g O .bss 0000000000000014 intVectorConstant_old
0000000000000000 g O .data 0000000000000012 intVectorConstant_str
0000000000000030 g O .bss 0000000000000014 intVector_old
0000000000000012 g O .data 000000000000000a intVector_str
我发现了问题,我使用 ConstantAggrerateZero::get(int32Type) 作为全局变量的初始值设定项而不是 ConstantAggregateZero::get(int32ArrayType) 并且生成了
@intVector_old = global [5 x i32] 0
使用正确的初始值设定项,它变成:
@intVectorConstant = global [5 x i32] zeroinitializer
现在它们在目标文件中确实有 32 个字节的偏移量。
我正在尝试创建一个 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 和 intVector 到 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[=10=]"
@intVector = global [5 x i32] 0
@intVector_old = global [5 x i32] 0
@intVector_str = global [10 x i8] c"intVector[=10=]"
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
我明白了
0000000000000020 g O .bss 0000000000000014 intVector
0000000000000000 g O .bss 0000000000000014 intVectorConstant
0000000000000010 g O .bss 0000000000000014 intVectorConstant_old
0000000000000000 g O .data 0000000000000012 intVectorConstant_str
0000000000000030 g O .bss 0000000000000014 intVector_old
0000000000000012 g O .data 000000000000000a intVector_str
我发现了问题,我使用 ConstantAggrerateZero::get(int32Type) 作为全局变量的初始值设定项而不是 ConstantAggregateZero::get(int32ArrayType) 并且生成了
@intVector_old = global [5 x i32] 0
使用正确的初始值设定项,它变成:
@intVectorConstant = global [5 x i32] zeroinitializer
现在它们在目标文件中确实有 32 个字节的偏移量。