[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還有很多成員函數,詳細請參見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 width:" << intVal->getBitWidth()
              << "\nvalue:" << intVal->getValue().toString(16, false);

    system("pause");
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM