1 //===-- SymbolTable.cpp - Implement the SymbolTable class -------------------=//
3 // This file implements the SymbolTable class for the VMCore library.
5 //===----------------------------------------------------------------------===//
7 #include "llvm/SymbolTable.h"
8 #include "llvm/InstrTypes.h"
10 #include "llvm/BasicBlock.h" // Required for assertions to work.
11 #include "llvm/Type.h"
14 SymbolTable::~SymbolTable() {
15 #ifndef NDEBUG // Only do this in -g mode...
17 for (iterator i = begin(); i != end(); i++) {
18 if (i->second.begin() != i->second.end()) {
19 for (type_iterator I = i->second.begin(); I != i->second.end(); I++)
20 cerr << "Value still in symbol table! Type = " << i->first->getName()
21 << " Name = " << I->first << endl;
25 assert(Good && "Values remain in symbol table!");
29 SymbolTable::type_iterator SymbolTable::type_find(const Value *D) {
30 assert(D->hasName() && "type_find(Value*) only works on named nodes!");
31 return type_find(D->getType(), D->getName());
35 // find - returns end(Ty->getIDNumber()) on failure...
36 SymbolTable::type_iterator SymbolTable::type_find(const Type *Ty,
38 iterator I = find(Ty);
39 if (I == end()) { // Not in collection yet... insert dummy entry
40 (*this)[Ty] = VarMap();
42 assert(I != end() && "How did insert fail?");
45 return I->second.find(Name);
49 // lookup - Returns null on failure...
50 Value *SymbolTable::lookup(const Type *Ty, const string &Name) {
51 iterator I = find(Ty);
52 if (I != end()) { // We have symbols in that plane...
53 type_iterator J = I->second.find(Name);
54 if (J != I->second.end()) // and the name is in our hash table...
58 return ParentSymTab ? ParentSymTab->lookup(Ty, Name) : 0;
61 void SymbolTable::remove(Value *N) {
62 assert(N->hasName() && "Value doesn't have name!");
63 assert(type_find(N) != type_end(N->getType()) &&
64 "Value not in symbol table!");
65 type_remove(type_find(N));
69 #define DEBUG_SYMBOL_TABLE 0
71 Value *SymbolTable::type_remove(const type_iterator &It) {
72 Value *Result = It->second;
73 #if DEBUG_SYMBOL_TABLE
74 cerr << this << " Removing Value: " << Result->getName() << endl;
77 find(Result->getType())->second.erase(It);
82 void SymbolTable::insert(Value *N) {
83 assert(N->hasName() && "Value must be named to go into symbol table!");
85 // TODO: The typeverifier should catch this when its implemented
86 if (lookup(N->getType(), N->getName())) {
87 cerr << "SymbolTable WARNING: Name already in symbol table: '"
88 << N->getName() << "'\n";
89 abort(); // TODO: REMOVE THIS
92 #if DEBUG_SYMBOL_TABLE
93 cerr << this << " Inserting definition: " << N->getName() << ": "
94 << N->getType()->getName() << endl;
97 iterator I = find(N->getType());
98 if (I == end()) { // Not in collection yet... insert dummy entry
99 (*this)[N->getType()] = VarMap();
100 I = find(N->getType());
101 assert(I != end() && "How did insert fail?");
104 I->second.insert(make_pair(N->getName(), N));