Ignore:
Timestamp:
Jan 7, 2021, 3:27:00 PM (5 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
2b4daf2, 64aeca0
Parents:
3c64c668 (diff), eef8dfb (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' into park_unpark

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Mangler.cc

    r3c64c668 r58fe85a  
    1010// Created On       : Sun May 17 21:40:29 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Feb 15 13:55:12 2020
    13 // Update Count     : 33
     12// Last Modified On : Wed Nov 18 12:01:38 2020
     13// Update Count     : 64
    1414//
    1515#include "Mangler.h"
     
    6565                                void postvisit( const QualifiedType * qualType );
    6666
    67                                 std::string get_mangleName() { return mangleName.str(); }
     67                                std::string get_mangleName() { return mangleName; }
    6868                          private:
    69                                 std::ostringstream mangleName;  ///< Mangled name being constructed
     69                                std::string mangleName;         ///< Mangled name being constructed
    7070                                typedef std::map< std::string, std::pair< int, int > > VarMapType;
    7171                                VarMapType varNums;             ///< Map of type variables to indices
     
    127127                                        isTopLevel = false;
    128128                                } // if
    129                                 mangleName << Encoding::manglePrefix;
     129                                mangleName += Encoding::manglePrefix;
    130130                                const CodeGen::OperatorInfo * opInfo = CodeGen::operatorLookup( declaration->get_name() );
    131131                                if ( opInfo ) {
    132                                         mangleName << opInfo->outputName.size() << opInfo->outputName;
     132                                        mangleName += std::to_string( opInfo->outputName.size() ) + opInfo->outputName;
    133133                                } else {
    134                                         mangleName << declaration->name.size() << declaration->name;
     134                                        mangleName += std::to_string( declaration->name.size() ) + declaration->name;
    135135                                } // if
    136136                                maybeAccept( declaration->get_type(), *visitor );
     
    139139                                        // so they need a different name mangling
    140140                                        if ( declaration->get_linkage() == LinkageSpec::AutoGen ) {
    141                                                 mangleName << Encoding::autogen;
     141                                                mangleName += Encoding::autogen;
    142142                                        } else if ( declaration->get_linkage() == LinkageSpec::Intrinsic ) {
    143                                                 mangleName << Encoding::intrinsic;
     143                                                mangleName += Encoding::intrinsic;
    144144                                        } else {
    145145                                                // if we add another kind of overridable function, this has to change
     
    160160                        void Mangler_old::postvisit( const VoidType * voidType ) {
    161161                                printQualifiers( voidType );
    162                                 mangleName << Encoding::void_t;
     162                                mangleName += Encoding::void_t;
    163163                        }
    164164
     
    166166                                printQualifiers( basicType );
    167167                                assertf( basicType->kind < BasicType::NUMBER_OF_BASIC_TYPES, "Unhandled basic type: %d", basicType->kind );
    168                                 mangleName << Encoding::basicTypes[ basicType->kind ];
     168                                mangleName += Encoding::basicTypes[ basicType->kind ];
    169169                        }
    170170
     
    172172                                printQualifiers( pointerType );
    173173                                // mangle void (*f)() and void f() to the same name to prevent overloading on functions and function pointers
    174                                 if ( ! dynamic_cast<FunctionType *>( pointerType->base ) ) mangleName << Encoding::pointer;
     174                                if ( ! dynamic_cast<FunctionType *>( pointerType->base ) ) mangleName += Encoding::pointer;
    175175                                maybeAccept( pointerType->base, *visitor );
    176176                        }
     
    179179                                // TODO: encode dimension
    180180                                printQualifiers( arrayType );
    181                                 mangleName << Encoding::array << "0";
     181                                mangleName += Encoding::array + "0";
    182182                                maybeAccept( arrayType->base, *visitor );
    183183                        }
     
    204204                        void Mangler_old::postvisit( const FunctionType * functionType ) {
    205205                                printQualifiers( functionType );
    206                                 mangleName << Encoding::function;
     206                                mangleName += Encoding::function;
    207207                                // turn on inFunctionType so that printQualifiers does not print most qualifiers for function parameters,
    208208                                // since qualifiers on outermost parameter type do not differentiate function types, e.g.,
     
    211211                                inFunctionType = true;
    212212                                std::list< Type* > returnTypes = getTypes( functionType->returnVals );
    213                                 if (returnTypes.empty()) mangleName << Encoding::void_t;
     213                                if (returnTypes.empty()) mangleName += Encoding::void_t;
    214214                                else acceptAll( returnTypes, *visitor );
    215                                 mangleName << "_";
     215                                mangleName += "_";
    216216                                std::list< Type* > paramTypes = getTypes( functionType->parameters );
    217217                                acceptAll( paramTypes, *visitor );
    218                                 mangleName << "_";
     218                                mangleName += "_";
    219219                        }
    220220
     
    222222                                printQualifiers( refType );
    223223
    224                                 mangleName << prefix << refType->name.length() << refType->name;
     224                                mangleName += prefix + std::to_string( refType->name.length() ) + refType->name;
    225225
    226226                                if ( mangleGenericParams ) {
    227227                                        const std::list< Expression* > & params = refType->parameters;
    228228                                        if ( ! params.empty() ) {
    229                                                 mangleName << "_";
     229                                                mangleName += "_";
    230230                                                for ( const Expression * param : params ) {
    231231                                                        const TypeExpr * paramType = dynamic_cast< const TypeExpr * >( param );
     
    233233                                                        maybeAccept( paramType->type, *visitor );
    234234                                                }
    235                                                 mangleName << "_";
     235                                                mangleName += "_";
    236236                                        }
    237237                                }
     
    262262                                        // are first found and prefixing with the appropriate encoding for the type class.
    263263                                        assertf( varNum->second.second < TypeDecl::NUMBER_OF_KINDS, "Unhandled type variable kind: %d", varNum->second.second );
    264                                         mangleName << Encoding::typeVariables[varNum->second.second] << varNum->second.first;
     264                                        mangleName += Encoding::typeVariables[varNum->second.second] + std::to_string( varNum->second.first );
    265265                                } // if
    266266                        }
     
    268268                        void Mangler_old::postvisit( const TraitInstType * inst ) {
    269269                                printQualifiers( inst );
    270                                 mangleName << inst->name.size() << inst->name;
     270                                mangleName += std::to_string( inst->name.size() ) + inst->name;
    271271                        }
    272272
    273273                        void Mangler_old::postvisit( const TupleType * tupleType ) {
    274274                                printQualifiers( tupleType );
    275                                 mangleName << Encoding::tuple << tupleType->types.size();
     275                                mangleName += Encoding::tuple + std::to_string( tupleType->types.size() );
    276276                                acceptAll( tupleType->types, *visitor );
    277277                        }
     
    280280                                printQualifiers( varArgsType );
    281281                                static const std::string vargs = "__builtin_va_list";
    282                                 mangleName << Encoding::type << vargs.size() << vargs;
     282                                mangleName += Encoding::type + std::to_string( vargs.size() ) + vargs;
    283283                        }
    284284
    285285                        void Mangler_old::postvisit( const ZeroType * ) {
    286                                 mangleName << Encoding::zero;
     286                                mangleName += Encoding::zero;
    287287                        }
    288288
    289289                        void Mangler_old::postvisit( const OneType * ) {
    290                                 mangleName << Encoding::one;
     290                                mangleName += Encoding::one;
    291291                        }
    292292
     
    296296                                        // N marks the start of a qualified type
    297297                                        inQualifiedType = true;
    298                                         mangleName << Encoding::qualifiedTypeStart;
     298                                        mangleName += Encoding::qualifiedTypeStart;
    299299                                }
    300300                                maybeAccept( qualType->parent, *visitor );
     
    303303                                        // E marks the end of a qualified type
    304304                                        inQualifiedType = false;
    305                                         mangleName << Encoding::qualifiedTypeEnd;
     305                                        mangleName += Encoding::qualifiedTypeEnd;
    306306                                }
    307307                        }
     
    315315                                assertf(false, "Mangler_old should not visit typedecl: %s", toCString(decl));
    316316                                assertf( decl->kind < TypeDecl::NUMBER_OF_KINDS, "Unhandled type variable kind: %d", decl->kind );
    317                                 mangleName << Encoding::typeVariables[ decl->kind ] << ( decl->name.length() ) << decl->name;
     317                                mangleName += Encoding::typeVariables[ decl->kind ] + std::to_string( decl->name.length() ) + decl->name;
    318318                        }
    319319
     
    330330                                        std::list< std::string > assertionNames;
    331331                                        int dcount = 0, fcount = 0, vcount = 0, acount = 0;
    332                                         mangleName << Encoding::forall;
     332                                        mangleName += Encoding::forall;
    333333                                        for ( const TypeDecl * i : type->forall ) {
    334334                                                switch ( i->kind ) {
     
    354354                                                } // for
    355355                                        } // for
    356                                         mangleName << dcount << "_" << fcount << "_" << vcount << "_" << acount << "_";
    357                                         std::copy( assertionNames.begin(), assertionNames.end(), std::ostream_iterator< std::string >( mangleName, "" ) );
    358                                         mangleName << "_";
     356                                        mangleName += std::to_string( dcount ) + "_" + std::to_string( fcount ) + "_" + std::to_string( vcount ) + "_" + std::to_string( acount ) + "_";
     357                                        for(const auto & a : assertionNames) mangleName += a;
     358//                                      std::copy( assertionNames.begin(), assertionNames.end(), std::ostream_iterator< std::string >( mangleName, "" ) );
     359                                        mangleName += "_";
    359360                                } // if
    360361                                if ( ! inFunctionType ) {
    361362                                        // these qualifiers do not distinguish the outermost type of a function parameter
    362363                                        if ( type->get_const() ) {
    363                                                 mangleName << Encoding::qualifiers.at(Type::Const);
     364                                                mangleName += Encoding::qualifiers.at(Type::Const);
    364365                                        } // if
    365366                                        if ( type->get_volatile() ) {
    366                                                 mangleName << Encoding::qualifiers.at(Type::Volatile);
     367                                                mangleName += Encoding::qualifiers.at(Type::Volatile);
    367368                                        } // if
    368369                                        // Removed due to restrict not affecting function compatibility in GCC
    369370                                        // if ( type->get_isRestrict() ) {
    370                                         //      mangleName << "E";
     371                                        //      mangleName += "E";
    371372                                        // } // if
    372373                                        if ( type->get_atomic() ) {
    373                                                 mangleName << Encoding::qualifiers.at(Type::Atomic);
     374                                                mangleName += Encoding::qualifiers.at(Type::Atomic);
    374375                                        } // if
    375376                                }
    376377                                if ( type->get_mutex() ) {
    377                                         mangleName << Encoding::qualifiers.at(Type::Mutex);
     378                                        mangleName += Encoding::qualifiers.at(Type::Mutex);
    378379                                } // if
    379380                                if ( inFunctionType ) {
     
    383384                                }
    384385                        }
    385                 }       // namespace
     386                } // namespace
    386387        } // namespace Mangler
    387388} // namespace SymTab
     
    417418                        void postvisit( const ast::QualifiedType * qualType );
    418419
    419                         std::string get_mangleName() { return mangleName.str(); }
     420                        std::string get_mangleName() { return mangleName; }
    420421                  private:
    421                         std::ostringstream mangleName;  ///< Mangled name being constructed
     422                        std::string mangleName;         ///< Mangled name being constructed
    422423                        typedef std::map< std::string, std::pair< int, int > > VarMapType;
    423424                        VarMapType varNums;             ///< Map of type variables to indices
     
    437438                  private:
    438439                        void mangleDecl( const ast::DeclWithType *declaration );
    439                         void mangleRef( const ast::ReferenceToType *refType, std::string prefix );
     440                        void mangleRef( const ast::BaseInstType *refType, std::string prefix );
    440441
    441442                        void printQualifiers( const ast::Type *type );
     
    447448                ast::Pass<Mangler_new> mangler( mode );
    448449                maybeAccept( decl, mangler );
    449                 return mangler.pass.get_mangleName();
     450                return mangler.core.get_mangleName();
    450451        }
    451452
     
    470471                                isTopLevel = false;
    471472                        } // if
    472                         mangleName << Encoding::manglePrefix;
     473                        mangleName += Encoding::manglePrefix;
    473474                        const CodeGen::OperatorInfo * opInfo = CodeGen::operatorLookup( decl->name );
    474475                        if ( opInfo ) {
    475                                 mangleName << opInfo->outputName.size() << opInfo->outputName;
     476                                mangleName += std::to_string( opInfo->outputName.size() ) + opInfo->outputName;
    476477                        } else {
    477                                 mangleName << decl->name.size() << decl->name;
     478                                mangleName += std::to_string( decl->name.size() ) + decl->name;
    478479                        } // if
    479480                        maybeAccept( decl->get_type(), *visitor );
     
    482483                                // so they need a different name mangling
    483484                                if ( decl->linkage == ast::Linkage::AutoGen ) {
    484                                         mangleName << Encoding::autogen;
     485                                        mangleName += Encoding::autogen;
    485486                                } else if ( decl->linkage == ast::Linkage::Intrinsic ) {
    486                                         mangleName << Encoding::intrinsic;
     487                                        mangleName += Encoding::intrinsic;
    487488                                } else {
    488489                                        // if we add another kind of overridable function, this has to change
     
    503504                void Mangler_new::postvisit( const ast::VoidType * voidType ) {
    504505                        printQualifiers( voidType );
    505                         mangleName << Encoding::void_t;
     506                        mangleName += Encoding::void_t;
    506507                }
    507508
     
    509510                        printQualifiers( basicType );
    510511                        assertf( basicType->kind < ast::BasicType::NUMBER_OF_BASIC_TYPES, "Unhandled basic type: %d", basicType->kind );
    511                         mangleName << Encoding::basicTypes[ basicType->kind ];
     512                        mangleName += Encoding::basicTypes[ basicType->kind ];
    512513                }
    513514
     
    515516                        printQualifiers( pointerType );
    516517                        // mangle void (*f)() and void f() to the same name to prevent overloading on functions and function pointers
    517                         if ( ! pointerType->base.as<ast::FunctionType>() ) mangleName << Encoding::pointer;
     518                        if ( ! pointerType->base.as<ast::FunctionType>() ) mangleName += Encoding::pointer;
    518519                        maybe_accept( pointerType->base.get(), *visitor );
    519520                }
     
    522523                        // TODO: encode dimension
    523524                        printQualifiers( arrayType );
    524                         mangleName << Encoding::array << "0";
     525                        mangleName += Encoding::array + "0";
    525526                        maybeAccept( arrayType->base.get(), *visitor );
    526527                }
     
    545546                void Mangler_new::postvisit( const ast::FunctionType * functionType ) {
    546547                        printQualifiers( functionType );
    547                         mangleName << Encoding::function;
     548                        mangleName += Encoding::function;
    548549                        // turn on inFunctionType so that printQualifiers does not print most qualifiers for function parameters,
    549550                        // since qualifiers on outermost parameter type do not differentiate function types, e.g.,
     
    551552                        GuardValue( inFunctionType );
    552553                        inFunctionType = true;
    553                         std::vector< ast::ptr< ast::Type > > returnTypes = getTypes( functionType->returns );
    554                         if (returnTypes.empty()) mangleName << Encoding::void_t;
    555                         else accept_each( returnTypes, *visitor );
    556                         mangleName << "_";
    557                         std::vector< ast::ptr< ast::Type > > paramTypes = getTypes( functionType->params );
    558                         accept_each( paramTypes, *visitor );
    559                         mangleName << "_";
    560                 }
    561 
    562                 void Mangler_new::mangleRef( const ast::ReferenceToType * refType, std::string prefix ) {
     554                        if (functionType->returns.empty()) mangleName += Encoding::void_t;
     555                        else accept_each( functionType->returns, *visitor );
     556                        mangleName += "_";
     557                        accept_each( functionType->params, *visitor );
     558                        mangleName += "_";
     559                }
     560
     561                void Mangler_new::mangleRef( const ast::BaseInstType * refType, std::string prefix ) {
    563562                        printQualifiers( refType );
    564563
    565                         mangleName << prefix << refType->name.length() << refType->name;
     564                        mangleName += prefix + std::to_string( refType->name.length() ) + refType->name;
    566565
    567566                        if ( mangleGenericParams ) {
    568567                                if ( ! refType->params.empty() ) {
    569                                         mangleName << "_";
     568                                        mangleName += "_";
    570569                                        for ( const ast::Expr * param : refType->params ) {
    571570                                                auto paramType = dynamic_cast< const ast::TypeExpr * >( param );
     
    573572                                                maybeAccept( paramType->type.get(), *visitor );
    574573                                        }
    575                                         mangleName << "_";
     574                                        mangleName += "_";
    576575                                }
    577576                        }
     
    602601                                // are first found and prefixing with the appropriate encoding for the type class.
    603602                                assertf( varNum->second.second < TypeDecl::NUMBER_OF_KINDS, "Unhandled type variable kind: %d", varNum->second.second );
    604                                 mangleName << Encoding::typeVariables[varNum->second.second] << varNum->second.first;
     603                                mangleName += Encoding::typeVariables[varNum->second.second] + std::to_string( varNum->second.first );
    605604                        } // if
    606605                }
     
    608607                void Mangler_new::postvisit( const ast::TraitInstType * inst ) {
    609608                        printQualifiers( inst );
    610                         mangleName << inst->name.size() << inst->name;
     609                        mangleName += std::to_string( inst->name.size() ) + inst->name;
    611610                }
    612611
    613612                void Mangler_new::postvisit( const ast::TupleType * tupleType ) {
    614613                        printQualifiers( tupleType );
    615                         mangleName << Encoding::tuple << tupleType->types.size();
     614                        mangleName += Encoding::tuple + std::to_string( tupleType->types.size() );
    616615                        accept_each( tupleType->types, *visitor );
    617616                }
     
    620619                        printQualifiers( varArgsType );
    621620                        static const std::string vargs = "__builtin_va_list";
    622                         mangleName << Encoding::type << vargs.size() << vargs;
     621                        mangleName += Encoding::type + std::to_string( vargs.size() ) + vargs;
    623622                }
    624623
    625624                void Mangler_new::postvisit( const ast::ZeroType * ) {
    626                         mangleName << Encoding::zero;
     625                        mangleName += Encoding::zero;
    627626                }
    628627
    629628                void Mangler_new::postvisit( const ast::OneType * ) {
    630                         mangleName << Encoding::one;
     629                        mangleName += Encoding::one;
    631630                }
    632631
     
    636635                                // N marks the start of a qualified type
    637636                                inQualifiedType = true;
    638                                 mangleName << Encoding::qualifiedTypeStart;
     637                                mangleName += Encoding::qualifiedTypeStart;
    639638                        }
    640639                        maybeAccept( qualType->parent.get(), *visitor );
     
    643642                                // E marks the end of a qualified type
    644643                                inQualifiedType = false;
    645                                 mangleName << Encoding::qualifiedTypeEnd;
     644                                mangleName += Encoding::qualifiedTypeEnd;
    646645                        }
    647646                }
     
    655654                        assertf(false, "Mangler_new should not visit typedecl: %s", toCString(decl));
    656655                        assertf( decl->kind < ast::TypeDecl::Kind::NUMBER_OF_KINDS, "Unhandled type variable kind: %d", decl->kind );
    657                         mangleName << Encoding::typeVariables[ decl->kind ] << ( decl->name.length() ) << decl->name;
     656                        mangleName += Encoding::typeVariables[ decl->kind ] + std::to_string( decl->name.length() ) + decl->name;
    658657                }
    659658
     
    667666                        // skip if not including qualifiers
    668667                        if ( typeMode ) return;
    669                         if ( auto ptype = dynamic_cast< const ast::ParameterizedType * >(type) ) {
     668                        if ( auto ptype = dynamic_cast< const ast::FunctionType * >(type) ) {
    670669                                if ( ! ptype->forall.empty() ) {
    671670                                        std::list< std::string > assertionNames;
    672671                                        int dcount = 0, fcount = 0, vcount = 0, acount = 0;
    673                                         mangleName << Encoding::forall;
    674                                         for ( const ast::TypeDecl * decl : ptype->forall ) {
     672                                        mangleName += Encoding::forall;
     673                                        for ( auto & decl : ptype->forall ) {
    675674                                                switch ( decl->kind ) {
    676675                                                case ast::TypeDecl::Kind::Dtype:
     
    687686                                                } // switch
    688687                                                varNums[ decl->name ] = std::make_pair( nextVarNum, (int)decl->kind );
    689                                                 for ( const ast::DeclWithType * assert : decl->assertions ) {
    690                                                         ast::Pass<Mangler_new> sub_mangler(
    691                                                                 mangleOverridable, typeMode, mangleGenericParams, nextVarNum, varNums );
    692                                                         assert->accept( sub_mangler );
    693                                                         assertionNames.push_back( sub_mangler.pass.get_mangleName() );
    694                                                         acount++;
    695                                                 } // for
    696688                                        } // for
    697                                         mangleName << dcount << "_" << fcount << "_" << vcount << "_" << acount << "_";
    698                                         std::copy( assertionNames.begin(), assertionNames.end(), std::ostream_iterator< std::string >( mangleName, "" ) );
    699                                         mangleName << "_";
     689                                        for ( auto & assert : ptype->assertions ) {
     690                                                ast::Pass<Mangler_new> sub_mangler(
     691                                                        mangleOverridable, typeMode, mangleGenericParams, nextVarNum, varNums );
     692                                                assert->var->accept( sub_mangler );
     693                                                assertionNames.push_back( sub_mangler.core.get_mangleName() );
     694                                                acount++;
     695                                        } // for
     696                                        mangleName += std::to_string( dcount ) + "_" + std::to_string( fcount ) + "_" + std::to_string( vcount ) + "_" + std::to_string( acount ) + "_";
     697                                        for(const auto & a : assertionNames) mangleName += a;
     698//                                      std::copy( assertionNames.begin(), assertionNames.end(), std::ostream_iterator< std::string >( mangleName, "" ) );
     699                                        mangleName += "_";
    700700                                } // if
    701701                        } // if
     
    703703                                // these qualifiers do not distinguish the outermost type of a function parameter
    704704                                if ( type->is_const() ) {
    705                                         mangleName << Encoding::qualifiers.at(Type::Const);
     705                                        mangleName += Encoding::qualifiers.at(Type::Const);
    706706                                } // if
    707707                                if ( type->is_volatile() ) {
    708                                         mangleName << Encoding::qualifiers.at(Type::Volatile);
     708                                        mangleName += Encoding::qualifiers.at(Type::Volatile);
    709709                                } // if
    710710                                // Removed due to restrict not affecting function compatibility in GCC
    711711                                // if ( type->get_isRestrict() ) {
    712                                 //      mangleName << "E";
     712                                //      mangleName += "E";
    713713                                // } // if
    714714                                if ( type->is_atomic() ) {
    715                                         mangleName << Encoding::qualifiers.at(Type::Atomic);
     715                                        mangleName += Encoding::qualifiers.at(Type::Atomic);
    716716                                } // if
    717717                        }
    718718                        if ( type->is_mutex() ) {
    719                                 mangleName << Encoding::qualifiers.at(Type::Mutex);
     719                                mangleName += Encoding::qualifiers.at(Type::Mutex);
    720720                        } // if
    721721                        if ( inFunctionType ) {
Note: See TracChangeset for help on using the changeset viewer.