Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Mangler.cc

    rc3acf0aa re35f30a  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 21:40:29 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Jun 28 15:31:00 2017
    13 // Update Count     : 21
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Mon Sep 25 15:49:26 2017
     13// Update Count     : 23
    1414//
    1515#include "Mangler.h"
     
    3131
    3232namespace SymTab {
    33         std::string Mangler::mangleType( Type *ty ) {
    34                 Mangler mangler( false, true );
     33        std::string Mangler::mangleType( Type * ty ) {
     34                Mangler mangler( false, true, true );
    3535                maybeAccept( ty, mangler );
    3636                return mangler.get_mangleName();
    3737        }
    3838
    39         Mangler::Mangler( bool mangleOverridable, bool typeMode )
    40                 : nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ), typeMode( typeMode ) {}
     39        std::string Mangler::mangleConcrete( Type* ty ) {
     40                Mangler mangler( false, false, false );
     41                maybeAccept( ty, mangler );
     42                return mangler.get_mangleName();
     43        }
     44
     45        Mangler::Mangler( bool mangleOverridable, bool typeMode, bool mangleGenericParams )
     46                : nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ), typeMode( typeMode ), mangleGenericParams( mangleGenericParams ) {}
    4147
    4248        Mangler::Mangler( const Mangler &rhs ) : mangleName() {
     
    4854        }
    4955
    50         void Mangler::mangleDecl( DeclarationWithType *declaration ) {
     56        void Mangler::mangleDecl( DeclarationWithType * declaration ) {
    5157                bool wasTopLevel = isTopLevel;
    5258                if ( isTopLevel ) {
     
    7985        }
    8086
    81         void Mangler::visit( ObjectDecl *declaration ) {
     87        void Mangler::visit( ObjectDecl * declaration ) {
    8288                mangleDecl( declaration );
    8389        }
    8490
    85         void Mangler::visit( FunctionDecl *declaration ) {
     91        void Mangler::visit( FunctionDecl * declaration ) {
    8692                mangleDecl( declaration );
    8793        }
    8894
    89         void Mangler::visit( VoidType *voidType ) {
     95        void Mangler::visit( VoidType * voidType ) {
    9096                printQualifiers( voidType );
    9197                mangleName << "v";
    9298        }
    9399
    94         void Mangler::visit( BasicType *basicType ) {
     100        void Mangler::visit( BasicType * basicType ) {
    95101                static const char *btLetter[] = {
    96102                        "b",    // Bool
     
    115121                        "Id",   // DoubleImaginary
    116122                        "Ir",   // LongDoubleImaginary
     123                        "w",    // SignedInt128
     124                        "Uw",   // UnsignedInt128
    117125                };
    118126
     
    121129        }
    122130
    123         void Mangler::visit( PointerType *pointerType ) {
     131        void Mangler::visit( PointerType * pointerType ) {
    124132                printQualifiers( pointerType );
    125133                mangleName << "P";
     
    127135        }
    128136
    129         void Mangler::visit( ArrayType *arrayType ) {
     137        void Mangler::visit( ArrayType * arrayType ) {
    130138                // TODO: encode dimension
    131139                printQualifiers( arrayType );
    132140                mangleName << "A0";
    133141                maybeAccept( arrayType->get_base(), *this );
     142        }
     143
     144        void Mangler::visit( ReferenceType * refType ) {
     145                printQualifiers( refType );
     146                mangleName << "R";
     147                maybeAccept( refType->get_base(), *this );
    134148        }
    135149
     
    143157        }
    144158
    145         void Mangler::visit( FunctionType *functionType ) {
     159        void Mangler::visit( FunctionType * functionType ) {
    146160                printQualifiers( functionType );
    147161                mangleName << "F";
     
    154168        }
    155169
    156         void Mangler::mangleRef( ReferenceToType *refType, std::string prefix ) {
     170        void Mangler::mangleRef( ReferenceToType * refType, std::string prefix ) {
    157171                printQualifiers( refType );
    158172
    159173                mangleName << ( refType->get_name().length() + prefix.length() ) << prefix << refType->get_name();
    160         }
    161 
    162         void Mangler::mangleGenericRef( ReferenceToType *refType, std::string prefix ) {
    163                 printQualifiers( refType );
    164 
    165                 std::ostringstream oldName( mangleName.str() );
    166                 mangleName.clear();
    167 
    168                 mangleName << prefix << refType->get_name();
    169 
    170                 std::list< Expression* >& params = refType->get_parameters();
    171                 if ( ! params.empty() ) {
    172                         mangleName << "_";
    173                         for ( std::list< Expression* >::const_iterator param = params.begin(); param != params.end(); ++param ) {
    174                                 TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param );
    175                                 assertf(paramType, "Aggregate parameters should be type expressions: %s", toString(*param).c_str());
    176                                 maybeAccept( paramType->get_type(), *this );
     174
     175                if ( mangleGenericParams ) {
     176                        std::list< Expression* >& params = refType->get_parameters();
     177                        if ( ! params.empty() ) {
     178                                mangleName << "_";
     179                                for ( std::list< Expression* >::const_iterator param = params.begin(); param != params.end(); ++param ) {
     180                                        TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param );
     181                                        assertf(paramType, "Aggregate parameters should be type expressions: %s", toString(*param).c_str());
     182                                        maybeAccept( paramType->get_type(), *this );
     183                                }
     184                                mangleName << "_";
    177185                        }
    178                         mangleName << "_";
    179186                }
    180 
    181                 oldName << mangleName.str().length() << mangleName.str();
    182                 mangleName.str( oldName.str() );
    183         }
    184 
    185         void Mangler::visit( StructInstType *aggregateUseType ) {
    186                 if ( typeMode ) mangleGenericRef( aggregateUseType, "s" );
    187                 else mangleRef( aggregateUseType, "s" );
    188         }
    189 
    190         void Mangler::visit( UnionInstType *aggregateUseType ) {
    191                 if ( typeMode ) mangleGenericRef( aggregateUseType, "u" );
    192                 else mangleRef( aggregateUseType, "u" );
    193         }
    194 
    195         void Mangler::visit( EnumInstType *aggregateUseType ) {
     187        }
     188
     189        void Mangler::visit( StructInstType * aggregateUseType ) {
     190                mangleRef( aggregateUseType, "s" );
     191        }
     192
     193        void Mangler::visit( UnionInstType * aggregateUseType ) {
     194                mangleRef( aggregateUseType, "u" );
     195        }
     196
     197        void Mangler::visit( EnumInstType * aggregateUseType ) {
    196198                mangleRef( aggregateUseType, "e" );
    197199        }
    198200
    199         void Mangler::visit( TypeInstType *typeInst ) {
     201        void Mangler::visit( TypeInstType * typeInst ) {
    200202                VarMapType::iterator varNum = varNums.find( typeInst->get_name() );
    201203                if ( varNum == varNums.end() ) {
     
    206208                        numStream << varNum->second.first;
    207209                        switch ( (TypeDecl::Kind )varNum->second.second ) {
    208                           case TypeDecl::Any:
    209                                 mangleName << "t";
    210                                 break;
    211210                          case TypeDecl::Dtype:
    212211                                mangleName << "d";
     
    225224        }
    226225
    227         void Mangler::visit( TupleType *tupleType ) {
     226        void Mangler::visit( TupleType * tupleType ) {
    228227                printQualifiers( tupleType );
    229228                mangleName << "T";
    230                 acceptAll( tupleType->get_types(), *this );
     229                acceptAll( tupleType->types, *this );
    231230                mangleName << "_";
    232231        }
    233232
    234         void Mangler::visit( VarArgsType *varArgsType ) {
     233        void Mangler::visit( VarArgsType * varArgsType ) {
    235234                printQualifiers( varArgsType );
    236235                mangleName << "VARGS";
    237236        }
    238237
    239         void Mangler::visit( __attribute__((unused)) ZeroType *zeroType ) {
     238        void Mangler::visit( ZeroType * ) {
    240239                mangleName << "Z";
    241240        }
    242241
    243         void Mangler::visit( __attribute__((unused)) OneType *oneType ) {
     242        void Mangler::visit( OneType * ) {
    244243                mangleName << "O";
    245244        }
    246245
    247         void Mangler::visit( TypeDecl *decl ) {
     246        void Mangler::visit( TypeDecl * decl ) {
    248247                static const char *typePrefix[] = { "BT", "BD", "BF" };
    249                 mangleName << typePrefix[ decl->get_kind() ] << ( decl->get_name().length() + 1 ) << decl->get_name();
     248                mangleName << typePrefix[ decl->get_kind() ] << ( decl->name.length() + 1 ) << decl->name;
    250249        }
    251250
     
    256255        }
    257256
    258         void Mangler::printQualifiers( Type *type ) {
     257        void Mangler::printQualifiers( Type * type ) {
    259258                // skip if not including qualifiers
    260259                if ( typeMode ) return;
     
    264263                        int tcount = 0, dcount = 0, fcount = 0, vcount = 0;
    265264                        mangleName << "A";
    266                         for ( Type::ForallList::iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) {
     265                        for ( Type::ForallList::iterator i = type->forall.begin(); i != type->forall.end(); ++i ) {
    267266                                switch ( (*i)->get_kind() ) {
    268                                   case TypeDecl::Any:
    269                                         tcount++;
    270                                         break;
    271267                                  case TypeDecl::Dtype:
    272268                                        dcount++;
     
    281277                                        assert( false );
    282278                                } // switch
    283                                 varNums[ (*i )->get_name() ] = std::pair< int, int >( nextVarNum++, (int )(*i )->get_kind() );
    284                                 for ( std::list< DeclarationWithType* >::iterator assert = (*i )->get_assertions().begin(); assert != (*i )->get_assertions().end(); ++assert ) {
    285                                         Mangler sub_mangler( mangleOverridable, typeMode );
     279                                varNums[ (*i)->name ] = std::pair< int, int >( nextVarNum++, (int)(*i)->get_kind() );
     280                                for ( std::list< DeclarationWithType* >::iterator assert = (*i)->assertions.begin(); assert != (*i)->assertions.end(); ++assert ) {
     281                                        Mangler sub_mangler( mangleOverridable, typeMode, mangleGenericParams );
    286282                                        sub_mangler.nextVarNum = nextVarNum;
    287283                                        sub_mangler.isTopLevel = false;
     
    301297                        mangleName << "V";
    302298                } // if
     299                if ( type->get_mutex() ) {
     300                        mangleName << "M";
     301                } // if
    303302                // Removed due to restrict not affecting function compatibility in GCC
    304303//              if ( type->get_isRestrict() ) {
    305 //                      mangleName << "R";
     304//                      mangleName << "E";
    306305//              } // if
    307306                if ( type->get_lvalue() ) {
     307                        // mangle based on whether the type is lvalue, so that the resolver can differentiate lvalues and rvalues
    308308                        mangleName << "L";
    309                 } // if
     309                }
    310310                if ( type->get_atomic() ) {
    311311                        mangleName << "A";
Note: See TracChangeset for help on using the changeset viewer.