2014-01-13 143 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