Ejemplo n.º 1
0
static enum sym_type AsmType(
    TYPE type )
{
    type_flag mod_flags;

    type = TypeModFlags( type, &mod_flags );
    switch( type->id ) {
      case TYP_POINTER :
        type = TypeModFlags( type->of, &mod_flags );
        if( type->id == TYP_FUNCTION ) {
            return( CodePtrType( mod_flags ) );
        } else {
            return( PtrType( mod_flags ) );
        }
        break;
      case TYP_ARRAY :
      case TYP_BITFIELD :
      case TYP_ENUM :
        return( AsmType( type->of ) );
        break;
      case TYP_CLASS :
        return( SYM_INT1 );
        break;
      case TYP_FUNCTION :
        return( CodePtrType( mod_flags ) );
        break;
      default:
        return( AsmDataType[type->id] );
        break;
    }
}
Ejemplo n.º 2
0
cg_type CgTypePtrSym(          // COMPUTE OUTPUT TYPE OF POINTER TO SYMBOL
    SYMBOL sym )                // - symbol
{
    type_flag mod_flags;        // - modifier flags
    TYPE type;                  // - unmodified type
    cg_type codegen_type;      // - code-gen type

    type = TypeModFlags( sym->sym_type, &mod_flags );
    if( type->id == TYP_FUNCTION ) {
        if( mod_flags & TF1_NEAR ) {
            codegen_type = TY_NEAR_CODE_PTR;
        } else if( mod_flags & TF1_FAR ) {
            codegen_type = TY_LONG_CODE_PTR;
        } else {
            codegen_type = TY_CODE_PTR;
        }
    } else {
        if( mod_flags & TF1_NEAR ) {
            codegen_type = TY_NEAR_POINTER;
        } else if( mod_flags & TF1_FAR ) {
            codegen_type = TY_LONG_POINTER;
        } else if( mod_flags & TF1_HUGE ) {
            codegen_type = TY_HUGE_POINTER;
        } else {
            codegen_type = TY_POINTER;
        }
    }
    return codegen_type;
}
Ejemplo n.º 3
0
fe_seg_id SegmentAddComdatData( // ADD SEGMENT FOR A COMDAT DATA SYMBOL
    SYMBOL sym,                 // - the symbol
    SEGID_CONTROL control )     // - segment control
{
    unsigned attrs;             // - attributes
    char const * name;          // - segment name
    PC_SEGMENT* seg;            // - allocated segment

    sym = sym;
    if( control & SI_ALL_ZERO ) {
        attrs = SGAT_DATA_COMMON_ZERO;
        name = TS_SEG_BSS;
    } else {
        type_flag flags;
        TypeModFlags( sym->sym_type, &flags );
        if( flags & TF1_CONST ) {
            attrs = SGAT_DATA_COMMON_INIT_ROM;
            name = TS_SEG_DATA;
        } else {
            attrs = SGAT_DATA_COMMON_INIT;
            name = TS_SEG_CONST2;
        }
    }
    seg = segmentAlloc( name, NULL, SEG_NULL, attrs, SA_IN_DGROUP );
    return seg->seg_id;
}
Ejemplo n.º 4
0
TYPE TypePointerDiff(           // GET TYPE FOR DIFFERENCE OF POINTERS
    TYPE type )                 // - node for a type
{
    type_flag flag;             // - flags, when modifier

    type = TypeModFlags( type, &flag );
    switch( type->id ) {
      case TYP_ARRAY :
      case TYP_POINTER :
        TypeModFlags( type->of, &flag );
        type = *ptr_diff_type[ data_ptr_type( flag ) ];
        break;
      case TYP_FUNCTION :
        type = *ptr_diff_type[ code_ptr_type( flag ) ];
        break;
      default :
        type = NULL;
        break;
    }
    return( type );
}
Ejemplo n.º 5
0
static
target_size_t cgPtrSize(        // COMPUTE SIZE OF A POINTER
    TYPE type )                 // - type
{
    type_flag mod_flags;        // - modifier flags
    unsigned size;              // - size of the type

    type = TypeModFlags( type, &mod_flags );
    switch( type->id ) {
      case TYP_ARRAY :
      case TYP_POINTER :
        TypeModFlags( type->of, &mod_flags );
        size = data_ptr_size( mod_flags );
        break;
      case TYP_FUNCTION :
        size = code_ptr_size( mod_flags );
        break;
      default :
        size = 0;
        break;
    }
    return( size );
}
Ejemplo n.º 6
0
SYMBOL StaticInitSymbol(        // CREATE STATIC INITIALIZATION SYMBOL
    SYMBOL sym )                // - symbol type
{
    TYPE type;                  // - type for symbol
    type_flag flags;            // - modifier flags

    type = sym->sym_type;
    TypeModFlags( type, &flags );
    if(( flags & TF1_CONST ) == 0 ) {
        /* make it a constant symbol */
        type = MakeModifiedType( type, TF1_CONST );
    }
    return SymCreateTempScope( type
                             , SC_STATIC
                             , SF_REFERENCED
                             , CppStaticInitName( sym ) );
}
Ejemplo n.º 7
0
static target_size_t cgSize(    // COMPUTE SIZE OF A TYPE
    TYPE type,                  // - type
    bool ref_as_ptr )           // - true ==> treat reference as pointer
{
    type_flag mod_flags;        // - modifier flags
    target_size_t size;         // - size of type

    type = TypeModFlags( type, &mod_flags );
    switch( type->id ) {
      case TYP_BOOL :
        size = TARGET_BOOL;
        break;
      case TYP_ERROR :
      case TYP_UCHAR :
      case TYP_SCHAR :
        size = TARGET_CHAR;
        break;
      case TYP_WCHAR :
      case TYP_USHORT :
      case TYP_SSHORT :
        size = TARGET_SHORT;
        break;
      case TYP_SINT :
        size = TARGET_INT;
        break;
      case TYP_UINT :
        size = TARGET_UINT;
        break;
      case TYP_ULONG :
        size = TARGET_ULONG;
        break;
      case TYP_SLONG :
        size = TARGET_LONG;
        break;
      case TYP_ULONG64 :
        size = TARGET_ULONG64;
        break;
      case TYP_SLONG64 :
        size = TARGET_LONG64;
        break;
      case TYP_FLOAT :
        size = TARGET_FLOAT;
        break;
      case TYP_DOUBLE :
        size = TARGET_DOUBLE;
        break;
      case TYP_LONG_DOUBLE :
        size = TARGET_LONG_DOUBLE;
        break;
      case TYP_POINTER :
        if( ( ! ref_as_ptr ) && ( type->flag & TF1_REFERENCE ) ) {
            size = cgSize( type->of, false );
        } else {
            type = TypeModFlags( type->of, &mod_flags );
            if( type->id == TYP_FUNCTION ) {
                size = code_ptr_size( mod_flags );
            } else {
                size = data_ptr_size( mod_flags );
            }
        }
        break;
      case TYP_BITFIELD :
        size = cgSize( type->of, true );
        break;
      case TYP_ARRAY :
        size = type->u.a.array_size;
        if( type->flag & TF1_ZERO_SIZE ) {
            DbgAssert( type->u.a.array_size == 1 );
            size = 0;
        } else {
            size *= cgSize( type->of, false );
        }
        break;
      case TYP_CLASS :
        if( TypeDefined( type ) ) {
            size = type->u.c.info->size;
        } else {
            size = 0;
        }
        break;
      case TYP_FUNCTION :
        size = code_ptr_size( mod_flags );
        break;
      case TYP_MEMBER_POINTER :
        size = CgCodePtrSize() + 2 * TARGET_UINT;
        break;
      default :
        size = 0;
        break;
    }
    return( size );
}
Ejemplo n.º 8
0
cg_type CgTypeOutput(           // COMPUTE TYPE FOR CODE GENERATOR
    TYPE type )                 // - C++ type
{
    cg_type     retn;           // - return type (code generator)
    type_flag   mod_flags;      // - modifier flags

    type = TypeModFlags( type, &mod_flags );
    switch( type->id ) {
      case TYP_SCHAR :
        retn = TY_INT_1;
        break;
      case TYP_BOOL :
        retn = TY_BOOL;
        break;
      case TYP_UCHAR :
        retn = TY_UINT_1;
        break;
      case TYP_UINT :
        retn = TY_UNSIGNED;
        break;
      case TYP_USHORT :
      case TYP_WCHAR :
        retn = TY_UINT_2;
        break;
      case TYP_SINT :
        retn = TY_INTEGER;
        break;
      case TYP_SSHORT :
        retn = TY_INT_2;
        break;
      case TYP_ULONG :
        retn = TY_UINT_4;
        break;
      case TYP_SLONG :
        retn = TY_INT_4;
        break;
      case TYP_ULONG64 :
        retn = TY_UINT_8;
        break;
      case TYP_SLONG64 :
        retn = TY_INT_8;
        break;
      case TYP_FLOAT :
        retn = TY_SINGLE;
        break;
      case TYP_LONG_DOUBLE :
        retn = TY_DOUBLE;           // change later when long-double support
        break;
      case TYP_DOUBLE :
        retn = TY_DOUBLE;
        break;
      case TYP_POINTER :
        type = TypeModFlags( type->of, &mod_flags );
        if( type->id == TYP_FUNCTION ) {
            retn = ptr_cg_type[ code_ptr_type( mod_flags ) ];
        } else {
            retn = ptr_dg_type[ data_ptr_type( mod_flags ) ];
        }
        break;
      case TYP_ARRAY :
        retn = cg_defined_type( type, &type->u.a.refno );
        break;
      case TYP_CLASS :
        retn = cg_defined_type( type, &type->u.c.info->refno );
        break;
      case TYP_FUNCTION :
        retn = ptr_cg_type[ code_ptr_type( mod_flags ) ];
        break;
      case TYP_MEMBER_POINTER :
        retn = cg_defined_type( type, &cg_member_ptr );
        break;
      default:
        retn = TY_INTEGER;
        break;
    }
    return( retn );
}