Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Mangler.cc

    r3f024c9 r1da22500  
    3535                namespace {
    3636                        /// Mangles names to a unique C identifier
    37                         struct Mangler : public WithShortCircuiting, public WithVisitorRef<Mangler>, public WithGuards {
     37                        struct Mangler : public WithShortCircuiting, public WithVisitorRef<Mangler> {
    3838                                Mangler( bool mangleOverridable, bool typeMode, bool mangleGenericParams );
    3939                                Mangler( const Mangler & ) = delete;
     
    5555                                void postvisit( EnumInstType * aggregateUseType );
    5656                                void postvisit( TypeInstType * aggregateUseType );
    57                                 void postvisit( TraitInstType * inst );
    5857                                void postvisit( TupleType * tupleType );
    5958                                void postvisit( VarArgsType * varArgsType );
     
    7170                                bool typeMode;                  ///< Produce a unique mangled name for a type
    7271                                bool mangleGenericParams;       ///< Include generic parameters in name mangling if true
    73                                 bool inFunctionType = false;    ///< Include type qualifiers if false.
    7472
    7573                                void mangleDecl( DeclarationWithType *declaration );
     
    179177                        void Mangler::postvisit( PointerType * pointerType ) {
    180178                                printQualifiers( pointerType );
    181                                 // mangle void (*f)() and void f() to the same name to prevent overloading on functions and function pointers
    182                                 if ( ! dynamic_cast<FunctionType *>( pointerType->base ) ) mangleName << "P";
     179                                mangleName << "P";
    183180                                maybeAccept( pointerType->base, *visitor );
    184181                        }
     
    192189
    193190                        void Mangler::postvisit( ReferenceType * refType ) {
    194                                 // don't print prefix (e.g. 'R') for reference types so that references and non-references do not overload.
    195                                 // Further, do not print the qualifiers for a reference type (but do run printQualifers because of TypeDecls, etc.),
    196                                 // by pretending every reference type is a function parameter.
    197                                 GuardValue( inFunctionType );
    198                                 inFunctionType = true;
    199191                                printQualifiers( refType );
     192                                mangleName << "R";
    200193                                maybeAccept( refType->base, *visitor );
    201194                        }
     
    213206                                printQualifiers( functionType );
    214207                                mangleName << "F";
    215                                 // turn on inFunctionType so that printQualifiers does not print most qualifiers for function parameters,
    216                                 // since qualifiers on outermost parameter type do not differentiate function types, e.g.,
    217                                 // void (*)(const int) and void (*)(int) are the same type, but void (*)(const int *) and void (*)(int *) are different
    218                                 GuardValue( inFunctionType );
    219                                 inFunctionType = true;
    220208                                std::list< Type* > returnTypes = getTypes( functionType->get_returnVals() );
    221209                                acceptAll( returnTypes, *visitor );
     
    282270                        }
    283271
    284                         void Mangler::postvisit( TraitInstType * inst ) {
    285                                 printQualifiers( inst );
    286                                 mangleName << "_Y" << inst->name << "_";
    287                         }
    288 
    289272                        void Mangler::postvisit( TupleType * tupleType ) {
    290273                                printQualifiers( tupleType );
     
    321304                                // skip if not including qualifiers
    322305                                if ( typeMode ) return;
     306
    323307                                if ( ! type->get_forall().empty() ) {
    324308                                        std::list< std::string > assertionNames;
     
    353337                                        mangleName << "_";
    354338                                } // if
    355                                 if ( ! inFunctionType ) {
    356                                         // these qualifiers do not distinguish the outermost type of a function parameter
    357                                         if ( type->get_const() ) {
    358                                                 mangleName << "C";
    359                                         } // if
    360                                         if ( type->get_volatile() ) {
    361                                                 mangleName << "V";
    362                                         } // if
    363                                         // Removed due to restrict not affecting function compatibility in GCC
    364                                         // if ( type->get_isRestrict() ) {
    365                                         //      mangleName << "E";
    366                                         // } // if
    367                                         if ( type->get_atomic() ) {
    368                                                 mangleName << "A";
    369                                         } // if
    370                                 }
     339                                if ( type->get_const() ) {
     340                                        mangleName << "C";
     341                                } // if
     342                                if ( type->get_volatile() ) {
     343                                        mangleName << "V";
     344                                } // if
    371345                                if ( type->get_mutex() ) {
    372346                                        mangleName << "M";
    373347                                } // if
     348                                // Removed due to restrict not affecting function compatibility in GCC
     349                //              if ( type->get_isRestrict() ) {
     350                //                      mangleName << "E";
     351                //              } // if
    374352                                if ( type->get_lvalue() ) {
    375353                                        // mangle based on whether the type is lvalue, so that the resolver can differentiate lvalues and rvalues
    376354                                        mangleName << "L";
    377355                                }
    378 
    379                                 if ( inFunctionType ) {
    380                                         // turn off inFunctionType so that types can be differentiated for nested qualifiers
    381                                         GuardValue( inFunctionType );
    382                                         inFunctionType = false;
    383                                 }
     356                                if ( type->get_atomic() ) {
     357                                        mangleName << "A";
     358                                } // if
    384359                        }
    385360                }       // namespace
Note: See TracChangeset for help on using the changeset viewer.