blob: 58e606f5e523a82df15bc3a79d07415cd3b5a22f (
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  | 
//===-- llvm/SymbolTable.h - Implement a type planned symtab ------*- C++ -*-=//
//
// This file implements a symbol table that has planed broken up by type.  
// Identical types may have overlapping symbol names as long as they are 
// distinct.
//
// Note that this implements a chained symbol table.  If a name being 'lookup'd
// isn't found in the current symbol table, then the parent symbol table is 
// searched.
//
// This chaining behavior does NOT affect iterators though: only the lookup 
// method
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_SYMBOL_TABLE_H
#define LLVM_SYMBOL_TABLE_H
#include <vector>
#include <map>
#include <string>
class Value;
class Type;
// TODO: Change this back to vector<map<const string, Value *> >
// Make the vector be a data member, and base it on UniqueID's
// That should be much more efficient!
//
class SymbolTable : public map<const Type *, map<const string, Value *> > {
  typedef map<const string, Value *> VarMap;
  typedef map<const Type *, VarMap> super;
  SymbolTable *ParentSymTab;
  friend class SymTabValue;
  inline void setParentSymTab(SymbolTable *P) { ParentSymTab = P; }
public:
  typedef VarMap::iterator type_iterator;
  typedef VarMap::const_iterator type_const_iterator;
  inline SymbolTable(SymbolTable *P = 0) { ParentSymTab = P; }
  ~SymbolTable();
  SymbolTable *getParentSymTab() { return ParentSymTab; }
  // lookup - Returns null on failure...
  Value *lookup(const Type *Ty, const string &name);
  // find - returns end(Ty->getIDNumber()) on failure...
  type_iterator type_find(const Type *Ty, const string &name);
  type_iterator type_find(const Value *D);
  // insert - Add named definition to the symbol table...
  void insert(Value *N);
  void remove(Value *N);
  Value *type_remove(const type_iterator &It);
  // getUniqueName - Given a base name, return a string that is either equal to
  // it (or derived from it) that does not already occur in the symbol table for
  // the specified type.
  //
  string getUniqueName(const Type *Ty, const string &BaseName);
  inline unsigned type_size(const Type *TypeID) const {
    return find(TypeID)->second.size();
  }
  // Note that type_begin / type_end only work if you know that an element of 
  // TypeID is already in the symbol table!!!
  //
  inline type_iterator type_begin(const Type *TypeID) { 
    return find(TypeID)->second.begin(); 
  }
  inline type_const_iterator type_begin(const Type *TypeID) const {
    return find(TypeID)->second.begin(); 
  }
  inline type_iterator type_end(const Type *TypeID) { 
    return find(TypeID)->second.end(); 
  }
  inline type_const_iterator type_end(const Type *TypeID) const { 
    return find(TypeID)->second.end(); 
  }
};
#endif
  |