Changeset 353d168 for src/SymTab
- Timestamp:
- Aug 19, 2015, 3:59:45 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, stuck-waitfor-destruct, with_gc
- Children:
- 830c21a
- Parents:
- 18997b9 (diff), 4aa0858 (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:
-
- 6 edited
-
IdTable.cc (modified) (4 diffs)
-
Indexer.cc (modified) (4 diffs)
-
Indexer.h (modified) (2 diffs)
-
Mangler.cc (modified) (5 diffs)
-
Mangler.h (modified) (4 diffs)
-
Validate.cc (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/IdTable.cc
r18997b9 r353d168 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:43201513 // Update Count : 3 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Aug 19 15:47:58 2015 13 // Update Count : 38 14 14 // 15 15 … … 52 52 if ( decl->get_linkage() == LinkageSpec::C ) { 53 53 manglename = name; 54 } else if ( LinkageSpec::isOverridable( decl->get_linkage() ) ) { 55 // mangle the name without including the appropriate suffix 56 // this will make it so that overridable routines are placed 57 // into the same "bucket" as their user defined versions. 58 manglename = Mangler::mangle( decl, false ); 54 59 } else { 55 60 manglename = Mangler::mangle( decl ); … … 64 69 std::stack< DeclEntry >& entry = it->second; 65 70 if ( ! entry.empty() && entry.top().second == scopeLevel ) { 71 // typesCompatible doesn't really do the right thing here. When checking compatibility of function types, 72 // we should ignore outermost pointer qualifiers, except _Atomic? 73 66 74 if ( decl->get_linkage() != LinkageSpec::C || ResolvExpr::typesCompatible( decl->get_type(), entry.top().first->get_type(), Indexer() ) ) { 67 75 FunctionDecl *newentry = dynamic_cast< FunctionDecl* >( decl ); 68 76 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 ); 77 if ( LinkageSpec::isOverridable( old->get_linkage() ) ) { 78 // new definition shadows the autogenerated one, even at the same scope 79 declTable[ manglename ].push( DeclEntry( decl, scopeLevel ) ); 80 } else if ( newentry && old && newentry->get_statements() && old->get_statements() ) { 81 throw SemanticError( "duplicate function definition for 1 ", decl ); 71 82 } else { 83 // two objects with the same mangled name defined in the same scope. 84 // both objects must be marked extern for this to be okay 72 85 ObjectDecl *newobj = dynamic_cast< ObjectDecl* >( decl ); 73 86 ObjectDecl *oldobj = dynamic_cast< ObjectDecl* >( entry.top().first ); 74 if ( newobj && oldobj && newobj->get_ init() && oldobj->get_init()) {87 if ( newobj && oldobj && newobj->get_storageClass() != DeclarationNode::Extern && oldobj->get_storageClass() != DeclarationNode::Extern ) { 75 88 throw SemanticError( "duplicate definition for ", decl ); 76 89 } // if 77 90 } // if 78 91 } else { 79 throw SemanticError( "duplicate definition for ", decl ); 92 // C definitions with the same name but incompatible types 93 throw SemanticError( "duplicate definition for 2 ", decl ); 80 94 } // if 81 95 } else { … … 84 98 } // if 85 99 // ensure the set of routines with C linkage cannot be overloaded 100 // this ensures that no two declarations with the same unmangled name both have C linkage 86 101 for ( InnerTableType::iterator i = declTable.begin(); i != declTable.end(); ++i ) { 87 102 if ( ! i->second.empty() && i->second.top().first->get_linkage() == LinkageSpec::C && declTable.size() > 1 ) { -
src/SymTab/Indexer.cc
r18997b9 r353d168 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:37:33 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Jun 5 08:05:17201513 // Update Count : 511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Aug 05 13:52:42 2015 13 // Update Count : 10 14 14 // 15 15 … … 26 26 27 27 namespace SymTab { 28 template< typename Container, typename VisitorType > 29 inline void acceptAllNewScope( Container &container, VisitorType &visitor ) { 30 visitor.enterScope(); 31 acceptAll( container, visitor ); 32 visitor.leaveScope(); 33 } 34 28 35 Indexer::Indexer( bool useDebug ) : doDebug( useDebug ) {} 29 36 … … 31 38 32 39 void Indexer::visit( ObjectDecl *objectDecl ) { 40 enterScope(); 33 41 maybeAccept( objectDecl->get_type(), *this ); 42 leaveScope(); 34 43 maybeAccept( objectDecl->get_init(), *this ); 35 44 maybeAccept( objectDecl->get_bitfieldWidth(), *this ); … … 149 158 leaveScope(); 150 159 } 160 161 162 void Indexer::visit( ApplicationExpr *applicationExpr ) { 163 acceptAllNewScope( applicationExpr->get_results(), *this ); 164 maybeAccept( applicationExpr->get_function(), *this ); 165 acceptAll( applicationExpr->get_args(), *this ); 166 } 167 168 void Indexer::visit( UntypedExpr *untypedExpr ) { 169 acceptAllNewScope( untypedExpr->get_results(), *this ); 170 acceptAll( untypedExpr->get_args(), *this ); 171 } 172 173 void Indexer::visit( NameExpr *nameExpr ) { 174 acceptAllNewScope( nameExpr->get_results(), *this ); 175 } 176 177 void Indexer::visit( AddressExpr *addressExpr ) { 178 acceptAllNewScope( addressExpr->get_results(), *this ); 179 maybeAccept( addressExpr->get_arg(), *this ); 180 } 181 182 void Indexer::visit( LabelAddressExpr *labAddressExpr ) { 183 acceptAllNewScope( labAddressExpr->get_results(), *this ); 184 maybeAccept( labAddressExpr->get_arg(), *this ); 185 } 186 187 void Indexer::visit( CastExpr *castExpr ) { 188 acceptAllNewScope( castExpr->get_results(), *this ); 189 maybeAccept( castExpr->get_arg(), *this ); 190 } 191 192 void Indexer::visit( UntypedMemberExpr *memberExpr ) { 193 acceptAllNewScope( memberExpr->get_results(), *this ); 194 maybeAccept( memberExpr->get_aggregate(), *this ); 195 } 196 197 void Indexer::visit( MemberExpr *memberExpr ) { 198 acceptAllNewScope( memberExpr->get_results(), *this ); 199 maybeAccept( memberExpr->get_aggregate(), *this ); 200 } 201 202 void Indexer::visit( VariableExpr *variableExpr ) { 203 acceptAllNewScope( variableExpr->get_results(), *this ); 204 } 205 206 void Indexer::visit( ConstantExpr *constantExpr ) { 207 acceptAllNewScope( constantExpr->get_results(), *this ); 208 maybeAccept( constantExpr->get_constant(), *this ); 209 } 210 211 void Indexer::visit( SizeofExpr *sizeofExpr ) { 212 acceptAllNewScope( sizeofExpr->get_results(), *this ); 213 if ( sizeofExpr->get_isType() ) { 214 maybeAccept( sizeofExpr->get_type(), *this ); 215 } else { 216 maybeAccept( sizeofExpr->get_expr(), *this ); 217 } 218 } 219 220 void Indexer::visit( AttrExpr *attrExpr ) { 221 acceptAllNewScope( attrExpr->get_results(), *this ); 222 if ( attrExpr->get_isType() ) { 223 maybeAccept( attrExpr->get_type(), *this ); 224 } else { 225 maybeAccept( attrExpr->get_expr(), *this ); 226 } 227 } 228 229 void Indexer::visit( LogicalExpr *logicalExpr ) { 230 acceptAllNewScope( logicalExpr->get_results(), *this ); 231 maybeAccept( logicalExpr->get_arg1(), *this ); 232 maybeAccept( logicalExpr->get_arg2(), *this ); 233 } 234 235 void Indexer::visit( ConditionalExpr *conditionalExpr ) { 236 acceptAllNewScope( conditionalExpr->get_results(), *this ); 237 maybeAccept( conditionalExpr->get_arg1(), *this ); 238 maybeAccept( conditionalExpr->get_arg2(), *this ); 239 maybeAccept( conditionalExpr->get_arg3(), *this ); 240 } 241 242 void Indexer::visit( CommaExpr *commaExpr ) { 243 acceptAllNewScope( commaExpr->get_results(), *this ); 244 maybeAccept( commaExpr->get_arg1(), *this ); 245 maybeAccept( commaExpr->get_arg2(), *this ); 246 } 247 248 void Indexer::visit( TupleExpr *tupleExpr ) { 249 acceptAllNewScope( tupleExpr->get_results(), *this ); 250 acceptAll( tupleExpr->get_exprs(), *this ); 251 } 252 253 void Indexer::visit( SolvedTupleExpr *tupleExpr ) { 254 acceptAllNewScope( tupleExpr->get_results(), *this ); 255 acceptAll( tupleExpr->get_exprs(), *this ); 256 } 257 258 void Indexer::visit( TypeExpr *typeExpr ) { 259 acceptAllNewScope( typeExpr->get_results(), *this ); 260 maybeAccept( typeExpr->get_type(), *this ); 261 } 262 263 void Indexer::visit( AsmExpr *asmExpr ) { 264 maybeAccept( asmExpr->get_inout(), *this ); 265 maybeAccept( asmExpr->get_constraint(), *this ); 266 maybeAccept( asmExpr->get_operand(), *this ); 267 } 268 269 void Indexer::visit( UntypedValofExpr *valofExpr ) { 270 acceptAllNewScope( valofExpr->get_results(), *this ); 271 maybeAccept( valofExpr->get_body(), *this ); 272 } 273 151 274 152 275 void Indexer::visit( ContextInstType *contextInst ) { -
src/SymTab/Indexer.h
r18997b9 r353d168 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:38:55 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Tue May 19 16:51:21201513 // Update Count : 311 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Aug 05 13:51:39 2015 13 // Update Count : 4 14 14 // 15 15 … … 43 43 44 44 virtual void visit( CompoundStmt *compoundStmt ); 45 46 virtual void visit( ApplicationExpr *applicationExpr ); 47 virtual void visit( UntypedExpr *untypedExpr ); 48 virtual void visit( NameExpr *nameExpr ); 49 virtual void visit( CastExpr *castExpr ); 50 virtual void visit( AddressExpr *addressExpr ); 51 virtual void visit( LabelAddressExpr *labAddressExpr ); 52 virtual void visit( UntypedMemberExpr *memberExpr ); 53 virtual void visit( MemberExpr *memberExpr ); 54 virtual void visit( VariableExpr *variableExpr ); 55 virtual void visit( ConstantExpr *constantExpr ); 56 virtual void visit( SizeofExpr *sizeofExpr ); 57 virtual void visit( AttrExpr *attrExpr ); 58 virtual void visit( LogicalExpr *logicalExpr ); 59 virtual void visit( ConditionalExpr *conditionalExpr ); 60 virtual void visit( CommaExpr *commaExpr ); 61 virtual void visit( TupleExpr *tupleExpr ); 62 virtual void visit( SolvedTupleExpr *tupleExpr ); 63 virtual void visit( TypeExpr *typeExpr ); 64 virtual void visit( AsmExpr *asmExpr ); 65 virtual void visit( UntypedValofExpr *valofExpr ); 45 66 46 67 virtual void visit( ContextInstType *contextInst ); -
src/SymTab/Mangler.cc
r18997b9 r353d168 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
r18997b9 r353d168 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
r18997b9 r353d168 10 10 // Created On : Sun May 17 21:50:04 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Jul 22 13:16:00201513 // Update Count : 19 412 // Last Modified On : Wed Aug 05 14:00:24 2015 13 // Update Count : 195 14 14 // 15 15 … … 162 162 class EliminateTypedef : public Mutator { 163 163 public: 164 EliminateTypedef() : scopeLevel( 0 ) {} 164 EliminateTypedef() : scopeLevel( 0 ) {} 165 /// Replaces typedefs by forward declarations 165 166 static void eliminateTypedef( std::list< Declaration * > &translationUnit ); 166 167 private: … … 542 543 std::list<Statement *> initList; 543 544 initList.push_back( initStmt ); 544 545 545 546 UntypedExpr *cond = new UntypedExpr( new NameExpr( "?<?" ) ); 546 547 cond->get_args().push_back( new VariableExpr( index ) ); … … 617 618 618 619 // need to remove the prototypes, since this may be nested in a routine 619 for ( int start = 0, end = assigns.size() / 2; start < end; start++) {620 for (int start = 0, end = assigns.size()/2; start < end; start++) { 620 621 delete assigns.front(); 621 622 assigns.pop_front(); … … 892 893 TypedefMap oldNames = typedefNames; 893 894 DeclarationWithType *ret = Mutator::mutate( objDecl ); 895 typedefNames = oldNames; 894 896 if ( FunctionType *funtype = dynamic_cast<FunctionType *>( ret->get_type() ) ) { 895 897 return new FunctionDecl( ret->get_name(), ret->get_storageClass(), ret->get_linkage(), funtype, 0, ret->get_isInline(), ret->get_isNoreturn() ); … … 897 899 throw SemanticError( "invalid inline or _Noreturn specification in declaration of ", objDecl ); 898 900 } // if 899 typedefNames = oldNames;900 901 return ret; 901 902 } … … 960 961 } 961 962 962 Declaration *EliminateTypedef::mutate( ContextDecl * contextDecl ) {963 Declaration *EliminateTypedef::mutate( ContextDecl * contextDecl ) { 963 964 Mutator::mutate( contextDecl ); 964 965 return handleAggregate( contextDecl );
Note:
See TracChangeset
for help on using the changeset viewer.