Ignore:
Timestamp:
Nov 8, 2017, 5:43:33 PM (8 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
954908d
Parents:
78315272 (diff), e35f30a (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' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Mangler.cc

    r78315272 r3f7e12cb  
    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 );
     
    134142        }
    135143
    136         void Mangler::visit( ReferenceType *refType ) {
     144        void Mangler::visit( ReferenceType * refType ) {
    137145                printQualifiers( refType );
    138146                mangleName << "R";
     
    149157        }
    150158
    151         void Mangler::visit( FunctionType *functionType ) {
     159        void Mangler::visit( FunctionType * functionType ) {
    152160                printQualifiers( functionType );
    153161                mangleName << "F";
     
    160168        }
    161169
    162         void Mangler::mangleRef( ReferenceToType *refType, std::string prefix ) {
     170        void Mangler::mangleRef( ReferenceToType * refType, std::string prefix ) {
    163171                printQualifiers( refType );
    164172
    165173                mangleName << ( refType->get_name().length() + prefix.length() ) << prefix << refType->get_name();
    166         }
    167 
    168         void Mangler::mangleGenericRef( ReferenceToType *refType, std::string prefix ) {
    169                 printQualifiers( refType );
    170 
    171                 std::ostringstream oldName( mangleName.str() );
    172                 mangleName.clear();
    173 
    174                 mangleName << prefix << refType->get_name();
    175 
    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 );
     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 << "_";
    183185                        }
    184                         mangleName << "_";
    185186                }
    186 
    187                 oldName << mangleName.str().length() << mangleName.str();
    188                 mangleName.str( oldName.str() );
    189         }
    190 
    191         void Mangler::visit( StructInstType *aggregateUseType ) {
    192                 if ( typeMode ) mangleGenericRef( aggregateUseType, "s" );
    193                 else mangleRef( aggregateUseType, "s" );
    194         }
    195 
    196         void Mangler::visit( UnionInstType *aggregateUseType ) {
    197                 if ( typeMode ) mangleGenericRef( aggregateUseType, "u" );
    198                 else mangleRef( aggregateUseType, "u" );
    199         }
    200 
    201         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 ) {
    202198                mangleRef( aggregateUseType, "e" );
    203199        }
    204200
    205         void Mangler::visit( TypeInstType *typeInst ) {
     201        void Mangler::visit( TypeInstType * typeInst ) {
    206202                VarMapType::iterator varNum = varNums.find( typeInst->get_name() );
    207203                if ( varNum == varNums.end() ) {
     
    212208                        numStream << varNum->second.first;
    213209                        switch ( (TypeDecl::Kind )varNum->second.second ) {
    214                           case TypeDecl::Any:
    215                                 mangleName << "t";
    216                                 break;
    217210                          case TypeDecl::Dtype:
    218211                                mangleName << "d";
     
    231224        }
    232225
    233         void Mangler::visit( TupleType *tupleType ) {
     226        void Mangler::visit( TupleType * tupleType ) {
    234227                printQualifiers( tupleType );
    235228                mangleName << "T";
    236                 acceptAll( tupleType->get_types(), *this );
     229                acceptAll( tupleType->types, *this );
    237230                mangleName << "_";
    238231        }
    239232
    240         void Mangler::visit( VarArgsType *varArgsType ) {
     233        void Mangler::visit( VarArgsType * varArgsType ) {
    241234                printQualifiers( varArgsType );
    242235                mangleName << "VARGS";
    243236        }
    244237
    245         void Mangler::visit( __attribute__((unused)) ZeroType *zeroType ) {
     238        void Mangler::visit( ZeroType * ) {
    246239                mangleName << "Z";
    247240        }
    248241
    249         void Mangler::visit( __attribute__((unused)) OneType *oneType ) {
     242        void Mangler::visit( OneType * ) {
    250243                mangleName << "O";
    251244        }
    252245
    253         void Mangler::visit( TypeDecl *decl ) {
     246        void Mangler::visit( TypeDecl * decl ) {
    254247                static const char *typePrefix[] = { "BT", "BD", "BF" };
    255                 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;
    256249        }
    257250
     
    262255        }
    263256
    264         void Mangler::printQualifiers( Type *type ) {
     257        void Mangler::printQualifiers( Type * type ) {
    265258                // skip if not including qualifiers
    266259                if ( typeMode ) return;
     
    270263                        int tcount = 0, dcount = 0, fcount = 0, vcount = 0;
    271264                        mangleName << "A";
    272                         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 ) {
    273266                                switch ( (*i)->get_kind() ) {
    274                                   case TypeDecl::Any:
    275                                         tcount++;
    276                                         break;
    277267                                  case TypeDecl::Dtype:
    278268                                        dcount++;
     
    287277                                        assert( false );
    288278                                } // switch
    289                                 varNums[ (*i )->get_name() ] = std::pair< int, int >( nextVarNum++, (int )(*i )->get_kind() );
    290                                 for ( std::list< DeclarationWithType* >::iterator assert = (*i )->get_assertions().begin(); assert != (*i )->get_assertions().end(); ++assert ) {
    291                                         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 );
    292282                                        sub_mangler.nextVarNum = nextVarNum;
    293283                                        sub_mangler.isTopLevel = false;
     
    307297                        mangleName << "V";
    308298                } // if
     299                if ( type->get_mutex() ) {
     300                        mangleName << "M";
     301                } // if
    309302                // Removed due to restrict not affecting function compatibility in GCC
    310303//              if ( type->get_isRestrict() ) {
     
    312305//              } // if
    313306                if ( type->get_lvalue() ) {
     307                        // mangle based on whether the type is lvalue, so that the resolver can differentiate lvalues and rvalues
    314308                        mangleName << "L";
    315                 } // if
     309                }
    316310                if ( type->get_atomic() ) {
    317311                        mangleName << "A";
Note: See TracChangeset for help on using the changeset viewer.