前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[llvm] LLVM 核心类简明示例 : llvm::Value && llvm::Type && llvm::Constant

[llvm] LLVM 核心类简明示例 : llvm::Value && llvm::Type && llvm::Constant

作者头像
racaljk
发布2018-10-10 10:43:23
4.1K0
发布2018-10-10 10:43:23
举报
文章被收录于专栏:racaljkracaljk

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的最后一个元素
代码语言:javascript
复制
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*()成员函数可以判断是下面哪种类型:

代码语言:javascript
复制
  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
  };

比如这样:

代码语言:javascript
复制
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 进行命名

  1. bool hasName() const
  2. std::string getName() const
  3. void setName(const std::string &Name)

llvm::Constant

llvm::Constant表示一个各种常量的基类,基于它派生出了ConstantInt 整型常量,ConstantFP 浮点型常量,ConstantArray 数组常量,ConstantStruct 结构体常量:

代码语言:javascript
复制
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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • LLVM 核心类简明示例 : llvm::Value && llvm::Type && llvm::Constant
    • llvm::Value
      • llvm:Type
        • llvm::Constant
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档