Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    rb644d6f r4040425  
    1010// Created On       : Sun May 17 21:50:04 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Apr 13 16:39:30 2016
    13 // Update Count     : 251
     12// Last Modified On : Wed Mar  2 17:31:39 2016
     13// Update Count     : 226
    1414//
    1515
     
    4040#include <list>
    4141#include <iterator>
    42 #include "Common/utility.h"
    43 #include "Common/UniqueName.h"
    4442#include "Validate.h"
    4543#include "SynTree/Visitor.h"
    4644#include "SynTree/Mutator.h"
    4745#include "SynTree/Type.h"
    48 #include "SynTree/Expression.h"
    4946#include "SynTree/Statement.h"
    5047#include "SynTree/TypeSubstitution.h"
     
    5249#include "FixFunction.h"
    5350// #include "ImplementationType.h"
    54 #include "GenPoly/DeclMutator.h"
     51#include "Common/utility.h"
     52#include "Common/UniqueName.h"
    5553#include "AddVisit.h"
    5654#include "MakeLibCfa.h"
     
    7270
    7371                virtual void visit( CompoundStmt *compoundStmt );
     72                virtual void visit( IfStmt *ifStmt );
     73                virtual void visit( WhileStmt *whileStmt );
     74                virtual void visit( ForStmt *forStmt );
    7475                virtual void visit( SwitchStmt *switchStmt );
    7576                virtual void visit( ChooseStmt *chooseStmt );
    76                 // virtual void visit( CaseStmt *caseStmt );
     77                virtual void visit( CaseStmt *caseStmt );
     78                virtual void visit( CatchStmt *catchStmt );
    7779          private:
    7880                HoistStruct();
     
    142144
    143145                virtual void visit( CompoundStmt *compoundStmt );
     146                virtual void visit( IfStmt *ifStmt );
     147                virtual void visit( WhileStmt *whileStmt );
     148                virtual void visit( ForStmt *forStmt );
    144149                virtual void visit( SwitchStmt *switchStmt );
    145150                virtual void visit( ChooseStmt *chooseStmt );
    146                 // virtual void visit( CaseStmt *caseStmt );
     151                virtual void visit( CaseStmt *caseStmt );
     152                virtual void visit( CatchStmt *catchStmt );
    147153
    148154                AutogenerateRoutines() : functionNesting( 0 ) {}
     
    160166                /// and return something if the return type is non-void.
    161167                static void checkFunctionReturns( std::list< Declaration * > & translationUnit );
     168
    162169          private:
    163170                virtual void visit( FunctionDecl * functionDecl );
     
    190197                AggDecl *handleAggregate( AggDecl * aggDecl );
    191198
    192                 template<typename AggDecl>
    193                 void addImplicitTypedef( AggDecl * aggDecl );
    194                
    195199                typedef std::map< std::string, std::pair< TypedefDecl *, int > > TypedefMap;
    196200                TypedefMap typedefNames;
     
    198202        };
    199203
    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 
    207204        void validate( std::list< Declaration * > &translationUnit, bool doDebug ) {
    208205                Pass1 pass1;
    209206                Pass2 pass2( doDebug, 0 );
    210207                Pass3 pass3( 0 );
    211                 CompoundLiteral compoundliteral;
    212 
    213208                EliminateTypedef::eliminateTypedef( translationUnit );
    214209                HoistStruct::hoistStruct( translationUnit );
     
    216211                acceptAll( translationUnit, pass2 );
    217212                ReturnChecker::checkFunctionReturns( translationUnit );
    218                 mutateAll( translationUnit, compoundliteral );
    219213                AutogenerateRoutines::autogenerateRoutines( translationUnit );
    220214                acceptAll( translationUnit, pass3 );
     
    298292        }
    299293
     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
    300306        void HoistStruct::visit( SwitchStmt *switchStmt ) {
    301307                addVisit( switchStmt, *this );
     
    306312        }
    307313
    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        }
    311321
    312322        void Pass1::visit( EnumDecl *enumDecl ) {
     
    864874        }
    865875
     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
    866888        void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) {
    867889                visitStatement( switchStmt );
     
    872894        }
    873895
    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        }
    877903
    878904        void ReturnChecker::checkFunctionReturns( std::list< Declaration * > & translationUnit ) {
     
    921947                                }
    922948                                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());
    925950                        } // if
    926951                        delete typeInst;
     
    10181043        }
    10191044
    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
    10221048        template<typename AggDecl>
    10231049        AggDecl *EliminateTypedef::handleAggregate( AggDecl * aggDecl ) {
     
    10331059                return aggDecl;
    10341060        }
    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
    10511062        Declaration *EliminateTypedef::mutate( StructDecl * structDecl ) {
    1052                 addImplicitTypedef( structDecl );
    10531063                Mutator::mutate( structDecl );
    10541064                return handleAggregate( structDecl );
     
    10561066
    10571067        Declaration *EliminateTypedef::mutate( UnionDecl * unionDecl ) {
    1058                 addImplicitTypedef( unionDecl );
    10591068                Mutator::mutate( unionDecl );
    10601069                return handleAggregate( unionDecl );
     
    10621071
    10631072        Declaration *EliminateTypedef::mutate( EnumDecl * enumDecl ) {
    1064                 addImplicitTypedef( enumDecl );
    10651073                Mutator::mutate( enumDecl );
    10661074                return handleAggregate( enumDecl );
    10671075        }
    10681076
    1069         Declaration *EliminateTypedef::mutate( TraitDecl * contextDecl ) {
     1077                Declaration *EliminateTypedef::mutate( TraitDecl * contextDecl ) {
    10701078                Mutator::mutate( contextDecl );
    10711079                return handleAggregate( contextDecl );
    10721080        }
    10731081
    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 block
    1092                 return new VariableExpr( newtempvar );
    1093         }
    10941082} // namespace SymTab
    10951083
Note: See TracChangeset for help on using the changeset viewer.