Changes in src/SymTab/Mangler.cc [4aa0858:8884112]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Mangler.cc
r4aa0858 r8884112 30 30 31 31 namespace SymTab { 32 Mangler::Mangler( bool mangleOverridable ) : nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ) { 33 } 34 35 //Mangler::Mangler( const Mangler & ) 36 // : mangleName(), varNums( varNums ), nextVarNum( nextVarNum ), isTopLevel( isTopLevel ) 37 //{ 38 //} 32 std::string Mangler::mangleType( Type *ty ) { 33 Mangler mangler( false, true ); 34 maybeAccept( ty, mangler ); 35 return mangler.get_mangleName(); 36 } 37 38 Mangler::Mangler( bool mangleOverridable, bool typeMode ) 39 : nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ), typeMode( typeMode ) {} 40 39 41 Mangler::Mangler( const Mangler &rhs ) : mangleName() { 40 42 varNums = rhs.varNums; … … 42 44 isTopLevel = rhs.isTopLevel; 43 45 mangleOverridable = rhs.mangleOverridable; 46 typeMode = rhs.typeMode; 44 47 } 45 48 … … 152 155 void Mangler::mangleRef( ReferenceToType *refType, std::string prefix ) { 153 156 printQualifiers( refType ); 157 154 158 mangleName << ( refType->get_name().length() + prefix.length() ) << prefix << refType->get_name(); 155 159 } 156 160 161 void Mangler::mangleGenericRef( ReferenceToType *refType, std::string prefix ) { 162 printQualifiers( refType ); 163 164 std::ostringstream oldName( mangleName.str() ); 165 mangleName.clear(); 166 167 mangleName << prefix << refType->get_name(); 168 169 std::list< Expression* >& params = refType->get_parameters(); 170 if ( ! params.empty() ) { 171 mangleName << "_"; 172 for ( std::list< Expression* >::const_iterator param = params.begin(); param != params.end(); ++param ) { 173 TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param ); 174 assert(paramType && "Aggregate parameters should be type expressions"); 175 maybeAccept( paramType->get_type(), *this ); 176 } 177 mangleName << "_"; 178 } 179 180 oldName << mangleName.str().length() << mangleName.str(); 181 mangleName.str( oldName.str() ); 182 } 183 157 184 void Mangler::visit( StructInstType *aggregateUseType ) { 158 mangleRef( aggregateUseType, "s" ); 185 if ( typeMode ) mangleGenericRef( aggregateUseType, "s" ); 186 else mangleRef( aggregateUseType, "s" ); 159 187 } 160 188 161 189 void Mangler::visit( UnionInstType *aggregateUseType ) { 162 mangleRef( aggregateUseType, "u" ); 190 if ( typeMode ) mangleGenericRef( aggregateUseType, "u" ); 191 else mangleRef( aggregateUseType, "u" ); 163 192 } 164 193 … … 197 226 } 198 227 228 void Mangler::visit( VarArgsType *varArgsType ) { 229 printQualifiers( varArgsType ); 230 mangleName << "VARGS"; 231 } 232 199 233 void Mangler::visit( TypeDecl *decl ) { 200 234 static const char *typePrefix[] = { "BT", "BD", "BF" }; … … 209 243 210 244 void Mangler::printQualifiers( Type *type ) { 245 // skip if not including qualifiers 246 if ( typeMode ) return; 247 211 248 if ( ! type->get_forall().empty() ) { 212 249 std::list< std::string > assertionNames; … … 227 264 varNums[ (*i )->get_name() ] = std::pair< int, int >( nextVarNum++, (int )(*i )->get_kind() ); 228 265 for ( std::list< DeclarationWithType* >::iterator assert = (*i )->get_assertions().begin(); assert != (*i )->get_assertions().end(); ++assert ) { 229 Mangler sub_mangler( mangleOverridable );266 Mangler sub_mangler( mangleOverridable, typeMode ); 230 267 sub_mangler.nextVarNum = nextVarNum; 231 268 sub_mangler.isTopLevel = false; … … 245 282 mangleName << "V"; 246 283 } // if 247 if ( type->get_isRestrict() ) { 248 mangleName << "R"; 249 } // if 284 // Removed due to restrict not affecting function compatibility in GCC 285 // if ( type->get_isRestrict() ) { 286 // mangleName << "R"; 287 // } // if 250 288 if ( type->get_isLvalue() ) { 251 289 mangleName << "L";
Note:
See TracChangeset
for help on using the changeset viewer.