LLVM-IR 数组指针分配

LLVM-IR array pointer assignment

本文关键字:分配 指针 数组 LLVM-IR      更新时间:2023-10-16

在 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 中是否可行,或者它会立即抱怨类型问题。正要深入研究这个,但我想看看是否有人尝试过这个特定的例子。我会将 GEP A 的第 0 个位置作为 i8* ,然后 B 和 C 作为 i32* 吗?如果这可能的话,我对如何进行有点困惑。

提前谢谢。

更新:

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

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

因此,例如,

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

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

只要记住当你做这样的事情时,就会有恩迪亚。

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

No.这在 C/C++ 中也是不可能的。不应将未初始化的变量分配给另一个变量。它调用未定义的行为*B*c未初始化。