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