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
还有很多成员函数,详细请参见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;
}