//===-- llvm/Constants.h - Constant class subclass definitions --*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // /// @file /// This file contains the declarations for the subclasses of Constant, /// which represent the different flavors of constant values that live in LLVM. /// Note that Constants are immutable (once created they never change) and are /// fully shared by structural equivalence. This means that two structurally /// equivalent constants will always have the same address. Constants are /// created on demand as needed and never deleted: thus clients don't have to /// worry about the lifetime of the objects. // //===----------------------------------------------------------------------===// #ifndef LLVM_IR_CONSTANTS_H #define LLVM_IR_CONSTANTS_H #include "llvm/ADT/APFloat.h" #include "llvm/ADT/APInt.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/IR/Constant.h" #include "llvm/IR/ConstantRange.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/GEPNoWrapFlags.h" #include "llvm/IR/Intrinsics.h" #include "llvm/IR/OperandTraits.h" #include "llvm/IR/User.h" #include "llvm/IR/Value.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/ErrorHandling.h" #include <cassert> #include <cstddef> #include <cstdint> #include <optional> namespace llvm { template <class ConstantClass> struct ConstantAggrKeyType; /// Base class for constants with no operands. /// /// These constants have no operands; they represent their data directly. /// Since they can be in use by unrelated modules (and are never based on /// GlobalValues), it never makes sense to RAUW them. class ConstantData : public Constant { … }; //===----------------------------------------------------------------------===// /// This is the shared class of boolean and integer constants. This class /// represents both boolean and integral constants. /// Class for constant integers. class ConstantInt final : public ConstantData { … }; //===----------------------------------------------------------------------===// /// ConstantFP - Floating Point Values [float, double] /// class ConstantFP final : public ConstantData { … }; //===----------------------------------------------------------------------===// /// All zero aggregate value /// class ConstantAggregateZero final : public ConstantData { … }; /// Base class for aggregate constants (with operands). /// /// These constants are aggregates of other constants, which are stored as /// operands. /// /// Subclasses are \a ConstantStruct, \a ConstantArray, and \a /// ConstantVector. /// /// \note Some subclasses of \a ConstantData are semantically aggregates -- /// such as \a ConstantDataArray -- but are not subclasses of this because they /// use operands. class ConstantAggregate : public Constant { … }; template <> struct OperandTraits<ConstantAggregate> : public VariadicOperandTraits<ConstantAggregate> { … }; DEFINE_TRANSPARENT_OPERAND_ACCESSORS(…) //===----------------------------------------------------------------------===// /// ConstantArray - Constant Array Declarations /// class ConstantArray final : public ConstantAggregate { … }; //===----------------------------------------------------------------------===// // Constant Struct Declarations // class ConstantStruct final : public ConstantAggregate { … }; //===----------------------------------------------------------------------===// /// Constant Vector Declarations /// class ConstantVector final : public ConstantAggregate { … }; //===----------------------------------------------------------------------===// /// A constant pointer value that points to null /// class ConstantPointerNull final : public ConstantData { … }; //===----------------------------------------------------------------------===// /// ConstantDataSequential - A vector or array constant whose element type is a /// simple 1/2/4/8-byte integer or half/bfloat/float/double, and whose elements /// are just simple data values (i.e. ConstantInt/ConstantFP). This Constant /// node has no operands because it stores all of the elements of the constant /// as densely packed data, instead of as Value*'s. /// /// This is the common base class of ConstantDataArray and ConstantDataVector. /// class ConstantDataSequential : public ConstantData { … }; //===----------------------------------------------------------------------===// /// An array constant whose element type is a simple 1/2/4/8-byte integer or /// float/double, and whose elements are just simple data values /// (i.e. ConstantInt/ConstantFP). This Constant node has no operands because it /// stores all of the elements of the constant as densely packed data, instead /// of as Value*'s. class ConstantDataArray final : public ConstantDataSequential { … }; //===----------------------------------------------------------------------===// /// A vector constant whose element type is a simple 1/2/4/8-byte integer or /// float/double, and whose elements are just simple data values /// (i.e. ConstantInt/ConstantFP). This Constant node has no operands because it /// stores all of the elements of the constant as densely packed data, instead /// of as Value*'s. class ConstantDataVector final : public ConstantDataSequential { … }; //===----------------------------------------------------------------------===// /// A constant token which is empty /// class ConstantTokenNone final : public ConstantData { … }; /// A constant target extension type default initializer class ConstantTargetNone final : public ConstantData { … }; /// The address of a basic block. /// class BlockAddress final : public Constant { … }; template <> struct OperandTraits<BlockAddress> : public FixedNumOperandTraits<BlockAddress, 2> { … }; DEFINE_TRANSPARENT_OPERAND_ACCESSORS(…) /// Wrapper for a function that represents a value that /// functionally represents the original function. This can be a function, /// global alias to a function, or an ifunc. class DSOLocalEquivalent final : public Constant { … }; template <> struct OperandTraits<DSOLocalEquivalent> : public FixedNumOperandTraits<DSOLocalEquivalent, 1> { … }; DEFINE_TRANSPARENT_OPERAND_ACCESSORS(…) /// Wrapper for a value that won't be replaced with a CFI jump table /// pointer in LowerTypeTestsModule. class NoCFIValue final : public Constant { … }; template <> struct OperandTraits<NoCFIValue> : public FixedNumOperandTraits<NoCFIValue, 1> { … }; DEFINE_TRANSPARENT_OPERAND_ACCESSORS(…) /// A signed pointer, in the ptrauth sense. class ConstantPtrAuth final : public Constant { … }; template <> struct OperandTraits<ConstantPtrAuth> : public FixedNumOperandTraits<ConstantPtrAuth, 4> { … }; DEFINE_TRANSPARENT_OPERAND_ACCESSORS(…) //===----------------------------------------------------------------------===// /// A constant value that is initialized with an expression using /// other constant values. /// /// This class uses the standard Instruction opcodes to define the various /// constant expressions. The Opcode field for the ConstantExpr class is /// maintained in the Value::SubclassData field. class ConstantExpr : public Constant { … }; template <> struct OperandTraits<ConstantExpr> : public VariadicOperandTraits<ConstantExpr, 1> { … }; DEFINE_TRANSPARENT_OPERAND_ACCESSORS(…) //===----------------------------------------------------------------------===// /// 'undef' values are things that do not have specified contents. /// These are used for a variety of purposes, including global variable /// initializers and operands to instructions. 'undef' values can occur with /// any first-class type. /// /// Undef values aren't exactly constants; if they have multiple uses, they /// can appear to have different bit patterns at each use. See /// LangRef.html#undefvalues for details. /// class UndefValue : public ConstantData { … }; //===----------------------------------------------------------------------===// /// In order to facilitate speculative execution, many instructions do not /// invoke immediate undefined behavior when provided with illegal operands, /// and return a poison value instead. /// /// see LangRef.html#poisonvalues for details. /// class PoisonValue final : public UndefValue { … }; } // end namespace llvm #endif // LLVM_IR_CONSTANTS_H