Changes in src/SymTab/Mangler.cc [c3acf0aa:7cddf77]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Mangler.cc
rc3acf0aa r7cddf77 31 31 32 32 namespace SymTab { 33 std::string Mangler::mangleType( Type * ty ) {33 std::string Mangler::mangleType( Type * ty ) { 34 34 Mangler mangler( false, true ); 35 35 maybeAccept( ty, mangler ); … … 48 48 } 49 49 50 void Mangler::mangleDecl( DeclarationWithType * declaration ) {50 void Mangler::mangleDecl( DeclarationWithType * declaration ) { 51 51 bool wasTopLevel = isTopLevel; 52 52 if ( isTopLevel ) { … … 79 79 } 80 80 81 void Mangler::visit( ObjectDecl * declaration ) {81 void Mangler::visit( ObjectDecl * declaration ) { 82 82 mangleDecl( declaration ); 83 83 } 84 84 85 void Mangler::visit( FunctionDecl * declaration ) {85 void Mangler::visit( FunctionDecl * declaration ) { 86 86 mangleDecl( declaration ); 87 87 } 88 88 89 void Mangler::visit( VoidType * voidType ) {89 void Mangler::visit( VoidType * voidType ) { 90 90 printQualifiers( voidType ); 91 91 mangleName << "v"; 92 92 } 93 93 94 void Mangler::visit( BasicType * basicType ) {94 void Mangler::visit( BasicType * basicType ) { 95 95 static const char *btLetter[] = { 96 96 "b", // Bool … … 121 121 } 122 122 123 void Mangler::visit( PointerType * pointerType ) {123 void Mangler::visit( PointerType * pointerType ) { 124 124 printQualifiers( pointerType ); 125 125 mangleName << "P"; … … 127 127 } 128 128 129 void Mangler::visit( ArrayType * arrayType ) {129 void Mangler::visit( ArrayType * arrayType ) { 130 130 // TODO: encode dimension 131 131 printQualifiers( arrayType ); 132 132 mangleName << "A0"; 133 133 maybeAccept( arrayType->get_base(), *this ); 134 } 135 136 void Mangler::visit( ReferenceType * refType ) { 137 printQualifiers( refType ); 138 mangleName << "R"; 139 maybeAccept( refType->get_base(), *this ); 134 140 } 135 141 … … 143 149 } 144 150 145 void Mangler::visit( FunctionType * functionType ) {151 void Mangler::visit( FunctionType * functionType ) { 146 152 printQualifiers( functionType ); 147 153 mangleName << "F"; … … 154 160 } 155 161 156 void Mangler::mangleRef( ReferenceToType * refType, std::string prefix ) {162 void Mangler::mangleRef( ReferenceToType * refType, std::string prefix ) { 157 163 printQualifiers( refType ); 158 164 … … 160 166 } 161 167 162 void Mangler::mangleGenericRef( ReferenceToType * refType, std::string prefix ) {168 void Mangler::mangleGenericRef( ReferenceToType * refType, std::string prefix ) { 163 169 printQualifiers( refType ); 164 170 … … 183 189 } 184 190 185 void Mangler::visit( StructInstType * aggregateUseType ) {191 void Mangler::visit( StructInstType * aggregateUseType ) { 186 192 if ( typeMode ) mangleGenericRef( aggregateUseType, "s" ); 187 193 else mangleRef( aggregateUseType, "s" ); 188 194 } 189 195 190 void Mangler::visit( UnionInstType * aggregateUseType ) {196 void Mangler::visit( UnionInstType * aggregateUseType ) { 191 197 if ( typeMode ) mangleGenericRef( aggregateUseType, "u" ); 192 198 else mangleRef( aggregateUseType, "u" ); 193 199 } 194 200 195 void Mangler::visit( EnumInstType * aggregateUseType ) {201 void Mangler::visit( EnumInstType * aggregateUseType ) { 196 202 mangleRef( aggregateUseType, "e" ); 197 203 } 198 204 199 void Mangler::visit( TypeInstType * typeInst ) {205 void Mangler::visit( TypeInstType * typeInst ) { 200 206 VarMapType::iterator varNum = varNums.find( typeInst->get_name() ); 201 207 if ( varNum == varNums.end() ) { … … 225 231 } 226 232 227 void Mangler::visit( TupleType * tupleType ) {233 void Mangler::visit( TupleType * tupleType ) { 228 234 printQualifiers( tupleType ); 229 235 mangleName << "T"; 230 acceptAll( tupleType-> get_types(), *this );236 acceptAll( tupleType->types, *this ); 231 237 mangleName << "_"; 232 238 } 233 239 234 void Mangler::visit( VarArgsType * varArgsType ) {240 void Mangler::visit( VarArgsType * varArgsType ) { 235 241 printQualifiers( varArgsType ); 236 242 mangleName << "VARGS"; 237 243 } 238 244 239 void Mangler::visit( __attribute__((unused)) ZeroType *zeroType) {245 void Mangler::visit( ZeroType * ) { 240 246 mangleName << "Z"; 241 247 } 242 248 243 void Mangler::visit( __attribute__((unused)) OneType *oneType) {249 void Mangler::visit( OneType * ) { 244 250 mangleName << "O"; 245 251 } 246 252 247 void Mangler::visit( TypeDecl * decl ) {253 void Mangler::visit( TypeDecl * decl ) { 248 254 static const char *typePrefix[] = { "BT", "BD", "BF" }; 249 mangleName << typePrefix[ decl->get_kind() ] << ( decl-> get_name().length() + 1 ) << decl->get_name();255 mangleName << typePrefix[ decl->get_kind() ] << ( decl->name.length() + 1 ) << decl->name; 250 256 } 251 257 … … 256 262 } 257 263 258 void Mangler::printQualifiers( Type * type ) {264 void Mangler::printQualifiers( Type * type ) { 259 265 // skip if not including qualifiers 260 266 if ( typeMode ) return; … … 264 270 int tcount = 0, dcount = 0, fcount = 0, vcount = 0; 265 271 mangleName << "A"; 266 for ( Type::ForallList::iterator i = type-> get_forall().begin(); i != type->get_forall().end(); ++i ) {272 for ( Type::ForallList::iterator i = type->forall.begin(); i != type->forall.end(); ++i ) { 267 273 switch ( (*i)->get_kind() ) { 268 274 case TypeDecl::Any: … … 281 287 assert( false ); 282 288 } // switch 283 varNums[ (*i )->get_name() ] = std::pair< int, int >( nextVarNum++, (int )(*i)->get_kind() );284 for ( std::list< DeclarationWithType* >::iterator assert = (*i )->get_assertions().begin(); assert != (*i )->get_assertions().end(); ++assert ) {289 varNums[ (*i)->name ] = std::pair< int, int >( nextVarNum++, (int)(*i)->get_kind() ); 290 for ( std::list< DeclarationWithType* >::iterator assert = (*i)->assertions.begin(); assert != (*i)->assertions.end(); ++assert ) { 285 291 Mangler sub_mangler( mangleOverridable, typeMode ); 286 292 sub_mangler.nextVarNum = nextVarNum; … … 303 309 // Removed due to restrict not affecting function compatibility in GCC 304 310 // if ( type->get_isRestrict() ) { 305 // mangleName << " R";311 // mangleName << "E"; 306 312 // } // if 307 313 if ( type->get_lvalue() ) { 314 // mangle based on whether the type is lvalue, so that the resolver can differentiate lvalues and rvalues 308 315 mangleName << "L"; 309 } // if316 } 310 317 if ( type->get_atomic() ) { 311 318 mangleName << "A";
Note: See TracChangeset
for help on using the changeset viewer.