Changeset 7e23d0a for src/SymTab
- Timestamp:
- Nov 25, 2015, 2:53:26 PM (10 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:
- 32d281d, 704c9dd
- Parents:
- 02ec390 (diff), 5189888 (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:
-
- 4 edited
-
IdTable.cc (modified) (5 diffs)
-
Mangler.cc (modified) (5 diffs)
-
Mangler.h (modified) (4 diffs)
-
Validate.cc (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/IdTable.cc
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 17:04:02 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sun May 17 17:07:43 201513 // Update Count : 311 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Oct 07 12:21:13 2015 13 // Update Count : 73 14 14 // 15 15 … … 37 37 for ( InnerTableType::iterator inner = outer->second.begin(); inner != outer->second.end(); ++inner ) { 38 38 std::stack< DeclEntry >& entry = inner->second; 39 // xxx - should be while? 39 40 if ( ! entry.empty() && entry.top().second == scopeLevel ) { 40 41 entry.pop(); … … 52 53 if ( decl->get_linkage() == LinkageSpec::C ) { 53 54 manglename = name; 55 } else if ( LinkageSpec::isOverridable( decl->get_linkage() ) ) { 56 // mangle the name without including the appropriate suffix 57 // this will make it so that overridable routines are placed 58 // into the same "bucket" as their user defined versions. 59 manglename = Mangler::mangle( decl, false ); 54 60 } else { 55 61 manglename = Mangler::mangle( decl ); … … 60 66 61 67 if ( it == declTable.end() ) { 68 // first time this name mangling has been defined 62 69 declTable[ manglename ].push( DeclEntry( decl, scopeLevel ) ); 63 70 } else { 64 71 std::stack< DeclEntry >& entry = it->second; 65 72 if ( ! entry.empty() && entry.top().second == scopeLevel ) { 66 if ( decl->get_linkage() != LinkageSpec::C || ResolvExpr::typesCompatible( decl->get_type(), entry.top().first->get_type(), Indexer() ) ) { 73 // if we're giving the same name mangling to things of 74 // different types then there is something wrong 75 Declaration *old = entry.top().first; 76 assert( (dynamic_cast<ObjectDecl*>( decl ) && dynamic_cast<ObjectDecl*>( old ) ) 77 || (dynamic_cast<FunctionDecl*>( decl ) && dynamic_cast<FunctionDecl*>( old ) ) ); 78 79 if ( LinkageSpec::isOverridable( old->get_linkage() ) ) { 80 // new definition shadows the autogenerated one, even at the same scope 81 declTable[ manglename ].push( DeclEntry( decl, scopeLevel ) ); 82 } else if ( decl->get_linkage() != LinkageSpec::C || ResolvExpr::typesCompatible( decl->get_type(), entry.top().first->get_type(), Indexer() ) ) { 83 // typesCompatible doesn't really do the right thing here. When checking compatibility of function types, 84 // we should ignore outermost pointer qualifiers, except _Atomic? 67 85 FunctionDecl *newentry = dynamic_cast< FunctionDecl* >( decl ); 68 FunctionDecl *old = dynamic_cast< FunctionDecl* >( entry.top().first ); 69 if ( newentry && old && newentry->get_statements() && old->get_statements() ) { 70 throw SemanticError( "duplicate function definition for ", decl ); 86 FunctionDecl *oldentry = dynamic_cast< FunctionDecl* >( old ); 87 if ( newentry && oldentry ) { 88 if ( newentry->get_statements() && oldentry->get_statements() ) { 89 throw SemanticError( "duplicate function definition for 1 ", decl ); 90 } // if 71 91 } else { 92 // two objects with the same mangled name defined in the same scope. 93 // both objects must be marked extern or both must be intrinsic for this to be okay 94 // xxx - perhaps it's actually if either is intrinsic then this is okay? 95 // might also need to be same storage class? 72 96 ObjectDecl *newobj = dynamic_cast< ObjectDecl* >( decl ); 73 ObjectDecl *oldobj = dynamic_cast< ObjectDecl* >( entry.top().first);74 if ( newobj && oldobj && newobj->get_init() && oldobj->get_init()) {75 throw SemanticError( "duplicate definition for ", decl );97 ObjectDecl *oldobj = dynamic_cast< ObjectDecl* >( old ); 98 if (newobj->get_storageClass() != DeclarationNode::Extern && oldobj->get_storageClass() != DeclarationNode::Extern ) { 99 throw SemanticError( "duplicate definition for 3 ", decl ); 76 100 } // if 77 101 } // if … … 80 104 } // if 81 105 } else { 106 // new scope level - shadow existing definition 82 107 declTable[ manglename ].push( DeclEntry( decl, scopeLevel ) ); 83 108 } // if 84 109 } // if 85 // ensure the set of routines with C linkage cannot be overloaded110 // this ensures that no two declarations with the same unmangled name both have C linkage 86 111 for ( InnerTableType::iterator i = declTable.begin(); i != declTable.end(); ++i ) { 87 112 if ( ! i->second.empty() && i->second.top().first->get_linkage() == LinkageSpec::C && declTable.size() > 1 ) { -
src/SymTab/Mangler.cc
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:40:29 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Jun 8 15:12:12201513 // Update Count : 811 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Aug 19 15:52:24 2015 13 // Update Count : 19 14 14 // 15 15 … … 30 30 31 31 namespace SymTab { 32 Mangler::Mangler( ) : nextVarNum( 0 ), isTopLevel( true ) {32 Mangler::Mangler( bool mangleOverridable ) : nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ) { 33 33 } 34 34 … … 41 41 nextVarNum = rhs.nextVarNum; 42 42 isTopLevel = rhs.isTopLevel; 43 mangleOverridable = rhs.mangleOverridable; 43 44 } 44 45 … … 59 60 mangleName << "__"; 60 61 maybeAccept( declaration->get_type(), *this ); 62 if ( mangleOverridable && LinkageSpec::isOverridable( declaration->get_linkage() ) ) { 63 // want to be able to override autogenerated and intrinsic routines, 64 // so they need a different name mangling 65 if ( declaration->get_linkage() == LinkageSpec::AutoGen ) { 66 mangleName << "autogen__"; 67 } else if ( declaration->get_linkage() == LinkageSpec::Intrinsic ) { 68 mangleName << "intrinsic__"; 69 } else { 70 // if we add another kind of overridable function, this has to change 71 assert( false ); 72 } // if 73 } 61 74 isTopLevel = wasTopLevel; 62 75 } … … 214 227 varNums[ (*i )->get_name() ] = std::pair< int, int >( nextVarNum++, (int )(*i )->get_kind() ); 215 228 for ( std::list< DeclarationWithType* >::iterator assert = (*i )->get_assertions().begin(); assert != (*i )->get_assertions().end(); ++assert ) { 216 Mangler sub_mangler ;229 Mangler sub_mangler( mangleOverridable ); 217 230 sub_mangler.nextVarNum = nextVarNum; 218 231 sub_mangler.isTopLevel = false; -
src/SymTab/Mangler.h
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:44:03 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Jun 8 14:47:14201513 // Update Count : 511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Aug 19 15:48:46 2015 13 // Update Count : 14 14 14 // 15 15 … … 25 25 public: 26 26 template< typename SynTreeClass > 27 static std::string mangle( SynTreeClass *decl ); // interface to clients27 static std::string mangle( SynTreeClass *decl, bool mangleOverridable = true ); // interface to clients 28 28 29 29 /// using Visitor::visit; … … 50 50 int nextVarNum; 51 51 bool isTopLevel; 52 bool mangleOverridable; 52 53 53 Mangler( );54 Mangler( bool mangleOverridable ); 54 55 Mangler( const Mangler & ); 55 56 … … 61 62 62 63 template< typename SynTreeClass > 63 std::string Mangler::mangle( SynTreeClass *decl ) {64 Mangler mangler ;64 std::string Mangler::mangle( SynTreeClass *decl, bool mangleOverridable ) { 65 Mangler mangler( mangleOverridable ); 65 66 maybeAccept( decl, mangler ); 66 67 return mangler.get_mangleName(); -
src/SymTab/Validate.cc
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:50:04 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Tue Aug 11 16:59:35201513 // Update Count : 19611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Fri Nov 20 16:33:52 2015 13 // Update Count : 201 14 14 // 15 15 … … 54 54 #include "MakeLibCfa.h" 55 55 #include "TypeEquality.h" 56 #include "ResolvExpr/typeops.h" 56 57 57 58 #define debugPrint( x ) if ( doDebug ) { std::cout << x; } … … 125 126 }; 126 127 127 class A ddStructAssignment: public Visitor {128 class AutogenerateRoutines : public Visitor { 128 129 public: 129 130 /// Generates assignment operators for aggregate types as required 130 static void a ddStructAssignment( std::list< Declaration * > &translationUnit );131 static void autogenerateRoutines( std::list< Declaration * > &translationUnit ); 131 132 132 133 std::list< Declaration * > &get_declsToAdd() { return declsToAdd; } … … 151 152 virtual void visit( CatchStmt *catchStmt ); 152 153 153 A ddStructAssignment() : functionNesting( 0 ) {}154 AutogenerateRoutines() : functionNesting( 0 ) {} 154 155 private: 155 156 template< typename StmtClass > void visitStatement( StmtClass *stmt ); … … 195 196 acceptAll( translationUnit, pass1 ); 196 197 acceptAll( translationUnit, pass2 ); 197 // need to collect all of the assignment operators prior to 198 // this point and only generate assignment operators if one doesn't exist 199 AddStructAssignment::addStructAssignment( translationUnit ); 198 AutogenerateRoutines::autogenerateRoutines( translationUnit ); 200 199 acceptAll( translationUnit, pass3 ); 201 200 } … … 501 500 static const std::list< std::string > noLabels; 502 501 503 void A ddStructAssignment::addStructAssignment( std::list< Declaration * > &translationUnit ) {504 A ddStructAssignmentvisitor;502 void AutogenerateRoutines::autogenerateRoutines( std::list< Declaration * > &translationUnit ) { 503 AutogenerateRoutines visitor; 505 504 acceptAndAdd( translationUnit, visitor, false ); 506 505 } … … 704 703 } 705 704 706 void A ddStructAssignment::visit( EnumDecl *enumDecl ) {705 void AutogenerateRoutines::visit( EnumDecl *enumDecl ) { 707 706 if ( ! enumDecl->get_members().empty() ) { 708 707 EnumInstType *enumInst = new EnumInstType( Type::Qualifiers(), enumDecl->get_name() ); … … 713 712 } 714 713 715 void A ddStructAssignment::visit( StructDecl *structDecl ) {714 void AutogenerateRoutines::visit( StructDecl *structDecl ) { 716 715 if ( ! structDecl->get_members().empty() && structsDone.find( structDecl->get_name() ) == structsDone.end() ) { 717 716 StructInstType *structInst = new StructInstType( Type::Qualifiers(), structDecl->get_name() ); … … 722 721 } 723 722 724 void A ddStructAssignment::visit( UnionDecl *unionDecl ) {723 void AutogenerateRoutines::visit( UnionDecl *unionDecl ) { 725 724 if ( ! unionDecl->get_members().empty() ) { 726 725 UnionInstType *unionInst = new UnionInstType( Type::Qualifiers(), unionDecl->get_name() ); … … 730 729 } 731 730 732 void A ddStructAssignment::visit( TypeDecl *typeDecl ) {731 void AutogenerateRoutines::visit( TypeDecl *typeDecl ) { 733 732 CompoundStmt *stmts = 0; 734 733 TypeInstType *typeInst = new TypeInstType( Type::Qualifiers(), typeDecl->get_name(), false ); … … 758 757 } 759 758 760 void A ddStructAssignment::visit( FunctionType *) {759 void AutogenerateRoutines::visit( FunctionType *) { 761 760 // ensure that we don't add assignment ops for types defined as part of the function 762 761 } 763 762 764 void A ddStructAssignment::visit( PointerType *) {763 void AutogenerateRoutines::visit( PointerType *) { 765 764 // ensure that we don't add assignment ops for types defined as part of the pointer 766 765 } 767 766 768 void A ddStructAssignment::visit( ContextDecl *) {767 void AutogenerateRoutines::visit( ContextDecl *) { 769 768 // ensure that we don't add assignment ops for types defined as part of the context 770 769 } 771 770 772 771 template< typename StmtClass > 773 inline void A ddStructAssignment::visitStatement( StmtClass *stmt ) {772 inline void AutogenerateRoutines::visitStatement( StmtClass *stmt ) { 774 773 std::set< std::string > oldStructs = structsDone; 775 774 addVisit( stmt, *this ); … … 777 776 } 778 777 779 void A ddStructAssignment::visit( FunctionDecl *functionDecl ) {778 void AutogenerateRoutines::visit( FunctionDecl *functionDecl ) { 780 779 maybeAccept( functionDecl->get_functionType(), *this ); 781 780 acceptAll( functionDecl->get_oldDecls(), *this ); … … 785 784 } 786 785 787 void A ddStructAssignment::visit( CompoundStmt *compoundStmt ) {786 void AutogenerateRoutines::visit( CompoundStmt *compoundStmt ) { 788 787 visitStatement( compoundStmt ); 789 788 } 790 789 791 void A ddStructAssignment::visit( IfStmt *ifStmt ) {790 void AutogenerateRoutines::visit( IfStmt *ifStmt ) { 792 791 visitStatement( ifStmt ); 793 792 } 794 793 795 void A ddStructAssignment::visit( WhileStmt *whileStmt ) {794 void AutogenerateRoutines::visit( WhileStmt *whileStmt ) { 796 795 visitStatement( whileStmt ); 797 796 } 798 797 799 void A ddStructAssignment::visit( ForStmt *forStmt ) {798 void AutogenerateRoutines::visit( ForStmt *forStmt ) { 800 799 visitStatement( forStmt ); 801 800 } 802 801 803 void A ddStructAssignment::visit( SwitchStmt *switchStmt ) {802 void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) { 804 803 visitStatement( switchStmt ); 805 804 } 806 805 807 void A ddStructAssignment::visit( ChooseStmt *switchStmt ) {806 void AutogenerateRoutines::visit( ChooseStmt *switchStmt ) { 808 807 visitStatement( switchStmt ); 809 808 } 810 809 811 void A ddStructAssignment::visit( CaseStmt *caseStmt ) {810 void AutogenerateRoutines::visit( CaseStmt *caseStmt ) { 812 811 visitStatement( caseStmt ); 813 812 } 814 813 815 void A ddStructAssignment::visit( CatchStmt *cathStmt ) {814 void AutogenerateRoutines::visit( CatchStmt *cathStmt ) { 816 815 visitStatement( cathStmt ); 817 816 } … … 857 856 Type * t1 = tyDecl->get_base(); 858 857 Type * t2 = typedefNames[ tyDecl->get_name() ].first->get_base(); 859 if ( ! typeEquals( t1, t2, true) ) {858 if ( ! ResolvExpr::typesCompatible( t1, t2, Indexer() ) ) { 860 859 throw SemanticError( "cannot redefine typedef: " + tyDecl->get_name() ); 861 860 }
Note:
See TracChangeset
for help on using the changeset viewer.