2016-07-24 31 views
0

我什麼都創建,存儲和LLVM陣列獲取值的步驟那種迷茫,至今我與創造它:困惑LLVM陣列

auto type = llvm::ArrayType::get(<TYPE>, <SOME_UINT>); 
auto array = builder.CreateAlloca(type); 

就這樣,我試過爲每個元素獲取llvm :: InBoundGEP並將llvm :: Value存儲到它們中,但那不起作用...

是否有一些指導要做到這一點?

+0

請特別包括您嘗試的內容,具體以哪種方式無效。 –

+0

嗯,這就是事情,我真的不知道該怎麼做,我怎麼能得到一個指向數組元素的指針,然後讀取/存儲到它呢? – Shelo

+0

數組類型和加載使用extractelement請參閱http://stackoverflow.com/questions/9637803/accessing-elements-in-llvm-arrays和GetElementPointer你可以通過http://llvm.org/docs/GetElementPtr.html –

回答

1

好,今天我發現了LLC -march = CPP工具,實際上幫了我很多,所以我會在這裏解答一下我到底做了:

創建數組(我們首先需要的類型):

auto arrayType = llvm::ArrayType::get(llvm::IntegerType::get(context, 32), size); 
auto arrayPtr = new llvm::AllocaInst(arrayType, "", block); 

現在我們將一些值存儲在陣列中,我們需要整數(閱讀GetElementPtr手冊,以瞭解他們每個人做的),第二個整數會告訴指數(如數組[index]):

auto zero = llvm::ConstantInt::get(context, llvm::APInt(64, 0, true)); 
auto index = llvm::ConstantInt::get(context, llvm::APInt(32, INDEX, true)); 

現在我們可以指出在陣列和存儲東西給它的元件,(我們將相同的索引存儲爲在陣列[索引] =指數):

auto ptr = llvm::GetElementPtrInst::Create(arrayPtr, { zero, index }, "", block); 
auto store = new llvm::StoreInst(index, ptr, false, block); 

做,對於數組中的每個元素。

現在加載,假設你有一個LLVM ::值作爲指數(這是我的情況,並ExtractElementInst沒有處理的是,據我所知,至少有...):

第一得到一個PTR的元素(就像前):

ptr = llvm::GetElementPtrInst::Create(arrayPtr, { zero, index }, "", block); 

和值加載一些變量:

auto value = builder.CreateLoad(ptr); 

有一件事我學到了,你不能輕易創建可變長度的數組,你將不得不使用一些堆棧技巧,我實際上並不知道如何使用,但如果你想知道,這裏是使用說明:http://llvm.org/docs/LangRef.html#llvm-stacksave-intrinsic

嘗試編譯這個簡單的代碼:

int n = 5; int array [n];

clang -S -llvm-emit your-file.c

你會看到這些說明。

+0

如果有人發現代碼有些奇怪,請告訴我,我在這裏學習,任何反饋都非常歡迎。 – Shelo