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;
    }
    
  • 相关阅读:
    第八章 多线程编程
    Linked List Cycle II
    Swap Nodes in Pairs
    Container With Most Water
    Best Time to Buy and Sell Stock III
    Best Time to Buy and Sell Stock II
    Linked List Cycle
    4Sum
    3Sum
    Integer to Roman
  • 原文地址:https://www.cnblogs.com/ysherlock/p/9688336.html
Copyright © 2011-2022 走看看