2012-03-22 18 views
7

Dizisel bildirimleri algılamaya çalışıyorum ve statik boyutlu diziler için bir sembol değeri tablosu oluşturmaya çalışıyorum. Bir ad-arraySize eşleştirmesi içerecektir. Birkaç sorum var:LLVM Değişken adları ve parametreleri

1)% a = alloca [200 x i8] gibi bir komut verildiğinde, hizala, dizinin adı olan "a" ı nasıl ayıklayabilirim.

2) dizi boyutu ancak bu kodu olarak "200" ayıklamak için çalışıyorum:

if(AllocaInst *allocInst = dyn_cast<AllocaInst>(&*I)){ 
    PointerType *p = allocInst->getType(); 
    if(p->getElementType()->isArrayTy()){ 
      Value* v = allocInst->getOperand(0); 
      errs() << *v ; 
    } 
}      

bana "i32 1" verir ben yazdırırken bu yüzden v bilen var mı.? Bunun dışında 32bit bir şey olduğunu düşünemedim.

+0

Tamam, bu nedenle boyutu nasıl alacağımı anladım: ArrayType * a = cast (p-> getElementType()); a-> getNumElements() – Realn0whereman

+3

... tamam yani ... ben de adını almak nasıl anladım ... allocInst-> getName() Neden sadece stackoverflow gönderme beni yanıtları daha hızlı bulmanıza yardımcı olduğunu ...: P – Realn0whereman

+6

Sadece bu bilgiyi içeren bir yanıt gönderirseniz yorum yapmak yerine, en iyisi budur. Bu şekilde soru, cevaplandığı gibi uygun şekilde işaretlenecektir. – Oak

cevap

2

Bazı cevaplar yorumlarda, ancak burada daha kapsamlı bir açıklama var. ayrılan tip boyutu ve tahsis edilen bu tür elemanların sayısı:

bir alloca büyüklüğü iki kaynağı vardır. Açık olarak bir sayı belirtmezseniz, tek öğeli öğesinin ayrık varsayılan değerini alırsınız. Bu, # 0 teriminden çıkardığınız i32 1 değeridir. ise, ayrılmış tür bir dizi türüdür (cast<...> belirteceği gibi bunu test etmek için dyn_cast<...> kullanın), o zaman bu boyutu da hesaba katmanız gerekir.

LLVM'de, eniyileyici, alloca komutlarını bir taneden daha büyük bir statik büyüklükle, bu boyutta tek bir dizinin alloca komutuna canonicalizes. Böylece, çoğu kez alloca boyutunu sabit olarak görürsünüz.

bunun için daha fazla dost API'leri yanı vardır: Özellikle http://llvm.org/docs/doxygen/html/classllvm_1_1AllocaInst.html

, AllocaInst::getArraySize() size elemanlar (genellikle 1) sayısını elde edecek ve AllocaInst::getAllocatedType() size tahsis elemanın türünü (bazen bir dizi) alacak .

Son olarak, adı kullanma hakkında bir not: LLVM, talimatların adları hakkında herhangi bir garantisini yapmaz. Optimize edicinin çeşitli kısımları isimleri tahrip edecek veya değiştirecektir. Sadece üretim kodları için dikkatli olun çünkü gittiklerinde şaşıracaksınız.

İlgili konular