2014-01-13 115 views
0

在C++/C,你可以这样做:LLVM-IR数组指针赋值

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 *。如果这是可能的,我有点困惑如何继续。

提前致谢。

UPDATE:

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

+0

是的,固定的。谢谢。 – redratio1

+1

假设你修复了关于不初始化'* B'和'C [0]'和'C [1]'的位,所有这些都是采用'B指向的'unsigned int'(或'int') '或'C',将其截断为'char'大小,并将其分配给'A'数组中的一个槽。假如你不忽略所有警告,但是由于整型之间的标准转换,这应该是合法的,如果有些可疑的话,你应该得到一个关于精度损失的警告...... – twalberg

+0

@twalberg;谢谢,这是有道理的/我假设,因为有连续的内存,我可以放弃将更大的类型放入数组。并且将这些位扩展到A的分配。 – redratio1

回答

0

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

因此,举例来说,如果你想访问一个4字节数的第3个字节,执行下列操作是完全合法的:

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

记只要保持字节序,当你做这样的东西。

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

2

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

+1

*“你不能”*我认为这是非常严格的语言,因为你可以这样做,但有未定义的行为。 – Manu343726

+0

@ Manu343726;同意。改变了。 – haccks

+0

好吧,但是如果B和C被初始化,它会有一个明确的行为? – redratio1