Changeset cff1143 for src/SymTab
- Timestamp:
- Jul 9, 2015, 3:07:32 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
- Children:
- 0215a76f, dfee306
- Parents:
- 82dd287 (diff), e5609dd (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- src/SymTab
- Files:
-
- 2 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Validate.cc
r82dd287 rcff1143 10 10 // Created On : Sun May 17 21:50:04 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Jul 07 10:41:23201513 // Update Count : 1 3612 // Last Modified On : Wed Jul 08 12:49:36 2015 13 // Update Count : 166 14 14 // 15 15 … … 48 48 #include "Indexer.h" 49 49 #include "FixFunction.h" 50 #include "ImplementationType.h"50 // #include "ImplementationType.h" 51 51 #include "utility.h" 52 52 #include "UniqueName.h" 53 53 #include "AddVisit.h" 54 54 #include "MakeLibCfa.h" 55 55 #include "TypeEquality.h" 56 56 57 57 #define debugPrint( x ) if ( doDebug ) { std::cout << x; } … … 162 162 class EliminateTypedef : public Mutator { 163 163 public: 164 EliminateTypedef() : scopeLevel( 0 ) {} 164 165 static void eliminateTypedef( std::list< Declaration * > &translationUnit ); 165 166 private: … … 171 172 virtual Type *mutate( TypeInstType *aggregateUseType ); 172 173 virtual Expression *mutate( CastExpr *castExpr ); 173 174 std::map< std::string, TypedefDecl * > typedefNames; 174 175 typedef std::map< std::string, std::pair< TypedefDecl *, int > > TypedefMap; 176 TypedefMap typedefNames; 177 int scopeLevel; 175 178 }; 176 179 … … 589 592 assignDecl2->fixUniqueId(); 590 593 594 // these should be built in the same way that the prelude 595 // functions are, so build a list containing the prototypes 596 // and allow MakeLibCfa to autogenerate the bodies. 591 597 std::list< Declaration * > assigns; 592 598 assigns.push_back( assignDecl ); … … 595 601 LibCfa::makeLibCfa( assigns ); 596 602 597 // need to remove the prototypes, since th ese can appearnested in a routine603 // need to remove the prototypes, since this may be nested in a routine 598 604 for (int start = 0, end = assigns.size()/2; start < end; start++) { 599 605 delete assigns.front(); … … 602 608 603 609 declsToAdd.insert( declsToAdd.begin(), assigns.begin(), assigns.end() ); 604 605 // return assignDecl;606 610 } 607 611 … … 802 806 803 807 Type *EliminateTypedef::mutate( TypeInstType *typeInst ) { 804 std::map< std::string, TypedefDecl * >::const_iterator def = typedefNames.find( typeInst->get_name() ); 808 // instances of typedef types will come here. If it is an instance 809 // of a typdef type, link the instance to its actual type. 810 TypedefMap::const_iterator def = typedefNames.find( typeInst->get_name() ); 805 811 if ( def != typedefNames.end() ) { 806 Type *ret = def->second ->get_base()->clone();812 Type *ret = def->second.first->get_base()->clone(); 807 813 ret->get_qualifiers() += typeInst->get_qualifiers(); 808 814 delete typeInst; … … 814 820 Declaration *EliminateTypedef::mutate( TypedefDecl *tyDecl ) { 815 821 Declaration *ret = Mutator::mutate( tyDecl ); 816 typedefNames[ tyDecl->get_name() ] = tyDecl; 822 if ( typedefNames.count( tyDecl->get_name() ) == 1 && typedefNames[ tyDecl->get_name() ].second == scopeLevel ) { 823 // typedef to the same name from the same scope 824 // must be from the same type 825 826 Type * t1 = tyDecl->get_base(); 827 Type * t2 = typedefNames[ tyDecl->get_name() ].first->get_base(); 828 if ( ! typeEquals( t1, t2, true ) ) { 829 throw SemanticError( "cannot redefine typedef: " + tyDecl->get_name() ); 830 } 831 } else { 832 typedefNames[ tyDecl->get_name() ] = std::make_pair( tyDecl, scopeLevel ); 833 } // if 834 817 835 // When a typedef is a forward declaration: 818 836 // typedef struct screen SCREEN; … … 833 851 834 852 TypeDecl *EliminateTypedef::mutate( TypeDecl *typeDecl ) { 835 std::map< std::string, TypedefDecl * >::iterator i = typedefNames.find( typeDecl->get_name() );853 TypedefMap::iterator i = typedefNames.find( typeDecl->get_name() ); 836 854 if ( i != typedefNames.end() ) { 837 855 typedefNames.erase( i ) ; … … 841 859 842 860 DeclarationWithType *EliminateTypedef::mutate( FunctionDecl *funcDecl ) { 843 std::map< std::string, TypedefDecl * >oldNames = typedefNames;861 TypedefMap oldNames = typedefNames; 844 862 DeclarationWithType *ret = Mutator::mutate( funcDecl ); 845 863 typedefNames = oldNames; … … 848 866 849 867 ObjectDecl *EliminateTypedef::mutate( ObjectDecl *objDecl ) { 850 std::map< std::string, TypedefDecl * >oldNames = typedefNames;868 TypedefMap oldNames = typedefNames; 851 869 ObjectDecl *ret = Mutator::mutate( objDecl ); 852 870 typedefNames = oldNames; … … 855 873 856 874 Expression *EliminateTypedef::mutate( CastExpr *castExpr ) { 857 std::map< std::string, TypedefDecl * >oldNames = typedefNames;875 TypedefMap oldNames = typedefNames; 858 876 Expression *ret = Mutator::mutate( castExpr ); 859 877 typedefNames = oldNames; … … 862 880 863 881 CompoundStmt *EliminateTypedef::mutate( CompoundStmt *compoundStmt ) { 864 std::map< std::string, TypedefDecl * > oldNames = typedefNames; 882 TypedefMap oldNames = typedefNames; 883 scopeLevel += 1; 865 884 CompoundStmt *ret = Mutator::mutate( compoundStmt ); 885 scopeLevel -= 1; 866 886 std::list< Statement * >::iterator i = compoundStmt->get_kids().begin(); 867 887 while ( i != compoundStmt->get_kids().end() ) { -
src/SymTab/module.mk
r82dd287 rcff1143 10 10 ## Author : Richard C. Bilson 11 11 ## Created On : Mon Jun 1 17:49:17 2015 12 ## Last Modified By : Peter A. Buhr13 ## Last Modified On : Mon Jun 1 17:53:50201514 ## Update Count : 112 ## Last Modified By : Rob Schluntz 13 ## Last Modified On : Tue Jul 07 16:22:23 2015 14 ## Update Count : 2 15 15 ############################################################################### 16 16 … … 20 20 SymTab/Validate.cc \ 21 21 SymTab/FixFunction.cc \ 22 SymTab/ImplementationType.cc 23 22 SymTab/ImplementationType.cc \ 23 SymTab/TypeEquality.cc
Note: See TracChangeset
for help on using the changeset viewer.