//===-- llvm/SymbolTable.h - Implement a type planed 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 #include #include class Value; class Type; // TODO: Change this back to vector > // Make the vector be a data member, and base it on UniqueID's // That should be much more efficient! // class SymbolTable : public map > { typedef map VarMap; typedef map 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