Estoy tratando de crear una matriz de 5 ints e inicializarla. Tengo entendido que debería aparecer como 4 * 5 = 20 bytes, pero siempre se compila como una matriz de 16 bytes y la inicialización termina sobrescribiendo otra matriz.

Objdump muestra que el tamaño de los objetos globales en el archivo de objeto es de 16 bytes, y no tengo idea de lo que está sucediendo.

El archivo bc producido por un ejecutable que usa llvm8.0.1 como biblioteca, el objeto es producido por clang-8.0.1, el ll es producido por llvm-dis8.0.1

La idea del código es establecer intVectorConstant en 0, -1, -2, -3, -4 e intVector en 0, 1, 2, 3, 4

Lamento no poder quitar las líneas del ll y compilarlas para hacerlo más simple, pero si ejecuto llvm, ya que está fallando y no estoy seguro de por qué.

; 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
}

Si corro

clang -c file.bc -o out
objdump out -t | grep intVector

Entiendo

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
1
blallo 9 oct. 2019 a las 01:05

1 respuesta

La mejor respuesta

Encontré el problema, estaba usando ConstantAggrerateZero :: get (int32Type) como inicializador de los globales en lugar de ConstantAggregateZero :: get (int32ArrayType) y eso estaba produciendo

@intVector_old = global [5 x i32] 0

Con el inicializador correcto se convierte en:

@intVectorConstant = global [5 x i32] zeroinitializer

Y ahora tienen un desplazamiento de 32 bytes en el archivo de objeto.

1
blallo 9 oct. 2019 a las 08:29