2013-01-20 57 views
0

我正在開發一個llvm前端。我的問題是,當我使用'store'指令將值存儲在複雜類型的成員中時,我會遇到分段錯誤。例如,假設我已經在一個模塊中定義了類似%mytype = type {i32,...}的類型,然後我使用以下命令將3存儲在此類型對象的第一個字段中。此代碼導致seg故障有什麼問題?llvm分段錯誤

define void f() { 
... 
%alloc = alloca %mytype* 
%myinstance = load %mytype** %alloc 
%firstfield = getelementptr %mytype* %myinstance, i32 0, i32 0 
store i32 3, i32* %firstfield 
... 
) 

回答

1

的問題是,你已分配了一個指針不分配就是它的指向,所以這也難怪,當您嘗試取消引用該指針你得到一個分段錯誤。

你需要做的是

%alloc = alloca %mytype 
%firstfield = getelementptr %mytype* %alloc, i32 0, i32 0 
store i32 3, i32* %firstfield 

如果由於某種原因,你仍然需要ALLOCA指針 - 換句話說,你要的%mytype**指向一個內存位置有一個指針的值分配的內存 - 那麼你也可以添加到上面:

%ptrptr = alloca %mytype* 
store %mytype* %alloc, %mytype** %ptrptr 
+0

感謝您的建議,但問題是,我應該分配一個指針,即我不能代替「ALLOCA%MYTYPE *」與「ALLOCA% mytype' – user1723583

+0

@ user1723583在這種情況下,您需要兩個disti nct'alloca'指令 - 一個用於分配對象的內存,另一個用於爲指針分配內存。我相應地更新了我的答案。 – Oak