Changes in src/SymTab/Validate.cc [b644d6f:4040425]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Validate.cc
rb644d6f r4040425 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 Mar 2 17:31:39 2016 13 // Update Count : 226 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(); … … 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 ); … … 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 ) { … … 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 ) { … … 921 947 } 922 948 rtt->get_parameters().clear(); 923 cloneAll( typeInst->get_parameters(), rtt->get_parameters() ); 924 mutateAll( rtt->get_parameters(), *this ); // recursively fix typedefs on parameters 949 cloneAll(typeInst->get_parameters(), rtt->get_parameters()); 925 950 } // if 926 951 delete typeInst; … … 1018 1043 } 1019 1044 1020 // there may be typedefs nested within aggregates in order for everything to work properly, these should be removed 1021 // 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 1022 1048 template<typename AggDecl> 1023 1049 AggDecl *EliminateTypedef::handleAggregate( AggDecl * aggDecl ) { … … 1033 1059 return aggDecl; 1034 1060 } 1035 1036 template<typename AggDecl> 1037 void EliminateTypedef::addImplicitTypedef( AggDecl * aggDecl ) { 1038 if ( typedefNames.count( aggDecl->get_name() ) == 0 ) { 1039 Type *type; 1040 if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( aggDecl ) ) { 1041 type = new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ); 1042 } else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( aggDecl ) ) { 1043 type = new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ); 1044 } else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( aggDecl ) ) { 1045 type = new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ); 1046 } // if 1047 TypedefDecl * tyDecl = new TypedefDecl( aggDecl->get_name(), DeclarationNode::NoStorageClass, type ); 1048 typedefNames[ aggDecl->get_name() ] = std::make_pair( tyDecl, scopeLevel ); 1049 } // if 1050 } 1061 1051 1062 Declaration *EliminateTypedef::mutate( StructDecl * structDecl ) { 1052 addImplicitTypedef( structDecl );1053 1063 Mutator::mutate( structDecl ); 1054 1064 return handleAggregate( structDecl ); … … 1056 1066 1057 1067 Declaration *EliminateTypedef::mutate( UnionDecl * unionDecl ) { 1058 addImplicitTypedef( unionDecl );1059 1068 Mutator::mutate( unionDecl ); 1060 1069 return handleAggregate( unionDecl ); … … 1062 1071 1063 1072 Declaration *EliminateTypedef::mutate( EnumDecl * enumDecl ) { 1064 addImplicitTypedef( enumDecl );1065 1073 Mutator::mutate( enumDecl ); 1066 1074 return handleAggregate( enumDecl ); 1067 1075 } 1068 1076 1069 Declaration *EliminateTypedef::mutate( TraitDecl * contextDecl ) {1077 Declaration *EliminateTypedef::mutate( TraitDecl * contextDecl ) { 1070 1078 Mutator::mutate( contextDecl ); 1071 1079 return handleAggregate( contextDecl ); 1072 1080 } 1073 1081 1074 DeclarationWithType * CompoundLiteral::mutate( ObjectDecl *objectDecl ) {1075 storageclass = objectDecl->get_storageClass();1076 DeclarationWithType * temp = Mutator::mutate( objectDecl );1077 storageclass = DeclarationNode::NoStorageClass;1078 return temp;1079 }1080 1081 Expression *CompoundLiteral::mutate( CompoundLiteralExpr *compLitExpr ) {1082 // transform [storage_class] ... (struct S){ 3, ... };1083 // into [storage_class] struct S temp = { 3, ... };1084 static UniqueName indexName( "_compLit" );1085 1086 ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageclass, LinkageSpec::C, 0, compLitExpr->get_type(), compLitExpr->get_initializer() );1087 compLitExpr->set_type( 0 );1088 compLitExpr->set_initializer( 0 );1089 delete compLitExpr;1090 DeclarationWithType * newtempvar = mutate( tempvar );1091 addDeclaration( newtempvar ); // add modified temporary to current block1092 return new VariableExpr( newtempvar );1093 }1094 1082 } // namespace SymTab 1095 1083
Note:
See TracChangeset
for help on using the changeset viewer.