Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cc

    ra0c7dc36 rbc3127d  
    2727
    2828#include "CodeGen/OperatorTable.h"
    29 #include "Common/PassVisitor.h"          // for PassVisitor
    3029#include "Common/ScopedMap.h"            // for ScopedMap, ScopedMap<>::iter...
    3130#include "Common/SemanticError.h"        // for SemanticError
     
    158157                /// * Calculates polymorphic offsetof expressions from offset array
    159158                /// * Inserts dynamic calculation of polymorphic type layouts where needed
    160                 class PolyGenericCalculator final : public WithGuards, public WithVisitorRef<PolyGenericCalculator>, public WithStmtsToAdd, public WithDeclsToAdd, public WithTypeSubstitution {
     159                class PolyGenericCalculator final : public PolyMutator {
    161160                public:
     161                        typedef PolyMutator Parent;
     162                        using Parent::mutate;
     163
    162164                        PolyGenericCalculator();
    163165
    164                         void premutate( ObjectDecl *objectDecl );
    165                         void premutate( FunctionDecl *functionDecl );
    166                         void premutate( TypedefDecl *objectDecl );
    167                         void premutate( TypeDecl *objectDecl );
    168                         Declaration * postmutate( TypeDecl *TraitDecl );
    169                         void premutate( PointerType *pointerType );
    170                         void premutate( FunctionType *funcType );
    171                         void premutate( DeclStmt *declStmt );
    172                         Expression *postmutate( MemberExpr *memberExpr );
    173                         Expression *postmutate( SizeofExpr *sizeofExpr );
    174                         Expression *postmutate( AlignofExpr *alignofExpr );
    175                         Expression *postmutate( OffsetofExpr *offsetofExpr );
    176                         Expression *postmutate( OffsetPackExpr *offsetPackExpr );
    177 
    178                         void beginScope();
    179                         void endScope();
     166                        template< typename DeclClass >
     167                        DeclClass *handleDecl( DeclClass *decl, Type *type );
     168                        virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override;
     169                        virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override;
     170                        virtual TypedefDecl *mutate( TypedefDecl *objectDecl ) override;
     171                        virtual TypeDecl *mutate( TypeDecl *objectDecl ) override;
     172                        virtual Statement *mutate( DeclStmt *declStmt ) override;
     173                        virtual Type *mutate( PointerType *pointerType ) override;
     174                        virtual Type *mutate( FunctionType *funcType ) override;
     175                        virtual Expression *mutate( MemberExpr *memberExpr ) override;
     176                        virtual Expression *mutate( SizeofExpr *sizeofExpr ) override;
     177                        virtual Expression *mutate( AlignofExpr *alignofExpr ) override;
     178                        virtual Expression *mutate( OffsetofExpr *offsetofExpr ) override;
     179                        virtual Expression *mutate( OffsetPackExpr *offsetPackExpr ) override;
     180
     181                        virtual void doBeginScope() override;
     182                        virtual void doEndScope() override;
    180183
    181184                private:
     
    191194                        /// Exits the type-variable scope
    192195                        void endTypeScope();
    193                         /// Enters a new scope for knowLayouts and knownOffsets and queues exit calls
    194                         void beginGenericScope();
    195196
    196197                        ScopedSet< std::string > knownLayouts;          ///< Set of generic type layouts known in the current scope, indexed by sizeofName
    197198                        ScopedSet< std::string > knownOffsets;          ///< Set of non-generic types for which the offset array exists in the current scope, indexed by offsetofName
    198199                        UniqueName bufNamer;                           ///< Namer for VLA buffers
    199                         TyVarMap scopeTyVars;
    200200                };
    201201
     
    250250                Pass1 pass1;
    251251                Pass2 pass2;
    252                 PassVisitor<PolyGenericCalculator> polyCalculator;
     252                PolyGenericCalculator polyCalculator;
    253253                Pass3 pass3;
    254254
     
    256256                mutateTranslationUnit/*All*/( translationUnit, pass1 );
    257257                mutateTranslationUnit/*All*/( translationUnit, pass2 );
    258                 mutateAll( translationUnit, polyCalculator );
     258                mutateTranslationUnit/*All*/( translationUnit, polyCalculator );
    259259                mutateTranslationUnit/*All*/( translationUnit, pass3 );
    260260        }
     
    555555                TypeDecl *Pass1::mutate( TypeDecl *typeDecl ) {
    556556                        addToTyVarMap( typeDecl, scopeTyVars );
    557                         return dynamic_cast<TypeDecl*>( Mutator::mutate( typeDecl ) );
     557                        return Mutator::mutate( typeDecl );
    558558                }
    559559
     
    762762                                } else if ( arg->get_result()->get_lvalue() ) {
    763763                                        // argument expression may be CFA lvalue, but not C lvalue -- apply generalizedLvalue transformations.
    764                                         // if ( VariableExpr * varExpr = dynamic_cast< VariableExpr * >( arg ) ) {
    765                                         //      if ( dynamic_cast<ArrayType *>( varExpr->var->get_type() ) ){
    766                                         //              // temporary hack - don't box arrays, because &arr is not the same as &arr[0]
    767                                         //              return;
    768                                         //      }
    769                                         // }
    770764                                        arg =  generalizedLvalue( new AddressExpr( arg ) );
    771765                                        if ( ! ResolvExpr::typesCompatible( param, arg->get_result(), SymTab::Indexer() ) ) {
     
    13591353                                return handleDecl( typeDecl );
    13601354                        } else {
    1361                                 return dynamic_cast<TypeDecl*>( Parent::mutate( typeDecl ) );
     1355                                return Parent::mutate( typeDecl );
    13621356                        }
    13631357                }
     
    14721466
    14731467                PolyGenericCalculator::PolyGenericCalculator()
    1474                         : knownLayouts(), knownOffsets(), bufNamer( "_buf" ), scopeTyVars( TypeDecl::Data{} ) {}
     1468                        : Parent(), knownLayouts(), knownOffsets(), bufNamer( "_buf" ) {}
    14751469
    14761470                void PolyGenericCalculator::beginTypeScope( Type *ty ) {
    1477                         GuardScope( scopeTyVars );
     1471                        scopeTyVars.beginScope();
    14781472                        makeTyVarMap( ty, scopeTyVars );
    14791473                }
    14801474
    1481                 void PolyGenericCalculator::beginGenericScope() {
    1482                         GuardScope( *this );
    1483                 }
    1484 
    1485                 void PolyGenericCalculator::premutate( ObjectDecl *objectDecl ) {
    1486                         beginTypeScope( objectDecl->get_type() );
    1487                 }
    1488 
    1489                 void PolyGenericCalculator::premutate( FunctionDecl *functionDecl ) {
    1490                         beginGenericScope();
    1491 
    1492                         beginTypeScope( functionDecl->get_functionType() );
    1493                 }
    1494 
    1495                 void PolyGenericCalculator::premutate( TypedefDecl *typedefDecl ) {
    1496                         beginTypeScope( typedefDecl->get_base() );
    1497                 }
    1498 
    1499                 void PolyGenericCalculator::premutate( TypeDecl * typeDecl ) {
     1475                void PolyGenericCalculator::endTypeScope() {
     1476                        scopeTyVars.endScope();
     1477                }
     1478
     1479                template< typename DeclClass >
     1480                DeclClass * PolyGenericCalculator::handleDecl( DeclClass *decl, Type *type ) {
     1481                        beginTypeScope( type );
     1482                        // knownLayouts.beginScope();
     1483                        // knownOffsets.beginScope();
     1484
     1485                        DeclClass *ret = static_cast< DeclClass *>( Parent::mutate( decl ) );
     1486
     1487                        // knownOffsets.endScope();
     1488                        // knownLayouts.endScope();
     1489                        endTypeScope();
     1490                        return ret;
     1491                }
     1492
     1493                ObjectDecl * PolyGenericCalculator::mutate( ObjectDecl *objectDecl ) {
     1494                        return handleDecl( objectDecl, objectDecl->get_type() );
     1495                }
     1496
     1497                DeclarationWithType * PolyGenericCalculator::mutate( FunctionDecl *functionDecl ) {
     1498                        knownLayouts.beginScope();
     1499                        knownOffsets.beginScope();
     1500
     1501                        DeclarationWithType * decl = handleDecl( functionDecl, functionDecl->get_functionType() );
     1502                        knownOffsets.endScope();
     1503                        knownLayouts.endScope();
     1504                        return decl;
     1505                }
     1506
     1507                TypedefDecl * PolyGenericCalculator::mutate( TypedefDecl *typedefDecl ) {
     1508                        return handleDecl( typedefDecl, typedefDecl->get_base() );
     1509                }
     1510
     1511                TypeDecl * PolyGenericCalculator::mutate( TypeDecl *typeDecl ) {
    15001512                        addToTyVarMap( typeDecl, scopeTyVars );
    1501                 }
    1502 
    1503                 Declaration * PolyGenericCalculator::postmutate( TypeDecl *typeDecl ) {
    1504                         if ( Type * base = typeDecl->base ) {
    1505                                 // add size/align variables for opaque type declarations
    1506                                 TypeInstType inst( Type::Qualifiers(), typeDecl->name, typeDecl );
    1507                                 std::string typeName = mangleType( &inst );
    1508                                 Type *layoutType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
    1509 
    1510                                 ObjectDecl * sizeDecl = ObjectDecl::newObject( sizeofName( typeName ), layoutType, new SingleInit( new SizeofExpr( base->clone() ) ) );
    1511                                 ObjectDecl * alignDecl = ObjectDecl::newObject( alignofName( typeName ), layoutType->clone(), new SingleInit( new AlignofExpr( base->clone() ) ) );
    1512 
    1513                                 // ensure that the initializing sizeof/alignof exprs are properly mutated
    1514                                 sizeDecl->acceptMutator( *visitor );
    1515                                 alignDecl->acceptMutator( *visitor );
    1516 
    1517                                 // can't use makeVar, because it inserts into stmtsToAdd and TypeDecls can occur at global scope
    1518                                 declsToAddAfter.push_back( alignDecl );
    1519                                 // replace with sizeDecl
    1520                                 return sizeDecl;
    1521                         }
    1522                         return typeDecl;
    1523                 }
    1524 
    1525                 void PolyGenericCalculator::premutate( PointerType *pointerType ) {
     1513                        return Parent::mutate( typeDecl );
     1514                }
     1515
     1516                Type * PolyGenericCalculator::mutate( PointerType *pointerType ) {
    15261517                        beginTypeScope( pointerType );
    1527                 }
    1528 
    1529                 void PolyGenericCalculator::premutate( FunctionType *funcType ) {
     1518
     1519                        Type *ret = Parent::mutate( pointerType );
     1520
     1521                        endTypeScope();
     1522                        return ret;
     1523                }
     1524
     1525                Type * PolyGenericCalculator::mutate( FunctionType *funcType ) {
    15301526                        beginTypeScope( funcType );
    15311527
     
    15381534                                }
    15391535                        }
    1540                 }
    1541 
    1542                 void PolyGenericCalculator::premutate( DeclStmt *declStmt ) {
     1536
     1537                        Type *ret = Parent::mutate( funcType );
     1538
     1539                        endTypeScope();
     1540                        return ret;
     1541                }
     1542
     1543                Statement *PolyGenericCalculator::mutate( DeclStmt *declStmt ) {
    15431544                        if ( ObjectDecl *objectDecl = dynamic_cast< ObjectDecl *>( declStmt->get_decl() ) ) {
    15441545                                if ( findGeneric( objectDecl->get_type() ) ) {
     
    15491550                                                new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Kind::Char), new NameExpr( sizeofName( mangleType(declType) ) ),
    15501551                                                true, false, std::list<Attribute*>{ new Attribute( "aligned", std::list<Expression*>{ new ConstantExpr( Constant::from_int(8) ) } ) } ), 0 );
    1551                                         stmtsToAddBefore.push_back( new DeclStmt( noLabels, newBuf ) );
     1552                                        stmtsToAdd.push_back( new DeclStmt( noLabels, newBuf ) );
    15521553
    15531554                                        delete objectDecl->get_init();
     
    15551556                                }
    15561557                        }
     1558                        return Parent::mutate( declStmt );
    15571559                }
    15581560
     
    15811583                }
    15821584
    1583                 Expression *PolyGenericCalculator::postmutate( MemberExpr *memberExpr ) {
     1585                Expression *PolyGenericCalculator::mutate( MemberExpr *memberExpr ) {
     1586                        // mutate, exiting early if no longer MemberExpr
     1587                        Expression *expr = Parent::mutate( memberExpr );
     1588                        memberExpr = dynamic_cast< MemberExpr* >( expr );
     1589                        if ( ! memberExpr ) return expr;
     1590
    15841591                        // only mutate member expressions for polymorphic types
    15851592                        int tyDepth;
     
    16281635                ObjectDecl *PolyGenericCalculator::makeVar( const std::string &name, Type *type, Initializer *init ) {
    16291636                        ObjectDecl *newObj = new ObjectDecl( name, Type::StorageClasses(), LinkageSpec::C, 0, type, init );
    1630                         stmtsToAddBefore.push_back( new DeclStmt( noLabels, newObj ) );
     1637                        stmtsToAdd.push_back( new DeclStmt( noLabels, newObj ) );
    16311638                        return newObj;
    16321639                }
     
    17071714                                        addOtypeParamsToLayoutCall( layoutCall, otypeParams );
    17081715
    1709                                         stmtsToAddBefore.push_back( new ExprStmt( noLabels, layoutCall ) );
     1716                                        stmtsToAdd.push_back( new ExprStmt( noLabels, layoutCall ) );
    17101717                                }
    17111718
     
    17331740                                addOtypeParamsToLayoutCall( layoutCall, otypeParams );
    17341741
    1735                                 stmtsToAddBefore.push_back( new ExprStmt( noLabels, layoutCall ) );
     1742                                stmtsToAdd.push_back( new ExprStmt( noLabels, layoutCall ) );
    17361743
    17371744                                return true;
     
    17411748                }
    17421749
    1743                 Expression *PolyGenericCalculator::postmutate( SizeofExpr *sizeofExpr ) {
     1750                Expression *PolyGenericCalculator::mutate( SizeofExpr *sizeofExpr ) {
    17441751                        Type *ty = sizeofExpr->get_isType() ? sizeofExpr->get_type() : sizeofExpr->get_expr()->get_result();
    17451752                        if ( findGeneric( ty ) ) {
     
    17511758                }
    17521759
    1753                 Expression *PolyGenericCalculator::postmutate( AlignofExpr *alignofExpr ) {
     1760                Expression *PolyGenericCalculator::mutate( AlignofExpr *alignofExpr ) {
    17541761                        Type *ty = alignofExpr->get_isType() ? alignofExpr->get_type() : alignofExpr->get_expr()->get_result();
    17551762                        if ( findGeneric( ty ) ) {
     
    17611768                }
    17621769
    1763                 Expression *PolyGenericCalculator::postmutate( OffsetofExpr *offsetofExpr ) {
     1770                Expression *PolyGenericCalculator::mutate( OffsetofExpr *offsetofExpr ) {
     1771                        // mutate, exiting early if no longer OffsetofExpr
     1772                        Expression *expr = Parent::mutate( offsetofExpr );
     1773                        offsetofExpr = dynamic_cast< OffsetofExpr* >( expr );
     1774                        if ( ! offsetofExpr ) return expr;
     1775
    17641776                        // only mutate expressions for polymorphic structs/unions
    17651777                        Type *ty = offsetofExpr->get_type();
     
    17811793                }
    17821794
    1783                 Expression *PolyGenericCalculator::postmutate( OffsetPackExpr *offsetPackExpr ) {
     1795                Expression *PolyGenericCalculator::mutate( OffsetPackExpr *offsetPackExpr ) {
    17841796                        StructInstType *ty = offsetPackExpr->get_type();
    17851797
     
    18201832                }
    18211833
    1822                 void PolyGenericCalculator::beginScope() {
     1834                void PolyGenericCalculator::doBeginScope() {
    18231835                        knownLayouts.beginScope();
    18241836                        knownOffsets.beginScope();
    18251837                }
    18261838
    1827                 void PolyGenericCalculator::endScope() {
     1839                void PolyGenericCalculator::doEndScope() {
    18281840                        knownLayouts.endScope();
    18291841                        knownOffsets.endScope();
     
    18821894
    18831895                        addToTyVarMap( typeDecl, scopeTyVars );
    1884                         return dynamic_cast<TypeDecl*>( Mutator::mutate( typeDecl ) );
     1896                        return Mutator::mutate( typeDecl );
    18851897                }
    18861898
Note: See TracChangeset for help on using the changeset viewer.