Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cc

    r2a7b3ca r8ca3a72  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jun 21 15:49:59 2017
    13 // Update Count     : 346
     12// Last Modified On : Sat May 13 09:26:38 2017
     13// Update Count     : 341
    1414//
    1515
     
    101101                        void passTypeVars( ApplicationExpr *appExpr, Type *polyRetType, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars );
    102102                        /// wraps a function application with a new temporary for the out-parameter return value
    103                         Expression *addRetParam( ApplicationExpr *appExpr, Type *retType, std::list< Expression *>::iterator &arg );
     103                        Expression *addRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *retType, std::list< Expression *>::iterator &arg );
    104104                        /// Replaces all the type parameters of a generic type with their concrete equivalents under the current environment
    105105                        void replaceParametersWithConcrete( ApplicationExpr *appExpr, std::list< Expression* >& params );
     
    108108                        Type *replaceWithConcrete( ApplicationExpr *appExpr, Type *type, bool doClone = true );
    109109                        /// wraps a function application returning a polymorphic type with a new temporary for the out-parameter return value
    110                         Expression *addDynRetParam( ApplicationExpr *appExpr, Type *polyType, std::list< Expression *>::iterator &arg );
     110                        Expression *addDynRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *polyType, std::list< Expression *>::iterator &arg );
    111111                        Expression *applyAdapter( ApplicationExpr *appExpr, FunctionType *function, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars );
    112112                        void boxParam( Type *formal, Expression *&arg, const TyVarMap &exprTyVars );
     
    134134                  public:
    135135                        template< typename DeclClass >
    136                         DeclClass *handleDecl( DeclClass *decl );
     136                        DeclClass *handleDecl( DeclClass *decl, Type *type );
    137137                        template< typename AggDecl >
    138138                        AggDecl * handleAggDecl( AggDecl * aggDecl );
     
    341341        Statement *makeAlignTo( Expression *lhs, Expression *rhs ) {
    342342                // check that the lhs is zeroed out to the level of rhs
    343                 Expression *ifCond = makeOp( "?&?", lhs, makeOp( "?-?", rhs, new ConstantExpr( Constant::from_ulong( 1 ) ) ) );
     343                Expression *ifCond = makeOp( "?&?", lhs, makeOp( "?-?", rhs, new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), "1" ) ) ) );
    344344                // if not aligned, increment to alignment
    345345                Expression *ifExpr = makeOp( "?+=?", lhs->clone(), makeOp( "?-?", rhs->clone(), ifCond->clone() ) );
     
    384384
    385385                // initialize size and alignment to 0 and 1 (will have at least one member to re-edit size)
    386                 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant::from_ulong( 0 ) ) ) );
    387                 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant::from_ulong( 1 ) ) ) );
     386                addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "0" ) ) ) );
     387                addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "1" ) ) ) );
    388388                unsigned long n_members = 0;
    389389                bool firstMember = true;
     
    441441
    442442                // calculate union layout in function body
    443                 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant::from_ulong( 1 ) ) ) );
    444                 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant::from_ulong( 1 ) ) ) );
     443                addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "1" ) ) ) );
     444                addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "1" ) ) ) );
    445445                for ( std::list< Declaration* >::const_iterator member = unionDecl->get_members().begin(); member != unionDecl->get_members().end(); ++member ) {
    446446                        DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( *member );
     
    504504                DeclarationWithType *Pass1::mutate( FunctionDecl *functionDecl ) {
    505505                        if ( functionDecl->get_statements() ) {         // empty routine body ?
    506                                 // std::cerr << "mutating function: " << functionDecl->get_mangleName() << std::endl;
    507506                                doBeginScope();
    508507                                scopeTyVars.beginScope();
     
    549548                                retval = oldRetval;
    550549                                doEndScope();
    551                                 // std::cerr << "end function: " << functionDecl->get_mangleName() << std::endl;
    552550                        } // if
    553551                        return functionDecl;
     
    665663                }
    666664
    667                 Expression *Pass1::addRetParam( ApplicationExpr *appExpr, Type *retType, std::list< Expression *>::iterator &arg ) {
     665                Expression *Pass1::addRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *retType, std::list< Expression *>::iterator &arg ) {
    668666                        // Create temporary to hold return value of polymorphic function and produce that temporary as a result
    669667                        // using a comma expression.
     
    728726                }
    729727
    730                 Expression *Pass1::addDynRetParam( ApplicationExpr *appExpr, Type *dynType, std::list< Expression *>::iterator &arg ) {
     728                Expression *Pass1::addDynRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *dynType, std::list< Expression *>::iterator &arg ) {
    731729                        assert( env );
    732730                        Type *concrete = replaceWithConcrete( appExpr, dynType );
    733731                        // add out-parameter for return value
    734                         return addRetParam( appExpr, concrete, arg );
     732                        return addRetParam( appExpr, function, concrete, arg );
    735733                }
    736734
     
    739737//                      if ( ! function->get_returnVals().empty() && isPolyType( function->get_returnVals().front()->get_type(), tyVars ) ) {
    740738                        if ( isDynRet( function, tyVars ) ) {
    741                                 ret = addRetParam( appExpr, function->get_returnVals().front()->get_type(), arg );
     739                                ret = addRetParam( appExpr, function, function->get_returnVals().front()->get_type(), arg );
    742740                        } // if
    743741                        std::string mangleName = mangleAdapterName( function, tyVars );
     
    11181116
    11191117                Expression *Pass1::mutate( ApplicationExpr *appExpr ) {
    1120                         // std::cerr << "mutate appExpr: " << InitTweak::getFunctionName( appExpr ) << std::endl;
     1118                        // std::cerr << "mutate appExpr: ";
    11211119                        // for ( TyVarMap::iterator i = scopeTyVars.begin(); i != scopeTyVars.end(); ++i ) {
    11221120                        //      std::cerr << i->first << " ";
     
    11431141                        ReferenceToType *dynRetType = isDynRet( function, exprTyVars );
    11441142
    1145                         // std::cerr << function << std::endl;
    1146                         // std::cerr << "scopeTyVars: ";
    1147                         // printTyVarMap( std::cerr, scopeTyVars );
    1148                         // std::cerr << "exprTyVars: ";
    1149                         // printTyVarMap( std::cerr, exprTyVars );
    1150                         // std::cerr << "env: " << *env << std::endl;
    1151                         // std::cerr << needsAdapter( function, scopeTyVars ) << ! needsAdapter( function, exprTyVars) << std::endl;
    1152 
    11531143                        // NOTE: addDynRetParam needs to know the actual (generated) return type so it can make a temp variable, so pass the result type from the appExpr
    11541144                        // passTypeVars needs to know the program-text return type (i.e. the distinction between _conc_T30 and T3(int))
    11551145                        // concRetType may not be a good name in one or both of these places. A more appropriate name change is welcome.
    11561146                        if ( dynRetType ) {
    1157                                 // std::cerr << "dynRetType: " << dynRetType << std::endl;
    11581147                                Type *concRetType = appExpr->get_result()->isVoid() ? nullptr : appExpr->get_result();
    1159                                 ret = addDynRetParam( appExpr, concRetType, arg ); // xxx - used to use dynRetType instead of concRetType
     1148                                ret = addDynRetParam( appExpr, function, concRetType, arg ); // xxx - used to use dynRetType instead of concRetType
    11601149                        } else if ( needsAdapter( function, scopeTyVars ) && ! needsAdapter( function, exprTyVars) ) { // xxx - exprTyVars is used above...?
    11611150                                // xxx - the ! needsAdapter check may be incorrect. It seems there is some situation where an adapter is applied where it shouldn't be, and this fixes it for some cases. More investigation is needed.
     
    12911280
    12921281                template< typename DeclClass >
    1293                 DeclClass * Pass2::handleDecl( DeclClass *decl ) {
     1282                DeclClass * Pass2::handleDecl( DeclClass *decl, Type *type ) {
    12941283                        DeclClass *ret = static_cast< DeclClass *>( Parent::mutate( decl ) );
    12951284
     
    13051294
    13061295                DeclarationWithType * Pass2::mutate( FunctionDecl *functionDecl ) {
    1307                         functionDecl = safe_dynamic_cast< FunctionDecl * > ( handleDecl( functionDecl ) );
     1296                        functionDecl = safe_dynamic_cast< FunctionDecl * > ( handleDecl( functionDecl, functionDecl->get_functionType() ) );
    13081297                        FunctionType * ftype = functionDecl->get_functionType();
    13091298                        if ( ! ftype->get_returnVals().empty() && functionDecl->get_statements() ) {
     
    13301319
    13311320                ObjectDecl * Pass2::mutate( ObjectDecl *objectDecl ) {
    1332                         return handleDecl( objectDecl );
     1321                        return handleDecl( objectDecl, objectDecl->get_type() );
    13331322                }
    13341323
     
    13531342                        addToTyVarMap( typeDecl, scopeTyVars );
    13541343                        if ( typeDecl->get_base() ) {
    1355                                 return handleDecl( typeDecl );
     1344                                return handleDecl( typeDecl, typeDecl->get_base() );
    13561345                        } else {
    13571346                                return Parent::mutate( typeDecl );
     
    13601349
    13611350                TypedefDecl * Pass2::mutate( TypedefDecl *typedefDecl ) {
    1362                         return handleDecl( typedefDecl );
     1351                        return handleDecl( typedefDecl, typedefDecl->get_base() );
    13631352                }
    13641353
     
    15751564                /// Returns an index expression into the offset array for a type
    15761565                Expression *makeOffsetIndex( Type *objectType, long i ) {
    1577                         ConstantExpr *fieldIndex = new ConstantExpr( Constant::from_ulong( i ) );
     1566                        std::stringstream offset_namer;
     1567                        offset_namer << i;
     1568                        ConstantExpr *fieldIndex = new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), offset_namer.str() ) );
    15781569                        UntypedExpr *fieldOffset = new UntypedExpr( new NameExpr( "?[?]" ) );
    15791570                        fieldOffset->get_args().push_back( new NameExpr( offsetofName( mangleType( objectType ) ) ) );
     
    17881779                                // all union members are at offset zero
    17891780                                delete offsetofExpr;
    1790                                 return new ConstantExpr( Constant::from_ulong( 0 ) );
     1781                                return new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), "0" ) );
    17911782                        } else return offsetofExpr;
    17921783                }
Note: See TracChangeset for help on using the changeset viewer.