Changeset d1e0979 for src/SymTab


Ignore:
Timestamp:
Jul 24, 2018, 10:45:59 AM (6 years ago)
Author:
Rob Schluntz <rschlunt@…>
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, no_list, persistent-indexer, pthread-emulation, qualifiedEnum
Children:
3bbd012
Parents:
16a7d84
Message:

Add a basic demangler that works for basic types, pointers, tuples, and functions

Location:
src/SymTab
Files:
3 added
3 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Mangler.cc

    r16a7d84 rd1e0979  
    117117                                        mangleName << declaration->get_name();
    118118                                } // if
    119                                 mangleName << "__";
     119                                mangleName << nameSeparator;
    120120                                maybeAccept( declaration->get_type(), *visitor );
    121121                                if ( mangleOverridable && LinkageSpec::isOverridable( declaration->get_linkage() ) ) {
     
    148148
    149149                        void Mangler::postvisit( BasicType * basicType ) {
    150                                 static const char *btLetter[] = {
    151                                         "b",    // Bool
    152                                         "c",    // Char
    153                                         "Sc",   // SignedChar
    154                                         "Uc",   // UnsignedChar
    155                                         "s",    // ShortSignedInt
    156                                         "Us",   // ShortUnsignedInt
    157                                         "i",    // SignedInt
    158                                         "Ui",   // UnsignedInt
    159                                         "l",    // LongSignedInt
    160                                         "Ul",   // LongUnsignedInt
    161                                         "q",    // LongLongSignedInt
    162                                         "Uq",   // LongLongUnsignedInt
    163                                         "f",    // Float
    164                                         "d",    // Double
    165                                         "r",    // LongDouble
    166                                         "Xf",   // FloatComplex
    167                                         "Xd",   // DoubleComplex
    168                                         "Xr",   // LongDoubleComplex
    169                                         "If",   // FloatImaginary
    170                                         "Id",   // DoubleImaginary
    171                                         "Ir",   // LongDoubleImaginary
    172                                         "w",    // SignedInt128
    173                                         "Uw",   // UnsignedInt128
    174                                         "x",    // Float80
    175                                         "y",    // Float128
    176                                 };
    177                                 static_assert(
    178                                         sizeof(btLetter)/sizeof(btLetter[0]) == BasicType::NUMBER_OF_BASIC_TYPES,
    179                                         "Each basic type kind should have a corresponding mangler letter"
    180                                 );
    181 
    182150                                printQualifiers( basicType );
    183                                 assert( basicType->get_kind() < sizeof(btLetter)/sizeof(btLetter[0]) );
     151                                assert( basicType->get_kind() < numBtLetter );
    184152                                mangleName << btLetter[ basicType->get_kind() ];
    185153                        }
     
    227195                                inFunctionType = true;
    228196                                std::list< Type* > returnTypes = getTypes( functionType->returnVals );
    229                                 acceptAll( returnTypes, *visitor );
     197                                if (returnTypes.empty()) mangleName << "v";
     198                                else acceptAll( returnTypes, *visitor );
    230199                                mangleName << "_";
    231200                                std::list< Type* > paramTypes = getTypes( functionType->parameters );
  • src/SymTab/Mangler.h

    r16a7d84 rd1e0979  
    3333                /// Mangle ignoring generic type parameters
    3434                std::string mangleConcrete( Type* ty );
     35
     36                extern const char *btLetter[];
     37                extern const int numBtLetter;
     38                extern const std::map<int, const char *> qualifierLetter;
     39                extern const std::string nameSeparator;
    3540        } // Mangler
    3641} // SymTab
     42
     43extern "C" {
     44        std::string cforall_demangle(const std::string &);
     45}
    3746
    3847// Local Variables: //
  • src/SymTab/module.mk

    r16a7d84 rd1e0979  
    1717SRC += SymTab/Indexer.cc \
    1818       SymTab/Mangler.cc \
     19       SymTab/ManglerCommon.cc \
    1920       SymTab/Validate.cc \
    2021       SymTab/FixFunction.cc \
Note: See TracChangeset for help on using the changeset viewer.