Changes in src/SymTab/Validate.cc [61a4875:45161b4d]
- File:
-
- 1 edited
-
src/SymTab/Validate.cc (modified) (24 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Validate.cc
r61a4875 r45161b4d 10 10 // Created On : Sun May 17 21:50:04 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jan 27 22:03:12201613 // Update Count : 2 2512 // Last Modified On : Wed Apr 13 16:39:30 2016 13 // Update Count : 251 14 14 // 15 15 … … 40 40 #include <list> 41 41 #include <iterator> 42 #include "Common/utility.h" 43 #include "Common/UniqueName.h" 42 44 #include "Validate.h" 43 45 #include "SynTree/Visitor.h" 44 46 #include "SynTree/Mutator.h" 45 47 #include "SynTree/Type.h" 48 #include "SynTree/Expression.h" 46 49 #include "SynTree/Statement.h" 47 50 #include "SynTree/TypeSubstitution.h" … … 49 52 #include "FixFunction.h" 50 53 // #include "ImplementationType.h" 51 #include "Common/utility.h" 52 #include "Common/UniqueName.h" 54 #include "GenPoly/DeclMutator.h" 53 55 #include "AddVisit.h" 54 56 #include "MakeLibCfa.h" … … 70 72 71 73 virtual void visit( CompoundStmt *compoundStmt ); 72 virtual void visit( IfStmt *ifStmt );73 virtual void visit( WhileStmt *whileStmt );74 virtual void visit( ForStmt *forStmt );75 74 virtual void visit( SwitchStmt *switchStmt ); 76 75 virtual void visit( ChooseStmt *chooseStmt ); 77 virtual void visit( CaseStmt *caseStmt ); 78 virtual void visit( CatchStmt *catchStmt ); 76 // virtual void visit( CaseStmt *caseStmt ); 79 77 private: 80 78 HoistStruct(); … … 101 99 virtual void visit( StructInstType *structInst ); 102 100 virtual void visit( UnionInstType *unionInst ); 103 virtual void visit( ContextInstType *contextInst );101 virtual void visit( TraitInstType *contextInst ); 104 102 virtual void visit( StructDecl *structDecl ); 105 103 virtual void visit( UnionDecl *unionDecl ); … … 137 135 virtual void visit( UnionDecl *structDecl ); 138 136 virtual void visit( TypeDecl *typeDecl ); 139 virtual void visit( ContextDecl *ctxDecl );137 virtual void visit( TraitDecl *ctxDecl ); 140 138 virtual void visit( FunctionDecl *functionDecl ); 141 139 … … 144 142 145 143 virtual void visit( CompoundStmt *compoundStmt ); 146 virtual void visit( IfStmt *ifStmt );147 virtual void visit( WhileStmt *whileStmt );148 virtual void visit( ForStmt *forStmt );149 144 virtual void visit( SwitchStmt *switchStmt ); 150 145 virtual void visit( ChooseStmt *chooseStmt ); 151 virtual void visit( CaseStmt *caseStmt ); 152 virtual void visit( CatchStmt *catchStmt ); 146 // virtual void visit( CaseStmt *caseStmt ); 153 147 154 148 AutogenerateRoutines() : functionNesting( 0 ) {} … … 166 160 /// and return something if the return type is non-void. 167 161 static void checkFunctionReturns( std::list< Declaration * > & translationUnit ); 168 169 162 private: 170 163 virtual void visit( FunctionDecl * functionDecl ); … … 192 185 virtual Declaration *mutate( UnionDecl * unionDecl ); 193 186 virtual Declaration *mutate( EnumDecl * enumDecl ); 194 virtual Declaration *mutate( ContextDecl * contextDecl );187 virtual Declaration *mutate( TraitDecl * contextDecl ); 195 188 196 189 template<typename AggDecl> 197 190 AggDecl *handleAggregate( AggDecl * aggDecl ); 198 191 192 template<typename AggDecl> 193 void addImplicitTypedef( AggDecl * aggDecl ); 194 199 195 typedef std::map< std::string, std::pair< TypedefDecl *, int > > TypedefMap; 200 196 TypedefMap typedefNames; … … 202 198 }; 203 199 200 class CompoundLiteral : public GenPoly::DeclMutator { 201 DeclarationNode::StorageClass storageclass = DeclarationNode::NoStorageClass; 202 203 virtual DeclarationWithType * mutate( ObjectDecl *objectDecl ); 204 virtual Expression *mutate( CompoundLiteralExpr *compLitExpr ); 205 }; 206 204 207 void validate( std::list< Declaration * > &translationUnit, bool doDebug ) { 205 208 Pass1 pass1; 206 209 Pass2 pass2( doDebug, 0 ); 207 210 Pass3 pass3( 0 ); 211 CompoundLiteral compoundliteral; 212 208 213 EliminateTypedef::eliminateTypedef( translationUnit ); 209 214 HoistStruct::hoistStruct( translationUnit ); … … 211 216 acceptAll( translationUnit, pass2 ); 212 217 ReturnChecker::checkFunctionReturns( translationUnit ); 218 mutateAll( translationUnit, compoundliteral ); 213 219 AutogenerateRoutines::autogenerateRoutines( translationUnit ); 214 220 acceptAll( translationUnit, pass3 ); … … 292 298 } 293 299 294 void HoistStruct::visit( IfStmt *ifStmt ) {295 addVisit( ifStmt, *this );296 }297 298 void HoistStruct::visit( WhileStmt *whileStmt ) {299 addVisit( whileStmt, *this );300 }301 302 void HoistStruct::visit( ForStmt *forStmt ) {303 addVisit( forStmt, *this );304 }305 306 300 void HoistStruct::visit( SwitchStmt *switchStmt ) { 307 301 addVisit( switchStmt, *this ); … … 312 306 } 313 307 314 void HoistStruct::visit( CaseStmt *caseStmt ) { 315 addVisit( caseStmt, *this ); 316 } 317 318 void HoistStruct::visit( CatchStmt *cathStmt ) { 319 addVisit( cathStmt, *this ); 320 } 308 // void HoistStruct::visit( CaseStmt *caseStmt ) { 309 // addVisit( caseStmt, *this ); 310 // } 321 311 322 312 void Pass1::visit( EnumDecl *enumDecl ) { … … 404 394 } 405 395 406 void Pass2::visit( ContextInstType *contextInst ) {396 void Pass2::visit( TraitInstType *contextInst ) { 407 397 Parent::visit( contextInst ); 408 ContextDecl *ctx = indexer->lookupContext( contextInst->get_name() );398 TraitDecl *ctx = indexer->lookupTrait( contextInst->get_name() ); 409 399 if ( ! ctx ) { 410 400 throw SemanticError( "use of undeclared context " + contextInst->get_name() ); … … 412 402 for ( std::list< TypeDecl * >::const_iterator i = ctx->get_parameters().begin(); i != ctx->get_parameters().end(); ++i ) { 413 403 for ( std::list< DeclarationWithType * >::const_iterator assert = (*i )->get_assertions().begin(); assert != (*i )->get_assertions().end(); ++assert ) { 414 if ( ContextInstType *otherCtx = dynamic_cast< ContextInstType * >(*assert ) ) {404 if ( TraitInstType *otherCtx = dynamic_cast< TraitInstType * >(*assert ) ) { 415 405 cloneAll( otherCtx->get_members(), contextInst->get_members() ); 416 406 } else { … … 476 466 while ( ! toBeDone.empty() ) { 477 467 for ( std::list< DeclarationWithType * >::iterator assertion = toBeDone.begin(); assertion != toBeDone.end(); ++assertion ) { 478 if ( ContextInstType *ctx = dynamic_cast< ContextInstType * >( (*assertion )->get_type() ) ) {468 if ( TraitInstType *ctx = dynamic_cast< TraitInstType * >( (*assertion )->get_type() ) ) { 479 469 for ( std::list< Declaration * >::const_iterator i = ctx->get_members().begin(); i != ctx->get_members().end(); ++i ) { 480 470 DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( *i ); … … 783 773 makeUnionFieldsAssignment( srcParam, dstParam, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) ); 784 774 if ( isGeneric ) makeUnionFieldsAssignment( srcParam, returnVal, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) ); 785 775 786 776 if ( ! isGeneric ) assignDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) ); 787 777 … … 851 841 } 852 842 853 void AutogenerateRoutines::visit( ContextDecl *) {843 void AutogenerateRoutines::visit( TraitDecl *) { 854 844 // ensure that we don't add assignment ops for types defined as part of the context 855 845 } … … 874 864 } 875 865 876 void AutogenerateRoutines::visit( IfStmt *ifStmt ) {877 visitStatement( ifStmt );878 }879 880 void AutogenerateRoutines::visit( WhileStmt *whileStmt ) {881 visitStatement( whileStmt );882 }883 884 void AutogenerateRoutines::visit( ForStmt *forStmt ) {885 visitStatement( forStmt );886 }887 888 866 void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) { 889 867 visitStatement( switchStmt ); … … 894 872 } 895 873 896 void AutogenerateRoutines::visit( CaseStmt *caseStmt ) { 897 visitStatement( caseStmt ); 898 } 899 900 void AutogenerateRoutines::visit( CatchStmt *cathStmt ) { 901 visitStatement( cathStmt ); 902 } 874 // void AutogenerateRoutines::visit( CaseStmt *caseStmt ) { 875 // visitStatement( caseStmt ); 876 // } 903 877 904 878 void ReturnChecker::checkFunctionReturns( std::list< Declaration * > & translationUnit ) { … … 1043 1017 } 1044 1018 1045 // there may be typedefs nested within aggregates 1046 // in order for everything to work properly, these 1047 // should be removed as well 1019 // there may be typedefs nested within aggregates in order for everything to work properly, these should be removed 1020 // as well 1048 1021 template<typename AggDecl> 1049 1022 AggDecl *EliminateTypedef::handleAggregate( AggDecl * aggDecl ) { … … 1059 1032 return aggDecl; 1060 1033 } 1061 1034 1035 template<typename AggDecl> 1036 void EliminateTypedef::addImplicitTypedef( AggDecl * aggDecl ) { 1037 if ( typedefNames.count( aggDecl->get_name() ) == 0 ) { 1038 Type *type; 1039 if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( aggDecl ) ) { 1040 type = new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ); 1041 } else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( aggDecl ) ) { 1042 type = new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ); 1043 } else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( aggDecl ) ) { 1044 type = new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ); 1045 } // if 1046 TypedefDecl * tyDecl = new TypedefDecl( aggDecl->get_name(), DeclarationNode::NoStorageClass, type ); 1047 typedefNames[ aggDecl->get_name() ] = std::make_pair( tyDecl, scopeLevel ); 1048 } // if 1049 } 1062 1050 Declaration *EliminateTypedef::mutate( StructDecl * structDecl ) { 1051 addImplicitTypedef( structDecl ); 1063 1052 Mutator::mutate( structDecl ); 1064 1053 return handleAggregate( structDecl ); … … 1066 1055 1067 1056 Declaration *EliminateTypedef::mutate( UnionDecl * unionDecl ) { 1057 addImplicitTypedef( unionDecl ); 1068 1058 Mutator::mutate( unionDecl ); 1069 1059 return handleAggregate( unionDecl ); … … 1071 1061 1072 1062 Declaration *EliminateTypedef::mutate( EnumDecl * enumDecl ) { 1063 addImplicitTypedef( enumDecl ); 1073 1064 Mutator::mutate( enumDecl ); 1074 1065 return handleAggregate( enumDecl ); 1075 1066 } 1076 1067 1077 Declaration *EliminateTypedef::mutate( ContextDecl * contextDecl ) {1068 Declaration *EliminateTypedef::mutate( TraitDecl * contextDecl ) { 1078 1069 Mutator::mutate( contextDecl ); 1079 1070 return handleAggregate( contextDecl ); 1080 1071 } 1081 1072 1073 DeclarationWithType * CompoundLiteral::mutate( ObjectDecl *objectDecl ) { 1074 storageclass = objectDecl->get_storageClass(); 1075 DeclarationWithType * temp = Mutator::mutate( objectDecl ); 1076 storageclass = DeclarationNode::NoStorageClass; 1077 return temp; 1078 } 1079 1080 Expression *CompoundLiteral::mutate( CompoundLiteralExpr *compLitExpr ) { 1081 // transform [storage_class] ... (struct S){ 3, ... }; 1082 // into [storage_class] struct S temp = { 3, ... }; 1083 static UniqueName indexName( "_compLit" ); 1084 1085 ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageclass, LinkageSpec::C, 0, compLitExpr->get_type(), compLitExpr->get_initializer() ); 1086 compLitExpr->set_type( 0 ); 1087 compLitExpr->set_initializer( 0 ); 1088 delete compLitExpr; 1089 DeclarationWithType * newtempvar = mutate( tempvar ); 1090 addDeclaration( newtempvar ); // add modified temporary to current block 1091 return new VariableExpr( newtempvar ); 1092 } 1082 1093 } // namespace SymTab 1083 1094
Note:
See TracChangeset
for help on using the changeset viewer.