2012-03-22 134 views
7

我試圖檢測數組聲明併爲靜態大小的數組構建符號值表。它將包含一個name-arraySize配對。我有幾個問題:LLVM指令變量名稱和參數

1)給定一條指令,如%a = alloca [200 x i8],對齊16如何提取數組的名稱「a」。

2)我想提取「200」作爲數組的大小,但這樣的代碼:

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

得到我「123-132 1」當我打印v有誰知道這是爲什麼?除了可能的地址,我不認爲有關於此的任何32bit。

+0

好吧,我想出瞭如何獲得大小: ArrayType * a = cast (p-> getElementType()); A-> getNumElements() – Realn0whereman 2012-03-22 18:06:19

+3

好吧......所以......我想出如何得到名字太... allocInst->的getName() 爲什麼簡單地張貼在計算器可以幫助我找到答案更快...:P – Realn0whereman 2012-03-22 18:12:02

+6

如果您只發布包含此信息的答案,而不是評論,那麼最好。這樣,問題將被正確標記爲已回答。 – Oak 2012-10-18 13:11:21

回答

2

一些答案在評論中,但這裏有一個更完整的解釋。

在alloca中有兩個大小的來源:分配的類型的大小以及分配的那種類型的元素的數量。如果您沒有明確指定數字,則會隱式分配單個元素。這是您從操作數#0中獲得的i32 1值。 如果分配的類型是一個數組類型(使用dyn_cast<...>來測試這個,因爲cast<...>將聲明),那麼你也需要考慮這個大小。

在LLVM中,優化程序將具有大於1的靜態大小的alloca指令規範化爲具有該大小的單個數組的alloca指令。所以你最經常看到alloca的大小是一個常量。

這有更友好的API,以及:http://llvm.org/docs/doxygen/html/classllvm_1_1AllocaInst.html

特別地,AllocaInst::getArraySize()將獲得您的元素(通常爲1)的數量和AllocaInst::getAllocatedType()將獲得您所分配的元素的類型(有時數組) 。

最後,關於使用名稱的說明:LLVM不會使的任何保證有關指令的名稱。優化器的各個部分將銷燬名稱或更改它們。只要小心使用它們來製作代碼,因爲當它們離開時你可能會感到驚訝。