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 <cassert> 22#include <climits> 23#include <vector> 24 25namespace llvm { 26 27class Constant; 28class FoldingSetNodeID; 29class DataLayout; 30class TargetMachine; 31class Type; 32class MachineConstantPool; 33class raw_ostream; 34 35/// Abstract base class for all machine specific constantpool value subclasses. 36/// 37class MachineConstantPoolValue { 38 virtual void anchor(); 39 Type *Ty; 40 41public: 42 explicit MachineConstantPoolValue(Type *ty) : Ty(ty) {} 43 virtual ~MachineConstantPoolValue() {} 44 45 /// getType - get type of this MachineConstantPoolValue. 46 /// 47 Type *getType() const { return Ty; } 48 49 virtual int getExistingMachineCPValue(MachineConstantPool *CP, 50 unsigned Alignment) = 0; 51 52 virtual void addSelectionDAGCSEId(FoldingSetNodeID &ID) = 0; 53 54 /// print - Implement operator<< 55 virtual void print(raw_ostream &O) const = 0; 56}; 57 58inline raw_ostream &operator<<(raw_ostream &OS, 59 const MachineConstantPoolValue &V) { 60 V.print(OS); 61 return OS; 62} 63 64/// This class is a data container for one entry in a MachineConstantPool. 65/// It contains a pointer to the value and an offset from the start of 66/// the constant pool. 67/// @brief An entry in a MachineConstantPool 68class MachineConstantPoolEntry { 69public: 70 /// The constant itself. 71 union { 72 const Constant *ConstVal; 73 MachineConstantPoolValue *MachineCPVal; 74 } Val; 75 76 /// The required alignment for this entry. The top bit is set when Val is 77 /// a target specific MachineConstantPoolValue. 78 unsigned Alignment; 79 80 MachineConstantPoolEntry(const Constant *V, unsigned A) 81 : Alignment(A) { 82 Val.ConstVal = V; 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. 121class 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 130public: 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 /// 157 void print(raw_ostream &OS) const; 158 159 /// dump - Call print(cerr) to be called from the debugger. 160 void dump() const; 161}; 162 163} // End llvm namespace 164 165#endif 166