Changeset ecfd758 for src/Virtual/Tables.cc
- Timestamp:
- Apr 9, 2021, 2:11:43 PM (3 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- b91bfde
- Parents:
- e07b589
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Virtual/Tables.cc
re07b589 recfd758 10 10 // Created On : Mon Aug 31 11:11:00 2020 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : T ue Sep 3 14:56:00 202013 // Update Count : 012 // Last Modified On : Thr Apr 8 15:51:00 2021 13 // Update Count : 1 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"; 38 } 39 40 std::string baseTypeName( std::string const & vtable_type_name ) { 41 return vtable_type_name.substr(0, vtable_type_name.size() - 7); 26 42 } 27 43 … … 81 97 inits.push_back( 82 98 new SingleInit( new AddressExpr( new NameExpr( parentInstance ) ) ) ); 99 } else if ( std::string( "__cfavir_typeid" ) == field->name ) { 100 std::string const & baseType = baseTypeName( vtableType->name ); 101 std::string const & typeId = typeIdName( baseType ); 102 inits.push_back( new SingleInit( new AddressExpr( new NameExpr( typeId ) ) ) ); 83 103 } else if ( std::string( "size" ) == field->name ) { 84 104 inits.push_back( new SingleInit( new SizeofExpr( objectType->clone() ) ) ); … … 147 167 } 148 168 149 } 169 ObjectDecl * makeTypeIdForward() { 170 return nullptr; 171 } 172 173 Attribute * linkonce( const std::string & subsection ) { 174 const std::string section = "\".gnu.linkonce." + subsection + "\""; 175 // Adjust for terminator and quotes. 176 size_t str_size = section.size() + 1 - 2; 177 return new Attribute( "section", { 178 new ConstantExpr( Constant( 179 new ArrayType( 180 noQualifiers, 181 new BasicType( noQualifiers, BasicType::Char ), 182 new ConstantExpr( Constant::from_ulong( str_size ) ), 183 false, false ), 184 section, 185 std::nullopt 186 ) ), 187 } ); 188 } 189 190 ObjectDecl * makeTypeIdInstance( StructInstType const * typeIdType ) { 191 assert( typeIdType ); 192 StructInstType * type = typeIdType->clone(); 193 type->tq.is_const = true; 194 std::string const & typeid_name = typeIdTypeToInstance( typeIdType->name ); 195 return new ObjectDecl( 196 typeid_name, 197 noStorageClasses, 198 LinkageSpec::Cforall, 199 /* bitfieldWidth */ nullptr, 200 type, 201 new ListInit( { new SingleInit( 202 new AddressExpr( new NameExpr( "__cfatid_exception_t" ) ) 203 ) } ), 204 { linkonce( typeid_name ) }, 205 noFuncSpecifiers 206 ); 207 } 208 209 }
Note: See TracChangeset
for help on using the changeset viewer.