Home | History | Annotate | Download | only in CodeGen
      1 //===- CodeGen/MachineConstantPool.h - Abstract Constant Pool ---*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 /// @file
     11 /// This file declares the MachineConstantPool class which is an abstract
     12 /// constant pool to keep track of constants referenced by a function.
     13 //
     14 //===----------------------------------------------------------------------===//
     15 
     16 #ifndef LLVM_CODEGEN_MACHINECONSTANTPOOL_H
     17 #define LLVM_CODEGEN_MACHINECONSTANTPOOL_H
     18 
     19 #include "llvm/ADT/DenseSet.h"
     20 #include "llvm/MC/SectionKind.h"
     21 #include <climits>
     22 #include <vector>
     23 
     24 namespace llvm {
     25 
     26 class Constant;
     27 class DataLayout;
     28 class FoldingSetNodeID;
     29 class MachineConstantPool;
     30 class raw_ostream;
     31 class Type;
     32 
     33 /// Abstract base class for all machine specific constantpool value subclasses.
     34 ///
     35 class MachineConstantPoolValue {
     36   virtual void anchor();
     37 
     38   Type *Ty;
     39 
     40 public:
     41   explicit MachineConstantPoolValue(Type *ty) : Ty(ty) {}
     42   virtual ~MachineConstantPoolValue() = default;
     43 
     44   /// getType - get type of this MachineConstantPoolValue.
     45   ///
     46   Type *getType() const { return Ty; }
     47 
     48   virtual int getExistingMachineCPValue(MachineConstantPool *CP,
     49                                         unsigned Alignment) = 0;
     50 
     51   virtual void addSelectionDAGCSEId(FoldingSetNodeID &ID) = 0;
     52 
     53   /// print - Implement operator<<
     54   virtual void print(raw_ostream &O) const = 0;
     55 };
     56 
     57 inline raw_ostream &operator<<(raw_ostream &OS,
     58                                const MachineConstantPoolValue &V) {
     59   V.print(OS);
     60   return OS;
     61 }
     62 
     63 /// This class is a data container for one entry in a MachineConstantPool.
     64 /// It contains a pointer to the value and an offset from the start of
     65 /// the constant pool.
     66 /// @brief An entry in a MachineConstantPool
     67 class MachineConstantPoolEntry {
     68 public:
     69   /// The constant itself.
     70   union {
     71     const Constant *ConstVal;
     72     MachineConstantPoolValue *MachineCPVal;
     73   } Val;
     74 
     75   /// The required alignment for this entry. The top bit is set when Val is
     76   /// a target specific MachineConstantPoolValue.
     77   unsigned Alignment;
     78 
     79   MachineConstantPoolEntry(const Constant *V, unsigned A)
     80     : Alignment(A) {
     81     Val.ConstVal = V;
     82   }
     83 
     84   MachineConstantPoolEntry(MachineConstantPoolValue *V, unsigned A)
     85       : Alignment(A) {
     86     Val.MachineCPVal = V;
     87     Alignment |= 1U << (sizeof(unsigned) * CHAR_BIT - 1);
     88   }
     89 
     90   /// isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry
     91   /// is indeed a target specific constantpool entry, not a wrapper over a
     92   /// Constant.
     93   bool isMachineConstantPoolEntry() const {
     94     return (int)Alignment < 0;
     95   }
     96 
     97   int getAlignment() const {
     98     return Alignment & ~(1 << (sizeof(unsigned) * CHAR_BIT - 1));
     99   }
    100 
    101   Type *getType() const;
    102 
    103   /// This method classifies the entry according to whether or not it may
    104   /// generate a relocation entry.  This must be conservative, so if it might
    105   /// codegen to a relocatable entry, it should say so.
    106   bool needsRelocation() const;
    107 
    108   SectionKind getSectionKind(const DataLayout *DL) const;
    109 };
    110 
    111 /// The MachineConstantPool class keeps track of constants referenced by a
    112 /// function which must be spilled to memory.  This is used for constants which
    113 /// are unable to be used directly as operands to instructions, which typically
    114 /// include floating point and large integer constants.
    115 ///
    116 /// Instructions reference the address of these constant pool constants through
    117 /// the use of MO_ConstantPoolIndex values.  When emitting assembly or machine
    118 /// code, these virtual address references are converted to refer to the
    119 /// address of the function constant pool values.
    120 /// @brief The machine constant pool.
    121 class MachineConstantPool {
    122   unsigned PoolAlignment;       ///< The alignment for the pool.
    123   std::vector<MachineConstantPoolEntry> Constants; ///< The pool of constants.
    124   /// MachineConstantPoolValues that use an existing MachineConstantPoolEntry.
    125   DenseSet<MachineConstantPoolValue*> MachineCPVsSharingEntries;
    126   const DataLayout &DL;
    127 
    128   const DataLayout &getDataLayout() const { return DL; }
    129 
    130 public:
    131   /// @brief The only constructor.
    132   explicit MachineConstantPool(const DataLayout &DL)
    133       : PoolAlignment(1), DL(DL) {}
    134   ~MachineConstantPool();
    135 
    136   /// getConstantPoolAlignment - Return the alignment required by
    137   /// the whole constant pool, of which the first element must be aligned.
    138   unsigned getConstantPoolAlignment() const { return PoolAlignment; }
    139 
    140   /// getConstantPoolIndex - Create a new entry in the constant pool or return
    141   /// an existing one.  User must specify the minimum required alignment for
    142   /// the object.
    143   unsigned getConstantPoolIndex(const Constant *C, unsigned Alignment);
    144   unsigned getConstantPoolIndex(MachineConstantPoolValue *V,
    145                                 unsigned Alignment);
    146 
    147   /// isEmpty - Return true if this constant pool contains no constants.
    148   bool isEmpty() const { return Constants.empty(); }
    149 
    150   const std::vector<MachineConstantPoolEntry> &getConstants() const {
    151     return Constants;
    152   }
    153 
    154   /// print - Used by the MachineFunction printer to print information about
    155   /// constant pool objects.  Implemented in MachineFunction.cpp
    156   void print(raw_ostream &OS) const;
    157 
    158   /// dump - Call print(cerr) to be called from the debugger.
    159   void dump() const;
    160 };
    161 
    162 } // end namespace llvm
    163 
    164 #endif // LLVM_CODEGEN_MACHINECONSTANTPOOL_H
    165