2016-07-24 19 views
0

ich auf Art verwirrt bin, was sind die Schritte, zu speichern und erhalten Werte von LLVM-Arrays, so weit Ich schaffe es mit zu erstellen:Verwirrt über LLVM Arrays

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

Damit habe ich versucht, um llvm :: InBoundGEP zu jedem Element zu bekommen und llvm :: Value zu speichern, aber das hat nicht funktioniert ...

Gibt es eine Anleitung dafür?

+0

Bitte geben Sie genau an, was Sie ausprobiert haben und insbesondere, in welcher Weise es nicht funktioniert hat. –

+0

Nun, das ist die Sache, ich weiß nicht wirklich, was zu tun ist, wie kann ich einen Zeiger auf ein Element des Arrays bekommen, und danach lesen/speichern? – Shelo

+0

für Array-Typ und Laden mit extractelement siehe http://stackoverflow.com/questions/9637803/accessing-elements-in-llvm-arrays und für GetElementPointer können Sie http://llvm.org/docs/GetElementPtr.html –

Antwort

1

Nun, heute entdeckte ich die llc -march CPP-Tool = und half mir wirklich viel, also werde ich hier beantworten, was ich am Ende tat

das Array (dafür brauchen wir die Art zuerst):

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

jetzt werden wir einige Werte in das Array speichern, für die wir auf ganze Zahlen müssen (das GetElementPtr Handbuch lesen zu wissen, dass jeder von ihnen tun), wird die zweite ganze Zahl des Index (wie in Array sagen [index]):

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

wir jetzt auf das Element in der Anordnung und Laden, um etwas darauf zeigen können, (wir werden den gleichen Index speichern, wie in array [index] = index):

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

, dass Sie das Array für jedes Element .

Nun zu laden, müssen Sie unter der Annahme eine llvm :: Wert als Index (was mein Fall war, und ExtractElementInst dass nicht handhaben, soweit ich zumindest wissen, ...):

zuerst erhalten eine ptr auf das Element (wie vorher):

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

und den Wert bis zu einem gewissen Variable laden:

auto value = builder.CreateLoad(ptr); 

Es gibt eine Sache, die ich gelernt habe, Sie können nicht einfach Arrays variabler Länge erstellen, Sie müssen einige Stapeltricks verwenden, die ich eigentlich noch nicht benutzen kann, aber wenn Sie es wissen wollen, hier sind die folgenden Anweisungen: http://llvm.org/docs/LangRef.html#llvm-stacksave-intrinsic

Versuchen Sie diesen einfachen Code kompiliert:

int n = 5; int Array [n];

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

Und Sie werden diese Anweisungen sehen.

+0

gehen Wenn jemand etwas komisches über den Code findet, lass es mich wissen, ich lerne hier, jede Rückmeldung ist sehr willkommen. – Shelo