LLVM-IR数组指针赋值

时间:2014-01-13 22:14:24

标签: c++ c pointers llvm llvm-ir

在C ++ / C中,你可以这样做:

unsigned char A[12];
unsigned int *B;
int *C;
B = malloc(sizeof(unsigned int));
C = malloc(2*sizeof(int));
A[0] = *B;
A[4] = *C;
//Then go on to access A byte by byte.

我想知道这在LLVM-IR中是否可行,或者它会立即抱怨类型有问题。即将潜入这个,但我想我会看到是否有人尝试过这个特殊的例子。我会将A的第0个位置作为i8 *,然后将B和C作为i32 *。如果可能的话,我有点困惑如何继续。

提前致谢。

更新:

好的,如果我改为为* B和C [0],C [1]添加初始化,那么LLVM-IR / C / C ++的答案是否会改变?

2 个答案:

答案 0 :(得分:2)

没有。这在C / C ++中也是不可能的。您不应将未初始化的变量分配给另一个变量。它调用未定义的行为。 <{1}}和*B未初始化。

答案 1 :(得分:0)

LLVM具有bitcast指令,该指令通常用于将一种类型的指针转​​换为另一种指针类型 - 例如i32*i8*

因此,例如,如果要访问4字节数字的第3个字节,执行以下操作是完全合法的:

%bytes = bitcast i32* %num to i8*
%third_byte = getelementptr i8* %bytes, i32 2

当你做那样的事情时,请记住结束。

是的,您可以使用此技术获取指向数组中特定位置的指针,并从那里获取storeload值,这样您就可以复制整个示例。