2015-05-02 28 views

回答

0

它看起來像LLVMTypeOf,然後LLVMTypeKind函數從值中獲取類型枚舉。

+0

我發現很難搜索LLVM C文檔。你有鏈接嗎? – Brent

+0

這給出了值的類型(例如i8,i32 *等),而不是指令的類型(例如加載,存儲等) –

0

每個值子類都有LLVMIsA*函數。它們可能有點難以找到,因爲它們是由宏生成的。 The declarations, in Core.h, look like this

#define LLVM_DECLARE_VALUE_CAST(name) \ 
    LLVMValueRef LLVMIsA##name(LLVMValueRef Val); 
LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DECLARE_VALUE_CAST) 

而且the definitions, in Core.cpp, look like this

#define LLVM_DEFINE_VALUE_CAST(name)          \ 
    LLVMValueRef LLVMIsA##name(LLVMValueRef Val) {       \ 
    return wrap(static_cast<Value*>(dyn_cast_or_null<name>(unwrap(Val)))); \ 
    } 

LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DEFINE_VALUE_CAST) 

所以對於一個LLVMValueRef V應該能夠編寫例如LLVMIsAStoreInst(V),它將返回相同的值或空值。中間子類也可以工作,例如, LLVMIsAInstruction(V),LLVMIsAConstant(V)

或者,對於特別說明,您可以使用LLVMGetInstructionOpcode,並將enum與the LLVMOpcode values進行比較。如果參數不是指令,它也會方便地返回0

順便說一句(作爲對您評論的迴應),我認爲頭文件通常是查找LLVM文檔的最佳位置,因爲doxygen文檔有時會令人困惑。例如,Core.h非常簡單易讀,this comment可以解答您的問題。