Changeset bfc7811 for src/GenPoly


Ignore:
Timestamp:
Apr 10, 2018, 2:43:50 PM (6 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
new-env, with_gc
Children:
9f2012f
Parents:
dbc2c2c
Message:

Fix some GC bugs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cc

    rdbc2c2c rbfc7811  
    279279        /// Adds parameters for otype layout to a function type
    280280        void addOtypeParams( FunctionType *layoutFnType, std::list< TypeDecl* > &otypeParams ) {
    281                 BasicType sizeAlignType( Type::Qualifiers(), BasicType::LongUnsignedInt );
    282 
    283                 for ( std::list< TypeDecl* >::const_iterator param = otypeParams.begin(); param != otypeParams.end(); ++param ) {
     281                auto sizeAlignType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
     282
     283                for ( std::list< TypeDecl* >::const_iterator param = otypeParams.begin();
     284                                param != otypeParams.end(); ++param ) {
    284285                        TypeInstType paramType( Type::Qualifiers(), (*param)->get_name(), *param );
    285286                        std::string paramName = mangleType( &paramType );
    286                         layoutFnType->get_parameters().push_back( new ObjectDecl( sizeofName( paramName ), Type::StorageClasses(), LinkageSpec::Cforall, 0, sizeAlignType.clone(), 0 ) );
    287                         layoutFnType->get_parameters().push_back( new ObjectDecl( alignofName( paramName ), Type::StorageClasses(), LinkageSpec::Cforall, 0, sizeAlignType.clone(), 0 ) );
     287                        layoutFnType->get_parameters().push_back( new ObjectDecl( sizeofName( paramName ), Type::StorageClasses(), LinkageSpec::Cforall, 0, sizeAlignType->clone(), 0 ) );
     288                        layoutFnType->get_parameters().push_back( new ObjectDecl( alignofName( paramName ), Type::StorageClasses(), LinkageSpec::Cforall, 0, sizeAlignType->clone(), 0 ) );
    288289                }
    289290        }
     
    740741                                Type * newType = param->clone();
    741742                                if ( env ) env->apply( newType );
    742                                 ObjectDecl *newObj = ObjectDecl::newObject( tempNamer.newName(), newType, nullptr );
     743                                ObjectDecl *newObj = ObjectDecl::newObject(
     744                                        tempNamer.newName(), newType, nullptr );
    743745                                newObj->get_type()->get_qualifiers() = Type::Qualifiers(); // TODO: is this right???
    744746                                stmtsToAddBefore.push_back( new DeclStmt( newObj ) );
     
    13251327                        std::list< DeclarationWithType *> inferredParams;
    13261328                        // size/align/offset parameters may not be used in body, pass along with unused attribute.
    1327                         ObjectDecl newObj( "", Type::StorageClasses(), LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), 0,
    1328                                            { new Attribute( "unused" ) } );
    1329                         ObjectDecl newPtr( "", Type::StorageClasses(), LinkageSpec::C, 0,
    1330                                            new PointerType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ), 0 );
    1331                         for ( Type::ForallList::const_iterator tyParm = funcType->get_forall().begin(); tyParm != funcType->get_forall().end(); ++tyParm ) {
     1329                        auto newObj = new ObjectDecl(
     1330                                "", Type::StorageClasses(), LinkageSpec::C, 0,
     1331                                new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), 0,
     1332                            { new Attribute( "unused" ) } );
     1333                        auto newPtr = new ObjectDecl(
     1334                                "", Type::StorageClasses(), LinkageSpec::C, 0,
     1335                            new PointerType( Type::Qualifiers(),
     1336                                        new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ), 0 );
     1337                        for ( Type::ForallList::const_iterator tyParm = funcType->get_forall().begin();
     1338                                        tyParm != funcType->get_forall().end(); ++tyParm ) {
    13321339                                ObjectDecl *sizeParm, *alignParm;
    13331340                                // add all size and alignment parameters to parameter list
     
    13361343                                        std::string parmName = mangleType( &parmType );
    13371344
    1338                                         sizeParm = newObj.clone();
     1345                                        sizeParm = newObj->clone();
    13391346                                        sizeParm->set_name( sizeofName( parmName ) );
    13401347                                        last = funcType->get_parameters().insert( last, sizeParm );
    13411348                                        ++last;
    13421349
    1343                                         alignParm = newObj.clone();
     1350                                        alignParm = newObj->clone();
    13441351                                        alignParm->set_name( alignofName( parmName ) );
    13451352                                        last = funcType->get_parameters().insert( last, alignParm );
     
    13641371
    13651372                                        ObjectDecl *sizeParm, *alignParm, *offsetParm;
    1366                                         sizeParm = newObj.clone();
     1373                                        sizeParm = newObj->clone();
    13671374                                        sizeParm->set_name( sizeofName( typeName ) );
    13681375                                        last = funcType->get_parameters().insert( last, sizeParm );
    13691376                                        ++last;
    13701377
    1371                                         alignParm = newObj.clone();
     1378                                        alignParm = newObj->clone();
    13721379                                        alignParm->set_name( alignofName( typeName ) );
    13731380                                        last = funcType->get_parameters().insert( last, alignParm );
     
    13771384                                                // NOTE zero-length arrays are illegal in C, so empty structs have no offset array
    13781385                                                if ( ! polyBaseStruct->get_baseStruct()->get_members().empty() ) {
    1379                                                         offsetParm = newPtr.clone();
     1386                                                        offsetParm = newPtr->clone();
    13801387                                                        offsetParm->set_name( offsetofName( typeName ) );
    13811388                                                        last = funcType->get_parameters().insert( last, offsetParm );
     
    16141621
    16151622                ObjectDecl *PolyGenericCalculator::makeVar( const std::string &name, Type *type, Initializer *init ) {
    1616                         ObjectDecl *newObj = new ObjectDecl( name, Type::StorageClasses(), LinkageSpec::C, nullptr, type, init );
     1623                        ObjectDecl *newObj = new ObjectDecl(
     1624                                name, Type::StorageClasses(), LinkageSpec::C, nullptr, type, init );
    16171625                        stmtsToAddBefore.push_back( new DeclStmt( newObj ) );
    16181626                        return newObj;
Note: See TracChangeset for help on using the changeset viewer.