Changeset 3f7e12cb for src/SymTab/Mangler.cc
- Timestamp:
- Nov 8, 2017, 5:43:33 PM (8 years ago)
- 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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Mangler.cc
r78315272 r3f7e12cb 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:40:29 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Wed Jun 28 15:31:00201713 // Update Count : 2 111 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Sep 25 15:49:26 2017 13 // Update Count : 23 14 14 // 15 15 #include "Mangler.h" … … 31 31 32 32 namespace 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 ); 35 35 maybeAccept( ty, mangler ); 36 36 return mangler.get_mangleName(); 37 37 } 38 38 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 ) {} 41 47 42 48 Mangler::Mangler( const Mangler &rhs ) : mangleName() { … … 48 54 } 49 55 50 void Mangler::mangleDecl( DeclarationWithType * declaration ) {56 void Mangler::mangleDecl( DeclarationWithType * declaration ) { 51 57 bool wasTopLevel = isTopLevel; 52 58 if ( isTopLevel ) { … … 79 85 } 80 86 81 void Mangler::visit( ObjectDecl * declaration ) {87 void Mangler::visit( ObjectDecl * declaration ) { 82 88 mangleDecl( declaration ); 83 89 } 84 90 85 void Mangler::visit( FunctionDecl * declaration ) {91 void Mangler::visit( FunctionDecl * declaration ) { 86 92 mangleDecl( declaration ); 87 93 } 88 94 89 void Mangler::visit( VoidType * voidType ) {95 void Mangler::visit( VoidType * voidType ) { 90 96 printQualifiers( voidType ); 91 97 mangleName << "v"; 92 98 } 93 99 94 void Mangler::visit( BasicType * basicType ) {100 void Mangler::visit( BasicType * basicType ) { 95 101 static const char *btLetter[] = { 96 102 "b", // Bool … … 115 121 "Id", // DoubleImaginary 116 122 "Ir", // LongDoubleImaginary 123 "w", // SignedInt128 124 "Uw", // UnsignedInt128 117 125 }; 118 126 … … 121 129 } 122 130 123 void Mangler::visit( PointerType * pointerType ) {131 void Mangler::visit( PointerType * pointerType ) { 124 132 printQualifiers( pointerType ); 125 133 mangleName << "P"; … … 127 135 } 128 136 129 void Mangler::visit( ArrayType * arrayType ) {137 void Mangler::visit( ArrayType * arrayType ) { 130 138 // TODO: encode dimension 131 139 printQualifiers( arrayType ); … … 134 142 } 135 143 136 void Mangler::visit( ReferenceType * refType ) {144 void Mangler::visit( ReferenceType * refType ) { 137 145 printQualifiers( refType ); 138 146 mangleName << "R"; … … 149 157 } 150 158 151 void Mangler::visit( FunctionType * functionType ) {159 void Mangler::visit( FunctionType * functionType ) { 152 160 printQualifiers( functionType ); 153 161 mangleName << "F"; … … 160 168 } 161 169 162 void Mangler::mangleRef( ReferenceToType * refType, std::string prefix ) {170 void Mangler::mangleRef( ReferenceToType * refType, std::string prefix ) { 163 171 printQualifiers( refType ); 164 172 165 173 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 << "_"; 183 185 } 184 mangleName << "_";185 186 } 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 ) { 202 198 mangleRef( aggregateUseType, "e" ); 203 199 } 204 200 205 void Mangler::visit( TypeInstType * typeInst ) {201 void Mangler::visit( TypeInstType * typeInst ) { 206 202 VarMapType::iterator varNum = varNums.find( typeInst->get_name() ); 207 203 if ( varNum == varNums.end() ) { … … 212 208 numStream << varNum->second.first; 213 209 switch ( (TypeDecl::Kind )varNum->second.second ) { 214 case TypeDecl::Any:215 mangleName << "t";216 break;217 210 case TypeDecl::Dtype: 218 211 mangleName << "d"; … … 231 224 } 232 225 233 void Mangler::visit( TupleType * tupleType ) {226 void Mangler::visit( TupleType * tupleType ) { 234 227 printQualifiers( tupleType ); 235 228 mangleName << "T"; 236 acceptAll( tupleType-> get_types(), *this );229 acceptAll( tupleType->types, *this ); 237 230 mangleName << "_"; 238 231 } 239 232 240 void Mangler::visit( VarArgsType * varArgsType ) {233 void Mangler::visit( VarArgsType * varArgsType ) { 241 234 printQualifiers( varArgsType ); 242 235 mangleName << "VARGS"; 243 236 } 244 237 245 void Mangler::visit( __attribute__((unused)) ZeroType *zeroType) {238 void Mangler::visit( ZeroType * ) { 246 239 mangleName << "Z"; 247 240 } 248 241 249 void Mangler::visit( __attribute__((unused)) OneType *oneType) {242 void Mangler::visit( OneType * ) { 250 243 mangleName << "O"; 251 244 } 252 245 253 void Mangler::visit( TypeDecl * decl ) {246 void Mangler::visit( TypeDecl * decl ) { 254 247 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; 256 249 } 257 250 … … 262 255 } 263 256 264 void Mangler::printQualifiers( Type * type ) {257 void Mangler::printQualifiers( Type * type ) { 265 258 // skip if not including qualifiers 266 259 if ( typeMode ) return; … … 270 263 int tcount = 0, dcount = 0, fcount = 0, vcount = 0; 271 264 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 ) { 273 266 switch ( (*i)->get_kind() ) { 274 case TypeDecl::Any:275 tcount++;276 break;277 267 case TypeDecl::Dtype: 278 268 dcount++; … … 287 277 assert( false ); 288 278 } // 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 ); 292 282 sub_mangler.nextVarNum = nextVarNum; 293 283 sub_mangler.isTopLevel = false; … … 307 297 mangleName << "V"; 308 298 } // if 299 if ( type->get_mutex() ) { 300 mangleName << "M"; 301 } // if 309 302 // Removed due to restrict not affecting function compatibility in GCC 310 303 // if ( type->get_isRestrict() ) { … … 312 305 // } // if 313 306 if ( type->get_lvalue() ) { 307 // mangle based on whether the type is lvalue, so that the resolver can differentiate lvalues and rvalues 314 308 mangleName << "L"; 315 } // if309 } 316 310 if ( type->get_atomic() ) { 317 311 mangleName << "A";
Note:
See TracChangeset
for help on using the changeset viewer.