Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Virtual/Tables.cc

    rb583113 r69c5c00  
    1010// Created On       : Mon Aug 31 11:11:00 2020
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Apr 21 15:36:00 2021
    13 // Update Count     : 2
     12// Last Modified On : Tue Sep  3 14:56:00 2020
     13// Update Count     : 0
    1414//
    1515
     
    2222namespace Virtual {
    2323
    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 
    3624std::string vtableTypeName( std::string const & name ) {
    3725        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);
    4226}
    4327
     
    5034}
    5135
    52 std::string concurrentDefaultVTableName() {
    53         return "_default_vtable";
    54 }
    55 
    5636bool isVTableInstanceName( std::string const & name ) {
    5737        // There are some delicate length calculations here.
     
    6141
    6242static ObjectDecl * makeVtableDeclaration(
    63                 std::string const & name,
    6443                StructInstType * type, Initializer * init ) {
     44        std::string const & name = instanceName( type->name );
    6545        Type::StorageClasses storage = noStorageClasses;
    6646        if ( nullptr == init ) {
     
    7757}
    7858
    79 ObjectDecl * makeVtableForward( std::string const & name, StructInstType * type ) {
     59ObjectDecl * makeVtableForward( StructInstType * type ) {
    8060        assert( type );
    81         return makeVtableDeclaration( name, type, nullptr );
     61        return makeVtableDeclaration( type, nullptr );
    8262}
    8363
    8464ObjectDecl * makeVtableInstance(
    85                 std::string const & name, StructInstType * vtableType,
    86                 Type * objectType, Initializer * init ) {
     65                StructInstType * vtableType, Type * objectType, Initializer * init ) {
    8766        assert( vtableType );
    8867        assert( objectType );
     
    10281                                inits.push_back(
    10382                                                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 ) ) ) );
    10883                        } else if ( std::string( "size" ) == field->name ) {
    10984                                inits.push_back( new SingleInit( new SizeofExpr( objectType->clone() ) ) );
     
    12095                assert(false);
    12196        }
    122         return makeVtableDeclaration( name, vtableType, init );
     97        return makeVtableDeclaration( vtableType, init );
    12398}
    12499
     
    172147}
    173148
    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         } );
    179149}
    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.