llvm.org GIT mirror llvm / release_30 include / llvm / CodeGen / MachineConstantPool.h
release_30

Tree @release_30 (Download .tar.gz)

MachineConstantPool.h @release_30

db00065
ea61c35
6fbcc26
 
7ed47a1
 
ea61c35
6fbcc26
ea61c35
0f8b53f
 
f1925cb
db00065
 
 
 
 
 
5567869
dc2fbdd
de551f9
db00065
d0fde30
 
 
db00065
92faff2
04a0f60
d6594ae
dc2fbdd
d6594ae
944fac7
d6594ae
 
 
 
db125cf
d6594ae
 
db125cf
81975f6
d6594ae
 
 
db125cf
d6594ae
cb45963
354c016
cb45963
 
083a1e0
354c016
cb45963
d6594ae
 
 
5405d58
d6594ae
62ca325
944fac7
d6594ae
 
944fac7
 
 
 
 
 
db00065
f1925cb
 
 
 
d41b30d
 
d6594ae
 
46510a7
d6594ae
 
 
1606e8e
acdddfe
1606e8e
d6594ae
46510a7
1606e8e
d6594ae
 
1606e8e
 
d6594ae
18f13c6
d6594ae
 
acdddfe
 
 
d6594ae
1606e8e
d6594ae
89abd77
1606e8e
de551f9
f379924
 
db125cf
cb45963
354c016
cb45963
 
 
 
 
 
 
 
 
 
354c016
69a9563
 
f1925cb
 
 
 
 
 
 
 
 
 
db00065
f1925cb
 
 
5567869
 
db00065
f1925cb
c2bbfc1
 
d6594ae
04a0f60
f451cb8
04a0f60
 
 
db00065
1606e8e
 
46510a7
d6594ae
04a0f60
1ed38fb
 
 
69a9563
b8973bd
 
db00065
 
6baa2b7
db00065
62ca325
db00065
62ca325
db00065
 
 
d0fde30
 
db00065
//===-- CodeGen/MachineConstantPool.h - Abstract Constant Pool --*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
/// @file
/// This file declares the MachineConstantPool class which is an abstract
/// constant pool to keep track of constants referenced by a function.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CODEGEN_MACHINECONSTANTPOOL_H
#define LLVM_CODEGEN_MACHINECONSTANTPOOL_H

#include "llvm/ADT/DenseSet.h"
#include <cassert>
#include <climits>
#include <vector>

namespace llvm {

class Constant;
class FoldingSetNodeID;
class TargetData;
class TargetMachine;
class Type;
class MachineConstantPool;
class raw_ostream;

/// Abstract base class for all machine specific constantpool value subclasses.
///
class MachineConstantPoolValue {
  Type *Ty;

public:
  explicit MachineConstantPoolValue(Type *ty) : Ty(ty) {}
  virtual ~MachineConstantPoolValue() {}

  /// getType - get type of this MachineConstantPoolValue.
  ///
  Type *getType() const { return Ty; }

  
  /// getRelocationInfo - This method classifies the entry according to
  /// whether or not it may generate a relocation entry.  This must be
  /// conservative, so if it might codegen to a relocatable entry, it should say
  /// so.  The return values are the same as Constant::getRelocationInfo().
  virtual unsigned getRelocationInfo() const = 0;
  
  virtual int getExistingMachineCPValue(MachineConstantPool *CP,
                                        unsigned Alignment) = 0;

  virtual void addSelectionDAGCSEId(FoldingSetNodeID &ID) = 0;

  /// print - Implement operator<<
  virtual void print(raw_ostream &O) const = 0;
};

inline raw_ostream &operator<<(raw_ostream &OS,
                               const MachineConstantPoolValue &V) {
  V.print(OS);
  return OS;
}
  

/// This class is a data container for one entry in a MachineConstantPool.
/// It contains a pointer to the value and an offset from the start of
/// the constant pool.
/// @brief An entry in a MachineConstantPool
class MachineConstantPoolEntry {
public:
  /// The constant itself.
  union {
    const Constant *ConstVal;
    MachineConstantPoolValue *MachineCPVal;
  } Val;

  /// The required alignment for this entry. The top bit is set when Val is
  /// a target specific MachineConstantPoolValue.
  unsigned Alignment;

  MachineConstantPoolEntry(const Constant *V, unsigned A)
    : Alignment(A) {
    Val.ConstVal = V;
  }
  MachineConstantPoolEntry(MachineConstantPoolValue *V, unsigned A)
    : Alignment(A) {
    Val.MachineCPVal = V; 
    Alignment |= 1U << (sizeof(unsigned)*CHAR_BIT-1);
  }

  /// isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry
  /// is indeed a target specific constantpool entry, not a wrapper over a
  /// Constant.
  bool isMachineConstantPoolEntry() const {
    return (int)Alignment < 0;
  }

  int getAlignment() const { 
    return Alignment & ~(1 << (sizeof(unsigned)*CHAR_BIT-1));
  }

  Type *getType() const;
  
  /// getRelocationInfo - This method classifies the entry according to
  /// whether or not it may generate a relocation entry.  This must be
  /// conservative, so if it might codegen to a relocatable entry, it should say
  /// so.  The return values are:
  /// 
  ///  0: This constant pool entry is guaranteed to never have a relocation
  ///     applied to it (because it holds a simple constant like '4').
  ///  1: This entry has relocations, but the entries are guaranteed to be
  ///     resolvable by the static linker, so the dynamic linker will never see
  ///     them.
  ///  2: This entry may have arbitrary relocations. 
  unsigned getRelocationInfo() const;
};
  
/// The MachineConstantPool class keeps track of constants referenced by a
/// function which must be spilled to memory.  This is used for constants which
/// are unable to be used directly as operands to instructions, which typically
/// include floating point and large integer constants.
///
/// Instructions reference the address of these constant pool constants through
/// the use of MO_ConstantPoolIndex values.  When emitting assembly or machine
/// code, these virtual address references are converted to refer to the
/// address of the function constant pool values.
/// @brief The machine constant pool.
class MachineConstantPool {
  const TargetData *TD;   ///< The machine's TargetData.
  unsigned PoolAlignment; ///< The alignment for the pool.
  std::vector<MachineConstantPoolEntry> Constants; ///< The pool of constants.
  /// MachineConstantPoolValues that use an existing MachineConstantPoolEntry.
  DenseSet<MachineConstantPoolValue*> MachineCPVsSharingEntries;
public:
  /// @brief The only constructor.
  explicit MachineConstantPool(const TargetData *td)
    : TD(td), PoolAlignment(1) {}
  ~MachineConstantPool();
    
  /// getConstantPoolAlignment - Return the alignment required by
  /// the whole constant pool, of which the first element must be aligned.
  unsigned getConstantPoolAlignment() const { return PoolAlignment; }
  
  /// getConstantPoolIndex - Create a new entry in the constant pool or return
  /// an existing one.  User must specify the minimum required alignment for
  /// the object.
  unsigned getConstantPoolIndex(const Constant *C, unsigned Alignment);
  unsigned getConstantPoolIndex(MachineConstantPoolValue *V,unsigned Alignment);
  
  /// isEmpty - Return true if this constant pool contains no constants.
  bool isEmpty() const { return Constants.empty(); }

  const std::vector<MachineConstantPoolEntry> &getConstants() const {
    return Constants;
  }

  /// print - Used by the MachineFunction printer to print information about
  /// constant pool objects.  Implemented in MachineFunction.cpp
  ///
  void print(raw_ostream &OS) const;

  /// dump - Call print(cerr) to be called from the debugger.
  void dump() const;
};

} // End llvm namespace

#endif