Changes in src/SymTab/Mangler.cc [c3acf0aa:e35f30a]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Mangler.cc
rc3acf0aa re35f30a 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 ); 132 140 mangleName << "A0"; 133 141 maybeAccept( arrayType->get_base(), *this ); 142 } 143 144 void Mangler::visit( ReferenceType * refType ) { 145 printQualifiers( refType ); 146 mangleName << "R"; 147 maybeAccept( refType->get_base(), *this ); 134 148 } 135 149 … … 143 157 } 144 158 145 void Mangler::visit( FunctionType * functionType ) {159 void Mangler::visit( FunctionType * functionType ) { 146 160 printQualifiers( functionType ); 147 161 mangleName << "F"; … … 154 168 } 155 169 156 void Mangler::mangleRef( ReferenceToType * refType, std::string prefix ) {170 void Mangler::mangleRef( ReferenceToType * refType, std::string prefix ) { 157 171 printQualifiers( refType ); 158 172 159 173 mangleName << ( refType->get_name().length() + prefix.length() ) << prefix << refType->get_name(); 160 } 161 162 void Mangler::mangleGenericRef( ReferenceToType *refType, std::string prefix ) { 163 printQualifiers( refType ); 164 165 std::ostringstream oldName( mangleName.str() ); 166 mangleName.clear(); 167 168 mangleName << prefix << refType->get_name(); 169 170 std::list< Expression* >& params = refType->get_parameters(); 171 if ( ! params.empty() ) { 172 mangleName << "_"; 173 for ( std::list< Expression* >::const_iterator param = params.begin(); param != params.end(); ++param ) { 174 TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param ); 175 assertf(paramType, "Aggregate parameters should be type expressions: %s", toString(*param).c_str()); 176 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 << "_"; 177 185 } 178 mangleName << "_";179 186 } 180 181 oldName << mangleName.str().length() << mangleName.str(); 182 mangleName.str( oldName.str() ); 183 } 184 185 void Mangler::visit( StructInstType *aggregateUseType ) { 186 if ( typeMode ) mangleGenericRef( aggregateUseType, "s" ); 187 else mangleRef( aggregateUseType, "s" ); 188 } 189 190 void Mangler::visit( UnionInstType *aggregateUseType ) { 191 if ( typeMode ) mangleGenericRef( aggregateUseType, "u" ); 192 else mangleRef( aggregateUseType, "u" ); 193 } 194 195 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 ) { 196 198 mangleRef( aggregateUseType, "e" ); 197 199 } 198 200 199 void Mangler::visit( TypeInstType * typeInst ) {201 void Mangler::visit( TypeInstType * typeInst ) { 200 202 VarMapType::iterator varNum = varNums.find( typeInst->get_name() ); 201 203 if ( varNum == varNums.end() ) { … … 206 208 numStream << varNum->second.first; 207 209 switch ( (TypeDecl::Kind )varNum->second.second ) { 208 case TypeDecl::Any:209 mangleName << "t";210 break;211 210 case TypeDecl::Dtype: 212 211 mangleName << "d"; … … 225 224 } 226 225 227 void Mangler::visit( TupleType * tupleType ) {226 void Mangler::visit( TupleType * tupleType ) { 228 227 printQualifiers( tupleType ); 229 228 mangleName << "T"; 230 acceptAll( tupleType-> get_types(), *this );229 acceptAll( tupleType->types, *this ); 231 230 mangleName << "_"; 232 231 } 233 232 234 void Mangler::visit( VarArgsType * varArgsType ) {233 void Mangler::visit( VarArgsType * varArgsType ) { 235 234 printQualifiers( varArgsType ); 236 235 mangleName << "VARGS"; 237 236 } 238 237 239 void Mangler::visit( __attribute__((unused)) ZeroType *zeroType) {238 void Mangler::visit( ZeroType * ) { 240 239 mangleName << "Z"; 241 240 } 242 241 243 void Mangler::visit( __attribute__((unused)) OneType *oneType) {242 void Mangler::visit( OneType * ) { 244 243 mangleName << "O"; 245 244 } 246 245 247 void Mangler::visit( TypeDecl * decl ) {246 void Mangler::visit( TypeDecl * decl ) { 248 247 static const char *typePrefix[] = { "BT", "BD", "BF" }; 249 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; 250 249 } 251 250 … … 256 255 } 257 256 258 void Mangler::printQualifiers( Type * type ) {257 void Mangler::printQualifiers( Type * type ) { 259 258 // skip if not including qualifiers 260 259 if ( typeMode ) return; … … 264 263 int tcount = 0, dcount = 0, fcount = 0, vcount = 0; 265 264 mangleName << "A"; 266 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 ) { 267 266 switch ( (*i)->get_kind() ) { 268 case TypeDecl::Any:269 tcount++;270 break;271 267 case TypeDecl::Dtype: 272 268 dcount++; … … 281 277 assert( false ); 282 278 } // 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 ) {285 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 ); 286 282 sub_mangler.nextVarNum = nextVarNum; 287 283 sub_mangler.isTopLevel = false; … … 301 297 mangleName << "V"; 302 298 } // if 299 if ( type->get_mutex() ) { 300 mangleName << "M"; 301 } // if 303 302 // Removed due to restrict not affecting function compatibility in GCC 304 303 // if ( type->get_isRestrict() ) { 305 // mangleName << " R";304 // mangleName << "E"; 306 305 // } // if 307 306 if ( type->get_lvalue() ) { 307 // mangle based on whether the type is lvalue, so that the resolver can differentiate lvalues and rvalues 308 308 mangleName << "L"; 309 } // if309 } 310 310 if ( type->get_atomic() ) { 311 311 mangleName << "A";
Note:
See TracChangeset
for help on using the changeset viewer.