mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===-- 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 <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);
 | |
| 
 | |
|   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
 |