Changes in src/SymTab/Mangler.cc [69911c11:78dd0da]
- File:
-
- 1 edited
-
src/SymTab/Mangler.cc (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Mangler.cc
r69911c11 r78dd0da 30 30 31 31 namespace SymTab { 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 ) {} 32 Mangler::Mangler( bool mangleOverridable, bool includeQualifiers ) 33 : nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ), includeQualifiers(includeQualifiers) {} 40 34 41 35 Mangler::Mangler( const Mangler &rhs ) : mangleName() { … … 44 38 isTopLevel = rhs.isTopLevel; 45 39 mangleOverridable = rhs.mangleOverridable; 46 typeMode = rhs.typeMode;40 includeQualifiers = rhs.includeQualifiers; 47 41 } 48 42 … … 155 149 void Mangler::mangleRef( ReferenceToType *refType, std::string prefix ) { 156 150 printQualifiers( refType ); 157 158 151 mangleName << ( refType->get_name().length() + prefix.length() ) << prefix << refType->get_name(); 159 152 } 160 153 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 184 154 void Mangler::visit( StructInstType *aggregateUseType ) { 185 if ( typeMode ) mangleGenericRef( aggregateUseType, "s" ); 186 else mangleRef( aggregateUseType, "s" ); 155 mangleRef( aggregateUseType, "s" ); 187 156 } 188 157 189 158 void Mangler::visit( UnionInstType *aggregateUseType ) { 190 if ( typeMode ) mangleGenericRef( aggregateUseType, "u" ); 191 else mangleRef( aggregateUseType, "u" ); 159 mangleRef( aggregateUseType, "u" ); 192 160 } 193 161 … … 239 207 void Mangler::printQualifiers( Type *type ) { 240 208 // skip if not including qualifiers 241 if ( typeMode) return;209 if ( ! includeQualifiers ) return; 242 210 243 211 if ( ! type->get_forall().empty() ) { … … 259 227 varNums[ (*i )->get_name() ] = std::pair< int, int >( nextVarNum++, (int )(*i )->get_kind() ); 260 228 for ( std::list< DeclarationWithType* >::iterator assert = (*i )->get_assertions().begin(); assert != (*i )->get_assertions().end(); ++assert ) { 261 Mangler sub_mangler( mangleOverridable, typeMode);229 Mangler sub_mangler( mangleOverridable, includeQualifiers ); 262 230 sub_mangler.nextVarNum = nextVarNum; 263 231 sub_mangler.isTopLevel = false;
Note:
See TracChangeset
for help on using the changeset viewer.