Changes in src/Virtual/Tables.cc [69c5c00:b583113]
- File:
-
- 1 edited
-
src/Virtual/Tables.cc (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Virtual/Tables.cc
r69c5c00 rb583113 10 10 // Created On : Mon Aug 31 11:11:00 2020 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Sep 3 14:56:00 202013 // Update Count : 012 // Last Modified On : Wed Apr 21 15:36:00 2021 13 // Update Count : 2 14 14 // 15 15 … … 22 22 namespace Virtual { 23 23 24 std::string typeIdType( std::string const & type_name ) { 25 return "__cfatid_struct_" + type_name; 26 } 27 28 std::string typeIdName( std::string const & type_name ) { 29 return "__cfatid_" + type_name; 30 } 31 32 static std::string typeIdTypeToInstance( std::string const & type_name ) { 33 return typeIdName(type_name.substr(16)); 34 } 35 24 36 std::string vtableTypeName( std::string const & name ) { 25 37 return name + "_vtable"; 26 38 } 27 39 40 std::string baseTypeName( std::string const & vtable_type_name ) { 41 return vtable_type_name.substr(0, vtable_type_name.size() - 7); 42 } 43 28 44 std::string instanceName( std::string const & name ) { 29 45 return std::string("_") + name + "_instance"; … … 32 48 std::string vtableInstanceName( std::string const & name ) { 33 49 return instanceName( vtableTypeName( name ) ); 50 } 51 52 std::string concurrentDefaultVTableName() { 53 return "_default_vtable"; 34 54 } 35 55 … … 41 61 42 62 static ObjectDecl * makeVtableDeclaration( 63 std::string const & name, 43 64 StructInstType * type, Initializer * init ) { 44 std::string const & name = instanceName( type->name );45 65 Type::StorageClasses storage = noStorageClasses; 46 66 if ( nullptr == init ) { … … 57 77 } 58 78 59 ObjectDecl * makeVtableForward( StructInstType * type ) {79 ObjectDecl * makeVtableForward( std::string const & name, StructInstType * type ) { 60 80 assert( type ); 61 return makeVtableDeclaration( type, nullptr );81 return makeVtableDeclaration( name, type, nullptr ); 62 82 } 63 83 64 84 ObjectDecl * makeVtableInstance( 65 StructInstType * vtableType, Type * objectType, Initializer * init ) { 85 std::string const & name, StructInstType * vtableType, 86 Type * objectType, Initializer * init ) { 66 87 assert( vtableType ); 67 88 assert( objectType ); … … 81 102 inits.push_back( 82 103 new SingleInit( new AddressExpr( new NameExpr( parentInstance ) ) ) ); 104 } else if ( std::string( "__cfavir_typeid" ) == field->name ) { 105 std::string const & baseType = baseTypeName( vtableType->name ); 106 std::string const & typeId = typeIdName( baseType ); 107 inits.push_back( new SingleInit( new AddressExpr( new NameExpr( typeId ) ) ) ); 83 108 } else if ( std::string( "size" ) == field->name ) { 84 109 inits.push_back( new SingleInit( new SizeofExpr( objectType->clone() ) ) ); … … 95 120 assert(false); 96 121 } 97 return makeVtableDeclaration( vtableType, init );122 return makeVtableDeclaration( name, vtableType, init ); 98 123 } 99 124 … … 147 172 } 148 173 149 } 174 Attribute * linkonce( const std::string & subsection ) { 175 const std::string section = ".gnu.linkonce." + subsection; 176 return new Attribute( "section", { 177 new ConstantExpr( Constant::from_string( section ) ), 178 } ); 179 } 180 181 ObjectDecl * makeTypeIdInstance( StructInstType const * typeIdType ) { 182 assert( typeIdType ); 183 StructInstType * type = typeIdType->clone(); 184 type->tq.is_const = true; 185 std::string const & typeid_name = typeIdTypeToInstance( typeIdType->name ); 186 return new ObjectDecl( 187 typeid_name, 188 noStorageClasses, 189 LinkageSpec::Cforall, 190 /* bitfieldWidth */ nullptr, 191 type, 192 new ListInit( { new SingleInit( 193 new AddressExpr( new NameExpr( "__cfatid_exception_t" ) ) 194 ) } ), 195 { linkonce( typeid_name ) }, 196 noFuncSpecifiers 197 ); 198 } 199 200 }
Note:
See TracChangeset
for help on using the changeset viewer.