Ignore:
Timestamp:
May 22, 2018, 11:08:22 AM (6 years ago)
Author:
Thierry Delisle <tdelisle@…>
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, with_gc
Children:
639991a
Parents:
4a333d35 (diff), 2f0a0678 (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

    r4a333d35 rcac8a6e  
    3535                namespace {
    3636                        /// Mangles names to a unique C identifier
    37                         struct Mangler : public WithShortCircuiting, public WithVisitorRef<Mangler> {
     37                        struct Mangler : public WithShortCircuiting, public WithVisitorRef<Mangler>, public WithGuards {
    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 );
    5758                                void postvisit( TupleType * tupleType );
    5859                                void postvisit( VarArgsType * varArgsType );
     
    7071                                bool typeMode;                  ///< Produce a unique mangled name for a type
    7172                                bool mangleGenericParams;       ///< Include generic parameters in name mangling if true
     73                                bool inFunctionType = false;    ///< Include type qualifiers if false.
    7274
    7375                                void mangleDecl( DeclarationWithType *declaration );
     
    177179                        void Mangler::postvisit( PointerType * pointerType ) {
    178180                                printQualifiers( pointerType );
    179                                 mangleName << "P";
     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";
    180183                                maybeAccept( pointerType->base, *visitor );
    181184                        }
     
    189192
    190193                        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;
    191199                                printQualifiers( refType );
    192                                 mangleName << "R";
    193200                                maybeAccept( refType->base, *visitor );
    194201                        }
     
    206213                                printQualifiers( functionType );
    207214                                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;
    208220                                std::list< Type* > returnTypes = getTypes( functionType->get_returnVals() );
    209221                                acceptAll( returnTypes, *visitor );
     
    270282                        }
    271283
     284                        void Mangler::postvisit( TraitInstType * inst ) {
     285                                printQualifiers( inst );
     286                                mangleName << "_Y" << inst->name << "_";
     287                        }
     288
    272289                        void Mangler::postvisit( TupleType * tupleType ) {
    273290                                printQualifiers( tupleType );
     
    304321                                // skip if not including qualifiers
    305322                                if ( typeMode ) return;
    306 
    307323                                if ( ! type->get_forall().empty() ) {
    308324                                        std::list< std::string > assertionNames;
     
    337353                                        mangleName << "_";
    338354                                } // if
    339                                 if ( type->get_const() ) {
    340                                         mangleName << "C";
    341                                 } // if
    342                                 if ( type->get_volatile() ) {
    343                                         mangleName << "V";
    344                                 } // 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                                }
    345371                                if ( type->get_mutex() ) {
    346372                                        mangleName << "M";
    347373                                } // if
    348                                 // Removed due to restrict not affecting function compatibility in GCC
    349                 //              if ( type->get_isRestrict() ) {
    350                 //                      mangleName << "E";
    351                 //              } // if
    352374                                if ( type->get_lvalue() ) {
    353375                                        // mangle based on whether the type is lvalue, so that the resolver can differentiate lvalues and rvalues
    354376                                        mangleName << "L";
    355377                                }
    356                                 if ( type->get_atomic() ) {
    357                                         mangleName << "A";
    358                                 } // if
     378
     379                                if ( inFunctionType ) {
     380                                        // turn off inFunctionType so that types can be differentiated for nested qualifiers
     381                                        GuardValue( inFunctionType );
     382                                        inFunctionType = false;
     383                                }
    359384                        }
    360385                }       // namespace
Note: See TracChangeset for help on using the changeset viewer.