summaryrefslogtreecommitdiff
path: root/include/llvm/ConstantPool.h
blob: 7c8e255790c6cdb0bd4408c5b477b07f9d84ec6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//===-- llvm/ConstantPool.h - Define the constant pool class ------*- C++ -*-=//
//
// This file implements a constant pool that is split into different type 
// planes.  This allows searching for a typed object to go a little faster.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CONSTANTPOOL_H
#define LLVM_CONSTANTPOOL_H

#include <vector>
#include "llvm/ValueHolder.h"

class ConstPoolVal;
class SymTabValue;
class Type;

class ConstantPool {
public:
  typedef ValueHolder<ConstPoolVal, SymTabValue> PlaneType;
private:
  typedef vector<PlaneType*> PlanesType;
  PlanesType Planes;
  SymTabValue *Parent;

  inline void resize(unsigned size);
public:
  inline ConstantPool(SymTabValue *P) { Parent = P; }
  inline ~ConstantPool() { delete_all(); }

  inline       SymTabValue *getParent()       { return Parent; }
  inline const SymTabValue *getParent() const { return Parent; }

  void setParent(SymTabValue *STV);

  void dropAllReferences();  // Drop all references to other constants

  // Constant getPlane - Returns true if the type plane does not exist, 
  // otherwise updates the pointer to point to the correct plane.
  //
  bool getPlane(const Type *T, const PlaneType *&Plane) const;
  bool getPlane(const Type *T,       PlaneType *&Plane);

  // Normal getPlane - Resizes constant pool to contain type even if it doesn't
  // already have it.
  //
  PlaneType &getPlane(const Type *T);

  // insert - Add constant into the symbol table...
  void insert(ConstPoolVal *N);
  bool remove(ConstPoolVal *N);   // Returns true on failure 

  void delete_all();

  // find - Search to see if a constant of the specified value is already in
  // the constant table.
  //
  const ConstPoolVal *find(const ConstPoolVal *V) const;
        ConstPoolVal *find(const ConstPoolVal *V)      ;
  const ConstPoolVal *find(const Type *Ty) const;
        ConstPoolVal *find(const Type *Ty)      ;

  // Plane iteration support
  //
  typedef PlanesType::iterator       plane_iterator;
  typedef PlanesType::const_iterator plane_const_iterator;

  inline plane_iterator       begin()       { return Planes.begin(); }
  inline plane_const_iterator begin() const { return Planes.begin(); }
  inline plane_iterator       end()         { return Planes.end(); }
  inline plane_const_iterator end()   const { return Planes.end(); }
};

#endif