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