Changeset d67cdb7 for src/SymTab
- Timestamp:
- Sep 26, 2017, 11:27:38 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 5dc26f5
- Parents:
- 201aeb9
- Location:
- src/SymTab
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Autogen.cc
r201aeb9 rd67cdb7 16 16 #include "Autogen.h" 17 17 18 #include <cstddef> // for NULL19 18 #include <algorithm> // for count_if 20 19 #include <cassert> // for strict_dynamic_cast, assert, assertf … … 27 26 #include "AddVisit.h" // for addVisit 28 27 #include "CodeGen/OperatorTable.h" // for isCtorDtor, isCtorDtorAssign 28 #include "Common/PassVisitor.h" // for PassVisitor 29 29 #include "Common/ScopedMap.h" // for ScopedMap<>::const_iterator, Scope... 30 30 #include "Common/utility.h" // for cloneAll, operator+ 31 #include "GenPoly/DeclMutator.h" // for DeclMutator32 31 #include "GenPoly/ScopedSet.h" // for ScopedSet, ScopedSet<>::iterator 32 #include "InitTweak/GenInit.h" // for fixReturnStatements 33 #include "ResolvExpr/Resolver.h" // for resolveDecl 33 34 #include "SymTab/Mangler.h" // for Mangler 34 35 #include "SynTree/Attribute.h" // For Attribute … … 53 54 }; 54 55 55 class AutogenerateRoutines final : public Visitor { 56 template< typename Visitor > 57 friend void acceptAndAdd( std::list< Declaration * > &translationUnit, Visitor &visitor ); 58 template< typename Visitor > 59 friend void addVisitStatementList( std::list< Statement* > &stmts, Visitor &visitor ); 60 public: 61 std::list< Declaration * > &get_declsToAdd() { return declsToAdd; } 62 63 typedef Visitor Parent; 64 using Parent::visit; 65 56 struct AutogenerateRoutines final : public WithDeclsToAdd, public WithVisitorRef<AutogenerateRoutines>, public WithGuards, public WithShortCircuiting { 66 57 AutogenerateRoutines(); 67 58 68 virtual void visit( EnumDecl *enumDecl ); 69 virtual void visit( StructDecl *structDecl ); 70 virtual void visit( UnionDecl *structDecl ); 71 virtual void visit( TypeDecl *typeDecl ); 72 virtual void visit( TraitDecl *ctxDecl ); 73 virtual void visit( FunctionDecl *functionDecl ); 74 75 virtual void visit( FunctionType *ftype ); 76 virtual void visit( PointerType *ftype ); 77 78 virtual void visit( CompoundStmt *compoundStmt ); 79 virtual void visit( SwitchStmt *switchStmt ); 59 void previsit( EnumDecl * enumDecl ); 60 void previsit( StructDecl * structDecl ); 61 void previsit( UnionDecl * structDecl ); 62 void previsit( TypeDecl * typeDecl ); 63 void previsit( TraitDecl * traitDecl ); 64 void previsit( FunctionDecl * functionDecl ); 65 66 void previsit( FunctionType * ftype ); 67 void previsit( PointerType * ptype ); 68 69 void previsit( CompoundStmt * compoundStmt ); 80 70 81 71 private: 82 template< typename StmtClass > void visitStatement( StmtClass *stmt ); 83 84 std::list< Declaration * > declsToAdd, declsToAddAfter; 85 std::set< std::string > structsDone; 72 GenPoly::ScopedSet< std::string > structsDone; 86 73 unsigned int functionNesting = 0; // current level of nested functions 87 74 /// Note: the following maps could be ScopedSets, but it should be easier to work … … 93 80 94 81 /// generates routines for tuple types. 95 /// Doesn't really need to be a mutator, but it's easier to reuse DeclMutator than it is to use AddVisit 96 /// or anything we currently have that supports adding new declarations for visitors 97 class AutogenTupleRoutines : public GenPoly::DeclMutator { 98 public: 99 typedef GenPoly::DeclMutator Parent; 100 using Parent::mutate; 101 102 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ); 103 104 virtual Type * mutate( TupleType *tupleType ); 105 106 virtual CompoundStmt * mutate( CompoundStmt *compoundStmt ); 82 struct AutogenTupleRoutines : public WithDeclsToAdd, public WithVisitorRef<AutogenTupleRoutines>, public WithGuards, public WithShortCircuiting { 83 void previsit( FunctionDecl *functionDecl ); 84 85 void postvisit( TupleType *tupleType ); 86 87 void previsit( CompoundStmt *compoundStmt ); 107 88 108 89 private: … … 112 93 113 94 void autogenerateRoutines( std::list< Declaration * > &translationUnit ) { 114 AutogenerateRoutinesgenerator;115 acceptA ndAdd( translationUnit, generator );95 PassVisitor<AutogenerateRoutines> generator; 96 acceptAll( translationUnit, generator ); 116 97 117 98 // needs to be done separately because AutogenerateRoutines skips types that appear as function arguments, etc. 118 99 // AutogenTupleRoutines tupleGenerator; 119 // tupleGenerator.mutateDeclarationList( translationUnit);100 // acceptAll( translationUnit, tupleGenerator ); 120 101 } 121 102 122 103 bool isUnnamedBitfield( ObjectDecl * obj ) { 123 return obj != NULL && obj->get_name() == "" && obj->get_bitfieldWidth() != NULL;104 return obj != nullptr && obj->get_name() == "" && obj->get_bitfieldWidth() != nullptr; 124 105 } 125 106 … … 128 109 FunctionDecl * decl = functionDecl->clone(); 129 110 delete decl->get_statements(); 130 decl->set_statements( NULL);111 decl->set_statements( nullptr ); 131 112 declsToAdd.push_back( decl ); 132 113 decl->fixUniqueId(); … … 339 320 assert( ! func->get_functionType()->get_parameters().empty() ); 340 321 ObjectDecl * dstParam = dynamic_cast<ObjectDecl*>( func->get_functionType()->get_parameters().front() ); 341 ObjectDecl * srcParam = NULL;322 ObjectDecl * srcParam = nullptr; 342 323 if ( func->get_functionType()->get_parameters().size() == 2 ) { 343 324 srcParam = dynamic_cast<ObjectDecl*>( func->get_functionType()->get_parameters().back() ); … … 346 327 assert( dstParam ); 347 328 348 Expression *srcselect = srcParam ? new MemberExpr( field, new VariableExpr( srcParam ) ) : NULL;329 Expression *srcselect = srcParam ? new MemberExpr( field, new VariableExpr( srcParam ) ) : nullptr; 349 330 makeStructMemberOp( dstParam, srcselect, field, func, forward ); 350 331 } // if … … 385 366 } else { 386 367 // no matching parameter, initialize field with default ctor 387 makeStructMemberOp( dstParam, NULL, field, func );368 makeStructMemberOp( dstParam, nullptr, field, func ); 388 369 } 389 370 } … … 401 382 void makeStructFunctions( StructDecl *aggregateDecl, StructInstType *refType, unsigned int functionNesting, std::list< Declaration * > & declsToAdd, const std::vector< FuncData > & data ) { 402 383 // Builtins do not use autogeneration. 403 if ( aggregateDecl->get_linkage() == LinkageSpec::BuiltinCFA || 404 aggregateDecl->get_linkage() == LinkageSpec::BuiltinC ) { 384 if ( LinkageSpec::isBuiltin( aggregateDecl->get_linkage() ) ) { 405 385 return; 406 386 } 407 387 408 388 // Make function polymorphic in same parameters as generic struct, if applicable 409 const std::list< TypeDecl * > & typeParams = aggregateDecl->get_parameters(); // List of type variables to be placed on the generated functions389 const std::list< TypeDecl * > & typeParams = aggregateDecl->get_parameters(); // List of type variables to be placed on the generated functions 410 390 411 391 // generate each of the functions based on the supplied FuncData objects … … 572 552 // the order here determines the order that these functions are generated. 573 553 // assignment should come last since it uses copy constructor in return. 574 data.push_back( FuncData( "?{}", genDefaultType, constructable ) ); 575 data.push_back( FuncData( "?{}", genCopyType, copyable ) ); 576 data.push_back( FuncData( "^?{}", genDefaultType, destructable ) ); 577 data.push_back( FuncData( "?=?", genAssignType, assignable ) ); 578 } 579 580 void AutogenerateRoutines::visit( EnumDecl *enumDecl ) { 554 data.emplace_back( "?{}", genDefaultType, constructable ); 555 data.emplace_back( "?{}", genCopyType, copyable ); 556 data.emplace_back( "^?{}", genDefaultType, destructable ); 557 data.emplace_back( "?=?", genAssignType, assignable ); 558 } 559 560 void AutogenerateRoutines::previsit( EnumDecl * enumDecl ) { 561 visit_children = false; 581 562 if ( ! enumDecl->get_members().empty() ) { 582 563 EnumInstType *enumInst = new EnumInstType( Type::Qualifiers(), enumDecl->get_name() ); … … 586 567 } 587 568 588 void AutogenerateRoutines::visit( StructDecl *structDecl ) { 589 if ( structDecl->has_body() && structsDone.find( structDecl->get_name() ) == structsDone.end() ) { 590 StructInstType structInst( Type::Qualifiers(), structDecl->get_name() ); 591 for ( TypeDecl * typeDecl : structDecl->get_parameters() ) { 569 void AutogenerateRoutines::previsit( StructDecl * structDecl ) { 570 visit_children = false; 571 if ( structDecl->has_body() && structsDone.find( structDecl->name ) == structsDone.end() ) { 572 StructInstType structInst( Type::Qualifiers(), structDecl->name ); 573 for ( TypeDecl * typeDecl : structDecl->parameters ) { 592 574 // need to visit assertions so that they are added to the appropriate maps 593 acceptAll( typeDecl-> get_assertions(), *this);594 structInst. get_parameters().push_back( new TypeExpr( new TypeInstType( Type::Qualifiers(), typeDecl->get_name(), typeDecl ) ) );575 acceptAll( typeDecl->assertions, *visitor ); 576 structInst.parameters.push_back( new TypeExpr( new TypeInstType( Type::Qualifiers(), typeDecl->name, typeDecl ) ) ); 595 577 } 596 578 structInst.set_baseStruct( structDecl ); 597 579 makeStructFunctions( structDecl, &structInst, functionNesting, declsToAddAfter, data ); 598 structsDone.insert( structDecl-> get_name());580 structsDone.insert( structDecl->name ); 599 581 } // if 600 582 } 601 583 602 void AutogenerateRoutines::visit( UnionDecl *unionDecl ) { 584 void AutogenerateRoutines::previsit( UnionDecl * unionDecl ) { 585 visit_children = false; 603 586 if ( ! unionDecl->get_members().empty() ) { 604 587 UnionInstType unionInst( Type::Qualifiers(), unionDecl->get_name() ); … … 619 602 620 603 // generate ctor/dtors/assign for typedecls, e.g., otype T = int *; 621 void AutogenerateRoutines::visit( TypeDecl *typeDecl ) { 604 void AutogenerateRoutines::previsit( TypeDecl * typeDecl ) { 605 visit_children = false; 622 606 if ( ! typeDecl->base ) return; 623 607 … … 664 648 } 665 649 666 void addDecls( std::list< Declaration * > &declsToAdd, std::list< Statement * > &statements, std::list< Statement * >::iterator i ) { 667 for ( std::list< Declaration * >::iterator decl = declsToAdd.begin(); decl != declsToAdd.end(); ++decl ) { 668 statements.insert( i, new DeclStmt( noLabels, *decl ) ); 669 } // for 670 declsToAdd.clear(); 671 } 672 673 void AutogenerateRoutines::visit( FunctionType *) { 650 void AutogenerateRoutines::previsit( FunctionType *) { 674 651 // ensure that we don't add assignment ops for types defined as part of the function 675 } 676 677 void AutogenerateRoutines::visit( PointerType *) { 652 visit_children = false; 653 } 654 655 void AutogenerateRoutines::previsit( PointerType *) { 678 656 // ensure that we don't add assignment ops for types defined as part of the pointer 679 } 680 681 void AutogenerateRoutines::visit( TraitDecl *) { 657 visit_children = false; 658 } 659 660 void AutogenerateRoutines::previsit( TraitDecl * ) { 682 661 // ensure that we don't add assignment ops for types defined as part of the trait 683 } 684 685 template< typename StmtClass > 686 inline void AutogenerateRoutines::visitStatement( StmtClass *stmt ) { 687 std::set< std::string > oldStructs = structsDone; 688 addVisit( stmt, *this ); 689 structsDone = oldStructs; 690 } 691 692 void AutogenerateRoutines::visit( FunctionDecl *functionDecl ) { 662 visit_children = false; 663 } 664 665 void AutogenerateRoutines::previsit( FunctionDecl * functionDecl ) { 666 visit_children = false; 693 667 // record the existence of this function as appropriate 694 668 insert( functionDecl, constructable, InitTweak::isDefaultConstructor ); … … 697 671 insert( functionDecl, destructable, InitTweak::isDestructor ); 698 672 699 maybeAccept( functionDecl-> get_functionType(), *this);673 maybeAccept( functionDecl->type, *visitor ); 700 674 functionNesting += 1; 701 maybeAccept( functionDecl-> get_statements(), *this);675 maybeAccept( functionDecl->statements, *visitor ); 702 676 functionNesting -= 1; 703 677 } 704 678 705 void AutogenerateRoutines::visit( CompoundStmt *compoundStmt ) { 706 constructable.beginScope(); 707 assignable.beginScope(); 708 copyable.beginScope(); 709 destructable.beginScope(); 710 visitStatement( compoundStmt ); 711 constructable.endScope(); 712 assignable.endScope(); 713 copyable.endScope(); 714 destructable.endScope(); 715 } 716 717 void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) { 718 visitStatement( switchStmt ); 679 void AutogenerateRoutines::previsit( CompoundStmt * ) { 680 GuardScope( constructable ); 681 GuardScope( assignable ); 682 GuardScope( copyable ); 683 GuardScope( destructable ); 684 GuardScope( structsDone ); 719 685 } 720 686 … … 734 700 } 735 701 736 Type * AutogenTupleRoutines::mutate( TupleType * tupleType ) { 737 tupleType = strict_dynamic_cast< TupleType * >( Parent::mutate( tupleType ) ); 702 void AutogenTupleRoutines::postvisit( TupleType * tupleType ) { 738 703 std::string mangleName = SymTab::Mangler::mangleType( tupleType ); 739 if ( seenTuples.find( mangleName ) != seenTuples.end() ) return tupleType;704 if ( seenTuples.find( mangleName ) != seenTuples.end() ) return; 740 705 seenTuples.insert( mangleName ); 741 706 … … 785 750 makeTupleFunctionBody( dtorDecl ); 786 751 787 addDeclaration( ctorDecl ); 788 addDeclaration( copyCtorDecl ); 789 addDeclaration( dtorDecl ); 790 addDeclaration( assignDecl ); // assignment should come last since it uses copy constructor in return 791 792 return tupleType; 793 } 794 795 DeclarationWithType * AutogenTupleRoutines::mutate( FunctionDecl *functionDecl ) { 796 functionDecl->set_functionType( maybeMutate( functionDecl->get_functionType(), *this ) ); 752 declsToAddBefore.push_back( ctorDecl ); 753 declsToAddBefore.push_back( copyCtorDecl ); 754 declsToAddBefore.push_back( dtorDecl ); 755 declsToAddBefore.push_back( assignDecl ); // assignment should come last since it uses copy constructor in return 756 } 757 758 void AutogenTupleRoutines::previsit( FunctionDecl *functionDecl ) { 759 visit_children = false; 760 maybeAccept( functionDecl->type, *visitor ); 797 761 functionNesting += 1; 798 functionDecl->set_statements( maybeMutate( functionDecl->get_statements(), *this ));762 maybeAccept( functionDecl->statements, *visitor ); 799 763 functionNesting -= 1; 800 return functionDecl; 801 } 802 803 CompoundStmt * AutogenTupleRoutines::mutate( CompoundStmt *compoundStmt ) { 804 seenTuples.beginScope(); 805 compoundStmt = strict_dynamic_cast< CompoundStmt * >( Parent::mutate( compoundStmt ) ); 806 seenTuples.endScope(); 807 return compoundStmt; 764 } 765 766 void AutogenTupleRoutines::previsit( CompoundStmt * ) { 767 GuardScope( seenTuples ); 808 768 } 809 769 } // SymTab -
src/SymTab/FixFunction.cc
r201aeb9 rd67cdb7 27 27 28 28 DeclarationWithType * FixFunction::mutate(FunctionDecl *functionDecl) { 29 // can't delete function type because it may contain assertions, so transfer ownership to new object 29 30 ObjectDecl *pointer = new ObjectDecl( functionDecl->get_name(), functionDecl->get_storageClasses(), functionDecl->get_linkage(), 0, new PointerType( Type::Qualifiers(), functionDecl->get_type() ), 0, functionDecl->get_attributes() ); 30 31 functionDecl->get_attributes().clear(); 31 // can't delete function type because it may contain assertions, but can't transfer ownership without a clone since set_type checks for nullptr 32 functionDecl->set_type( functionDecl->get_type()->clone() ); 32 functionDecl->type = nullptr; 33 33 delete functionDecl; 34 34 return pointer; -
src/SymTab/Indexer.cc
r201aeb9 rd67cdb7 40 40 41 41 namespace SymTab { 42 struct NewScope {43 NewScope( SymTab::Indexer & indexer ) : indexer( indexer ) { indexer.enterScope(); }44 ~NewScope() { indexer.leaveScope(); }45 SymTab::Indexer & indexer;46 };47 48 template< typename TreeType, typename VisitorType >49 inline void acceptNewScope( TreeType *tree, VisitorType &visitor ) {50 visitor.enterScope();51 maybeAccept( tree, visitor );52 visitor.leaveScope();53 }54 55 42 typedef std::unordered_map< std::string, DeclarationWithType* > MangleTable; 56 43 typedef std::unordered_map< std::string, MangleTable > IdTable; … … 198 185 } 199 186 200 Indexer::Indexer( bool _doDebug ) : tables( 0 ), scope( 0 ), doDebug( _doDebug) {}201 202 Indexer::Indexer( const Indexer &that ) : tables( newRef( that.tables ) ), scope( that.scope ), doDebug( that.doDebug) {}203 204 Indexer::Indexer( Indexer &&that ) : tables( that.tables ), scope( that.scope ), doDebug( that.doDebug) {187 Indexer::Indexer() : tables( 0 ), scope( 0 ) {} 188 189 Indexer::Indexer( const Indexer &that ) : doDebug( that.doDebug ), tables( newRef( that.tables ) ), scope( that.scope ) {} 190 191 Indexer::Indexer( Indexer &&that ) : doDebug( that.doDebug ), tables( that.tables ), scope( that.scope ) { 205 192 that.tables = 0; 206 193 } -
src/SymTab/Indexer.h
r201aeb9 rd67cdb7 26 26 class Indexer { 27 27 public: 28 explicit Indexer( bool useDebug = false);28 explicit Indexer(); 29 29 30 30 Indexer( const Indexer &that ); … … 76 76 void addTrait( TraitDecl *decl ); 77 77 78 bool doDebug = false; ///< Display debugging trace? 78 79 private: 79 80 struct Impl; … … 81 82 Impl *tables; ///< Copy-on-write instance of table data structure 82 83 unsigned long scope; ///< Scope index of this pointer 83 bool doDebug; ///< Display debugging trace?84 84 85 85 /// Takes a new ref to a table (returns null if null) -
src/SymTab/Mangler.cc
r201aeb9 rd67cdb7 31 31 32 32 namespace SymTab { 33 std::string Mangler::mangleType( Type * ty ) {33 std::string Mangler::mangleType( Type * ty ) { 34 34 Mangler mangler( false, true ); 35 35 maybeAccept( ty, mangler ); … … 48 48 } 49 49 50 void Mangler::mangleDecl( DeclarationWithType * declaration ) {50 void Mangler::mangleDecl( DeclarationWithType * declaration ) { 51 51 bool wasTopLevel = isTopLevel; 52 52 if ( isTopLevel ) { … … 79 79 } 80 80 81 void Mangler::visit( ObjectDecl * declaration ) {81 void Mangler::visit( ObjectDecl * declaration ) { 82 82 mangleDecl( declaration ); 83 83 } 84 84 85 void Mangler::visit( FunctionDecl * declaration ) {85 void Mangler::visit( FunctionDecl * declaration ) { 86 86 mangleDecl( declaration ); 87 87 } 88 88 89 void Mangler::visit( VoidType * voidType ) {89 void Mangler::visit( VoidType * voidType ) { 90 90 printQualifiers( voidType ); 91 91 mangleName << "v"; 92 92 } 93 93 94 void Mangler::visit( BasicType * basicType ) {94 void Mangler::visit( BasicType * basicType ) { 95 95 static const char *btLetter[] = { 96 96 "b", // Bool … … 123 123 } 124 124 125 void Mangler::visit( PointerType * pointerType ) {125 void Mangler::visit( PointerType * pointerType ) { 126 126 printQualifiers( pointerType ); 127 127 mangleName << "P"; … … 129 129 } 130 130 131 void Mangler::visit( ArrayType * arrayType ) {131 void Mangler::visit( ArrayType * arrayType ) { 132 132 // TODO: encode dimension 133 133 printQualifiers( arrayType ); … … 136 136 } 137 137 138 void Mangler::visit( ReferenceType * refType ) {138 void Mangler::visit( ReferenceType * refType ) { 139 139 printQualifiers( refType ); 140 140 mangleName << "R"; … … 151 151 } 152 152 153 void Mangler::visit( FunctionType * functionType ) {153 void Mangler::visit( FunctionType * functionType ) { 154 154 printQualifiers( functionType ); 155 155 mangleName << "F"; … … 162 162 } 163 163 164 void Mangler::mangleRef( ReferenceToType * refType, std::string prefix ) {164 void Mangler::mangleRef( ReferenceToType * refType, std::string prefix ) { 165 165 printQualifiers( refType ); 166 166 … … 168 168 } 169 169 170 void Mangler::mangleGenericRef( ReferenceToType * refType, std::string prefix ) {170 void Mangler::mangleGenericRef( ReferenceToType * refType, std::string prefix ) { 171 171 printQualifiers( refType ); 172 172 … … 191 191 } 192 192 193 void Mangler::visit( StructInstType * aggregateUseType ) {193 void Mangler::visit( StructInstType * aggregateUseType ) { 194 194 if ( typeMode ) mangleGenericRef( aggregateUseType, "s" ); 195 195 else mangleRef( aggregateUseType, "s" ); 196 196 } 197 197 198 void Mangler::visit( UnionInstType * aggregateUseType ) {198 void Mangler::visit( UnionInstType * aggregateUseType ) { 199 199 if ( typeMode ) mangleGenericRef( aggregateUseType, "u" ); 200 200 else mangleRef( aggregateUseType, "u" ); 201 201 } 202 202 203 void Mangler::visit( EnumInstType * aggregateUseType ) {203 void Mangler::visit( EnumInstType * aggregateUseType ) { 204 204 mangleRef( aggregateUseType, "e" ); 205 205 } 206 206 207 void Mangler::visit( TypeInstType * typeInst ) {207 void Mangler::visit( TypeInstType * typeInst ) { 208 208 VarMapType::iterator varNum = varNums.find( typeInst->get_name() ); 209 209 if ( varNum == varNums.end() ) { … … 233 233 } 234 234 235 void Mangler::visit( TupleType * tupleType ) {235 void Mangler::visit( TupleType * tupleType ) { 236 236 printQualifiers( tupleType ); 237 237 mangleName << "T"; 238 acceptAll( tupleType-> get_types(), *this );238 acceptAll( tupleType->types, *this ); 239 239 mangleName << "_"; 240 240 } 241 241 242 void Mangler::visit( VarArgsType * varArgsType ) {242 void Mangler::visit( VarArgsType * varArgsType ) { 243 243 printQualifiers( varArgsType ); 244 244 mangleName << "VARGS"; 245 245 } 246 246 247 void Mangler::visit( __attribute__((unused)) ZeroType *zeroType) {247 void Mangler::visit( ZeroType * ) { 248 248 mangleName << "Z"; 249 249 } 250 250 251 void Mangler::visit( __attribute__((unused)) OneType *oneType) {251 void Mangler::visit( OneType * ) { 252 252 mangleName << "O"; 253 253 } 254 254 255 void Mangler::visit( TypeDecl * decl ) {255 void Mangler::visit( TypeDecl * decl ) { 256 256 static const char *typePrefix[] = { "BT", "BD", "BF" }; 257 mangleName << typePrefix[ decl->get_kind() ] << ( decl-> get_name().length() + 1 ) << decl->get_name();257 mangleName << typePrefix[ decl->get_kind() ] << ( decl->name.length() + 1 ) << decl->name; 258 258 } 259 259 … … 264 264 } 265 265 266 void Mangler::printQualifiers( Type * type ) {266 void Mangler::printQualifiers( Type * type ) { 267 267 // skip if not including qualifiers 268 268 if ( typeMode ) return; … … 272 272 int tcount = 0, dcount = 0, fcount = 0, vcount = 0; 273 273 mangleName << "A"; 274 for ( Type::ForallList::iterator i = type-> get_forall().begin(); i != type->get_forall().end(); ++i ) {274 for ( Type::ForallList::iterator i = type->forall.begin(); i != type->forall.end(); ++i ) { 275 275 switch ( (*i)->get_kind() ) { 276 276 case TypeDecl::Any: … … 289 289 assert( false ); 290 290 } // switch 291 varNums[ (*i )->get_name() ] = std::pair< int, int >( nextVarNum++, (int )(*i)->get_kind() );292 for ( std::list< DeclarationWithType* >::iterator assert = (*i )->get_assertions().begin(); assert != (*i )->get_assertions().end(); ++assert ) {291 varNums[ (*i)->name ] = std::pair< int, int >( nextVarNum++, (int)(*i)->get_kind() ); 292 for ( std::list< DeclarationWithType* >::iterator assert = (*i)->assertions.begin(); assert != (*i)->assertions.end(); ++assert ) { 293 293 Mangler sub_mangler( mangleOverridable, typeMode ); 294 294 sub_mangler.nextVarNum = nextVarNum; … … 309 309 mangleName << "V"; 310 310 } // if 311 if ( type->get_mutex() ) { 312 mangleName << "M"; 313 } // if 311 314 // Removed due to restrict not affecting function compatibility in GCC 312 315 // if ( type->get_isRestrict() ) { … … 314 317 // } // if 315 318 if ( type->get_lvalue() ) { 319 // mangle based on whether the type is lvalue, so that the resolver can differentiate lvalues and rvalues 316 320 mangleName << "L"; 317 } // if321 } 318 322 if ( type->get_atomic() ) { 319 323 mangleName << "A"; -
src/SymTab/Validate.cc
r201aeb9 rd67cdb7 56 56 #include "FixFunction.h" // for FixFunction 57 57 #include "Indexer.h" // for Indexer 58 #include "InitTweak/GenInit.h" // for fixReturnStatements 58 59 #include "InitTweak/InitTweak.h" // for isCtorDtorAssign 59 60 #include "Parser/LinkageSpec.h" // for C … … 150 151 /// Replaces array and function types in forall lists by appropriate pointer type and assigns each Object and Function declaration a unique ID. 151 152 struct ForallPointerDecay final { 152 void previsit( ObjectDecl * object );153 void previsit( FunctionDecl * func );153 void previsit( ObjectDecl * object ); 154 void previsit( FunctionDecl * func ); 154 155 }; 155 156 … … 579 580 580 581 /// Fix up assertions - flattens assertion lists, removing all trait instances 581 void forallFixer( Type * func) {582 for ( TypeDecl * type : f unc->get_forall()) {582 void forallFixer( std::list< TypeDecl * > & forall, BaseSyntaxNode * node ) { 583 for ( TypeDecl * type : forall ) { 583 584 std::list< DeclarationWithType * > asserts; 584 585 asserts.splice( asserts.end(), type->assertions ); … … 599 600 assertion = assertion->acceptMutator( fixer ); 600 601 if ( fixer.get_isVoid() ) { 601 throw SemanticError( "invalid type void in assertion of function ", func);602 throw SemanticError( "invalid type void in assertion of function ", node ); 602 603 } // if 603 604 } // for … … 607 608 608 609 void ForallPointerDecay::previsit( ObjectDecl *object ) { 609 forallFixer( object-> get_type());610 if ( PointerType *pointer = dynamic_cast< PointerType * >( object-> get_type()) ) {611 forallFixer( pointer-> get_base());610 forallFixer( object->type->forall, object ); 611 if ( PointerType *pointer = dynamic_cast< PointerType * >( object->type ) ) { 612 forallFixer( pointer->base->forall, object ); 612 613 } // if 613 614 object->fixUniqueId(); … … 615 616 616 617 void ForallPointerDecay::previsit( FunctionDecl *func ) { 617 forallFixer( func-> get_type());618 forallFixer( func->type->forall, func ); 618 619 func->fixUniqueId(); 619 620 }
Note:
See TracChangeset
for help on using the changeset viewer.