zoukankan      html  css  js  c++  java
  • [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
    ";
        }
        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() <<")
    ";
        }
        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 结构体常量:

    int main() {
        // 构造一个32位,无符号的整型值,值为1024
        APInt ci = APInt(32, 1024);
        ConstantInt* intVal = ConstantInt::get(theContext, ci);
        std::cout << "bit " << intVal->getBitWidth()
                  << "
    value:" << intVal->getValue().toString(16, false);
    
        system("pause");
        return 0;
    }
    
  • 相关阅读:
    笔记1
    笔记2
    笔记3
    两个多线程的交替打印
    三个多线程的交替打印
    内部类
    基本反射了解
    键盘监听事件KeyListener
    焦点监听事件FocusListener
    文本框JTextField,密码框JPasswordField
  • 原文地址:https://www.cnblogs.com/ysherlock/p/9688336.html
Copyright © 2011-2022 走看看