[llvm] LLVM 核心類簡明示例 : llvm::Value && llvm::Type && llvm::Constant
LLVM 核心類簡明示例 : llvm::Value && llvm::Type && llvm::Constant
llvm核心類位於 include/llvm/IR
中,用以表示機器無關且表現力極強的LLVM IR。
llvm::Value
llvm::Value則是這其中的重中之重,它用來表示一個具有型別的值。它是類圖如下:
llvm::Argument
, llvm::BasicBlock
, llvm::Constant
, llvm::Instruction
這些很重要的類都是它的子類。
llvm::Value
有一個 llvm::Type*
成員和一個 use list
。後者可以跟蹤有哪些其他 Value
使用了自己,我們可以使用下面的迭代器對它進行訪問:
- unsigned use_size() 返回有多少Value使用它
- bool use_empty() 是否沒有Value使用它
- use_iterator use_begin() 返回use list的迭代器頭
- use_iterator use_end() 返回尾
- User *use_back() 返回use list的最後一個元素
int main() { Value* val1 = ConstantFP::get(theContext, APFloat(3.2)); if (val1->use_empty()) { std::cout << "no one use it\n"; } system("pause"); return 0; }
llvm:Type
前者顧名思義表示一個型別。可以通過 Value::getType()
獲取到這個 llvm::Type*
,它有一些 is*()
成員函式可以判斷是下面哪種型別:
enum TypeID { // PrimitiveTypes - make sure LastPrimitiveTyID stays up to date. VoidTyID = 0,///<0: type with no size HalfTyID,///<1: 16-bit floating point type FloatTyID,///<2: 32-bit floating point type DoubleTyID,///<3: 64-bit floating point type X86_FP80TyID,///<4: 80-bit floating point type (X87) FP128TyID,///<5: 128-bit floating point type (112-bit mantissa) PPC_FP128TyID,///<6: 128-bit floating point type (two 64-bits, PowerPC) LabelTyID,///<7: Labels MetadataTyID,///<8: Metadata X86_MMXTyID,///<9: MMX vectors (64 bits, X86 specific) TokenTyID,///< 10: Tokens // Derived types... see DerivedTypes.h file. // Make sure FirstDerivedTyID stays up to date! IntegerTyID,///< 11: Arbitrary bit width integers FunctionTyID,///< 12: Functions StructTyID,///< 13: Structures ArrayTyID,///< 14: Arrays PointerTyID,///< 15: Pointers VectorTyID///< 16: SIMD 'packed' format, or other vector type };
比如這樣:
int main() { Value* val1 = ConstantFP::get(theContext, APFloat(3.2)); Type* t = val1->getType(); if (t->isDoubleTy()) { std::cout << "val1 is typed as double(" << t->getTypeID() <<")\n"; } system("pause"); return 0; }
除此之外 llvm::Type
還有很多成員函式,詳細請參見 ofollow,noindex" target="_blank">http://llvm.org/doxygen/classllvm_1_1Type.html
多說一句,我們還可以對 llvm::Value 進行命名
- bool hasName() const
- std::string getName() const
- void setName(const std::string &Name)
llvm::Constant
llvm::Constant
表示一個各種常量的基類,基於它派生出了 ConstantInt 整型常量
, ConstantFP 浮點型常量
, ConstantArray 陣列常量
, ConstantStruct 結構體常量
:
int main() { // 構造一個32位,無符號的整型值,值為1024 APInt ci = APInt(32, 1024); ConstantInt* intVal = ConstantInt::get(theContext, ci); std::cout << "bit width:" << intVal->getBitWidth() << "\nvalue:" << intVal->getValue().toString(16, false); system("pause"); return 0; }