Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    r61a4875 r45161b4d  
    1010// Created On       : Sun May 17 21:50:04 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jan 27 22:03:12 2016
    13 // Update Count     : 225
     12// Last Modified On : Wed Apr 13 16:39:30 2016
     13// Update Count     : 251
    1414//
    1515
     
    4040#include <list>
    4141#include <iterator>
     42#include "Common/utility.h"
     43#include "Common/UniqueName.h"
    4244#include "Validate.h"
    4345#include "SynTree/Visitor.h"
    4446#include "SynTree/Mutator.h"
    4547#include "SynTree/Type.h"
     48#include "SynTree/Expression.h"
    4649#include "SynTree/Statement.h"
    4750#include "SynTree/TypeSubstitution.h"
     
    4952#include "FixFunction.h"
    5053// #include "ImplementationType.h"
    51 #include "Common/utility.h"
    52 #include "Common/UniqueName.h"
     54#include "GenPoly/DeclMutator.h"
    5355#include "AddVisit.h"
    5456#include "MakeLibCfa.h"
     
    7072
    7173                virtual void visit( CompoundStmt *compoundStmt );
    72                 virtual void visit( IfStmt *ifStmt );
    73                 virtual void visit( WhileStmt *whileStmt );
    74                 virtual void visit( ForStmt *forStmt );
    7574                virtual void visit( SwitchStmt *switchStmt );
    7675                virtual void visit( ChooseStmt *chooseStmt );
    77                 virtual void visit( CaseStmt *caseStmt );
    78                 virtual void visit( CatchStmt *catchStmt );
     76                // virtual void visit( CaseStmt *caseStmt );
    7977          private:
    8078                HoistStruct();
     
    10199                virtual void visit( StructInstType *structInst );
    102100                virtual void visit( UnionInstType *unionInst );
    103                 virtual void visit( ContextInstType *contextInst );
     101                virtual void visit( TraitInstType *contextInst );
    104102                virtual void visit( StructDecl *structDecl );
    105103                virtual void visit( UnionDecl *unionDecl );
     
    137135                virtual void visit( UnionDecl *structDecl );
    138136                virtual void visit( TypeDecl *typeDecl );
    139                 virtual void visit( ContextDecl *ctxDecl );
     137                virtual void visit( TraitDecl *ctxDecl );
    140138                virtual void visit( FunctionDecl *functionDecl );
    141139
     
    144142
    145143                virtual void visit( CompoundStmt *compoundStmt );
    146                 virtual void visit( IfStmt *ifStmt );
    147                 virtual void visit( WhileStmt *whileStmt );
    148                 virtual void visit( ForStmt *forStmt );
    149144                virtual void visit( SwitchStmt *switchStmt );
    150145                virtual void visit( ChooseStmt *chooseStmt );
    151                 virtual void visit( CaseStmt *caseStmt );
    152                 virtual void visit( CatchStmt *catchStmt );
     146                // virtual void visit( CaseStmt *caseStmt );
    153147
    154148                AutogenerateRoutines() : functionNesting( 0 ) {}
     
    166160                /// and return something if the return type is non-void.
    167161                static void checkFunctionReturns( std::list< Declaration * > & translationUnit );
    168 
    169162          private:
    170163                virtual void visit( FunctionDecl * functionDecl );
     
    192185                virtual Declaration *mutate( UnionDecl * unionDecl );
    193186                virtual Declaration *mutate( EnumDecl * enumDecl );
    194                 virtual Declaration *mutate( ContextDecl * contextDecl );
     187                virtual Declaration *mutate( TraitDecl * contextDecl );
    195188
    196189                template<typename AggDecl>
    197190                AggDecl *handleAggregate( AggDecl * aggDecl );
    198191
     192                template<typename AggDecl>
     193                void addImplicitTypedef( AggDecl * aggDecl );
     194               
    199195                typedef std::map< std::string, std::pair< TypedefDecl *, int > > TypedefMap;
    200196                TypedefMap typedefNames;
     
    202198        };
    203199
     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
    204207        void validate( std::list< Declaration * > &translationUnit, bool doDebug ) {
    205208                Pass1 pass1;
    206209                Pass2 pass2( doDebug, 0 );
    207210                Pass3 pass3( 0 );
     211                CompoundLiteral compoundliteral;
     212
    208213                EliminateTypedef::eliminateTypedef( translationUnit );
    209214                HoistStruct::hoistStruct( translationUnit );
     
    211216                acceptAll( translationUnit, pass2 );
    212217                ReturnChecker::checkFunctionReturns( translationUnit );
     218                mutateAll( translationUnit, compoundliteral );
    213219                AutogenerateRoutines::autogenerateRoutines( translationUnit );
    214220                acceptAll( translationUnit, pass3 );
     
    292298        }
    293299
    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 
    306300        void HoistStruct::visit( SwitchStmt *switchStmt ) {
    307301                addVisit( switchStmt, *this );
     
    312306        }
    313307
    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        // }
    321311
    322312        void Pass1::visit( EnumDecl *enumDecl ) {
     
    404394        }
    405395
    406         void Pass2::visit( ContextInstType *contextInst ) {
     396        void Pass2::visit( TraitInstType *contextInst ) {
    407397                Parent::visit( contextInst );
    408                 ContextDecl *ctx = indexer->lookupContext( contextInst->get_name() );
     398                TraitDecl *ctx = indexer->lookupTrait( contextInst->get_name() );
    409399                if ( ! ctx ) {
    410400                        throw SemanticError( "use of undeclared context " + contextInst->get_name() );
     
    412402                for ( std::list< TypeDecl * >::const_iterator i = ctx->get_parameters().begin(); i != ctx->get_parameters().end(); ++i ) {
    413403                        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 ) ) {
    415405                                        cloneAll( otherCtx->get_members(), contextInst->get_members() );
    416406                                } else {
     
    476466                        while ( ! toBeDone.empty() ) {
    477467                                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() ) ) {
    479469                                                for ( std::list< Declaration * >::const_iterator i = ctx->get_members().begin(); i != ctx->get_members().end(); ++i ) {
    480470                                                        DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( *i );
     
    783773                makeUnionFieldsAssignment( srcParam, dstParam, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) );
    784774                if ( isGeneric ) makeUnionFieldsAssignment( srcParam, returnVal, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) );
    785 
     775               
    786776                if ( ! isGeneric ) assignDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) );
    787777
     
    851841        }
    852842
    853         void AutogenerateRoutines::visit( ContextDecl *) {
     843        void AutogenerateRoutines::visit( TraitDecl *) {
    854844                // ensure that we don't add assignment ops for types defined as part of the context
    855845        }
     
    874864        }
    875865
    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 
    888866        void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) {
    889867                visitStatement( switchStmt );
     
    894872        }
    895873
    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        // }
    903877
    904878        void ReturnChecker::checkFunctionReturns( std::list< Declaration * > & translationUnit ) {
     
    10431017        }
    10441018
    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
    10481021        template<typename AggDecl>
    10491022        AggDecl *EliminateTypedef::handleAggregate( AggDecl * aggDecl ) {
     
    10591032                return aggDecl;
    10601033        }
    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        }
    10621050        Declaration *EliminateTypedef::mutate( StructDecl * structDecl ) {
     1051                addImplicitTypedef( structDecl );
    10631052                Mutator::mutate( structDecl );
    10641053                return handleAggregate( structDecl );
     
    10661055
    10671056        Declaration *EliminateTypedef::mutate( UnionDecl * unionDecl ) {
     1057                addImplicitTypedef( unionDecl );
    10681058                Mutator::mutate( unionDecl );
    10691059                return handleAggregate( unionDecl );
     
    10711061
    10721062        Declaration *EliminateTypedef::mutate( EnumDecl * enumDecl ) {
     1063                addImplicitTypedef( enumDecl );
    10731064                Mutator::mutate( enumDecl );
    10741065                return handleAggregate( enumDecl );
    10751066        }
    10761067
    1077                 Declaration *EliminateTypedef::mutate( ContextDecl * contextDecl ) {
     1068        Declaration *EliminateTypedef::mutate( TraitDecl * contextDecl ) {
    10781069                Mutator::mutate( contextDecl );
    10791070                return handleAggregate( contextDecl );
    10801071        }
    10811072
     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        }
    10821093} // namespace SymTab
    10831094
Note: See TracChangeset for help on using the changeset viewer.