2015-11-06 65 views
2

我想獲取getelementptr指令引用的數組的名稱。這似乎當陣列被索引到工作到在實際的C代碼使用一箇中間變量,像這樣獲取LLVM getelementptr的操作數名稱

int a = 0; 
i[a] = 3; 

在這種情況下,出現以下位碼

%arrayidx = getelementptr inbounds [2 x i32], [2 x i32]* @i, i64 0, i64 %idxprom 
store i32 3, i32* %arrayidx, align 4 

在這種情況下我可以遍歷通過getelementptr指令的操作數 ,並通過第一個操作數的getName()方法找到數組(i)的名稱。

但是,如果在源中,數組是指數直接作爲這樣,

i[0] = 3; 

然後,產生位碼是如下

store i32 3, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @i, i64 0, i64 0), align 4 

在這裏,我不知道怎麼走數組名稱(i)來自位碼。 存儲指令的第二個操作數的類型設置爲PointerTy。第二個操作數的包含類型是一個int。這兩個都是預期的,因爲操作數是i32 *。但是,在這種情況下,我不確定如何獲取getelementptr指令的句柄來迭代操作數。

編輯:我應該指出,在陣列i是一個全球性的

回答

1

在第一個例子中,store指令的第二操作數是getelementptr指令,但是在第二示例中,這是一個getelementptr恆定表達式,因爲指針和索引都是常量。

因此,在第一種情況下,如果得到StoreInst的指針操作數,則會得到一個GetElementPtrInst。在第二種情況下,您將得到一個ConstantExpr,其getOpcode()方法返回Instruction::GetElementPtr

您可以使用GEPOperator在代碼中統一處理這兩種情況。您可以使用dyn_cast<GEPOperator>(I),它可以爲指令和常量執行正確的操作。 (注 - Operator不是LLVM IR概念 - 它只是一個C++抽象概念,可用於幫助您處理指令或常量表達式(可能發生在演員表,GEP或算術運算),但你不關心這個區別。)