drtype.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 548 行 · 第 1/2 页

C
548
字号
                break;
            case DW_ATE_boolean:
                info->kind = DR_TYPEK_BOOL;
                info->modifier.sign = FALSE;
                break;
            case DW_ATE_complex_float:
                info->kind = DR_TYPEK_COMPLEX;
                break;
            case DW_ATE_float:
                info->kind = DR_TYPEK_REAL;
                break;
            case DW_ATE_signed:
                info->kind = DR_TYPEK_INTEGER;
                info->modifier.sign = TRUE;
                break;
            case DW_ATE_signed_char:
                info->kind  = DR_TYPEK_CHAR;
                info->modifier.sign = TRUE;
                break;
            case DW_ATE_unsigned:
                info->kind = DR_TYPEK_INTEGER;
                info->modifier.sign = FALSE;
                break;
            case DW_ATE_unsigned_char:
                info->kind  = DR_TYPEK_CHAR;
                info->modifier.sign = FALSE;
                break;
            default:
                goto error;
            }
        } else {
            info->modifier.sign = FALSE;
        }
        break;
    case DR_MOD_ADDR:
        if( !DWRGetConstAT( abbrev, entry, DW_AT_address_class, &value ) ) {
            value = DW_ADDR_none;
        }
        switch( value ) {
        case DW_ADDR_none:
            info->size = DWRGetAddrSize( DWRFindCompileUnit( entry ) );
            info->modifier.ptr = DR_PTR_none;
            break;
        case DW_ADDR_near16:
            info->size = 2;
            info->modifier.ptr = DR_PTR_near16;
            break;
        case DW_ADDR_far16:
            info->size = 4;
            info->modifier.ptr = DR_PTR_far16;
            break;
        case DW_ADDR_huge16:
            info->size = 4;
            info->modifier.ptr = DR_PTR_huge16;
            break;
        case DW_ADDR_near32:
            info->size = 4;
            info->modifier.ptr = DR_PTR_near32;
            break;
        case DW_ADDR_far32:
            info->size = 6;
            info->modifier.ptr = DR_PTR_far32;
            break;
        default:
            goto error;
        }
        break;
    }
    return( TRUE );
error:
    return( FALSE );
}

extern dr_ptr DRGetAddrClass( dr_handle entry )
/*********************************************/
{
    dr_handle   abbrev;
    dr_ptr      ret;
    int         value;

    abbrev = DWRGetAbbrev( &entry );
    if( DWRScanForAttrib( &abbrev, &entry, DW_AT_address_class ) ) {
        value = DWRReadConstant( abbrev, entry );
    } else {
        value = DW_ADDR_none;
    }
    switch( value ) {
    case DW_ADDR_none:
        ret = DR_PTR_none;
        break;
    case DW_ADDR_near16:
        ret = DR_PTR_near16;
        break;
    case DW_ADDR_far16:
        ret = DR_PTR_far16;
        break;
    case DW_ADDR_huge16:
        ret = DR_PTR_huge16;
        break;
    case DW_ADDR_near32:
        ret = DR_PTR_near32;
        break;
    case DW_ADDR_far32:
        ret = DR_PTR_far32;
        break;
    }
    return( ret );
}

extern dr_handle DRGetTypeAT( dr_handle entry )
/*********************************************/
{
    dr_handle   abbrev;
    dr_handle   type;

    abbrev = DWRGetAbbrev( &entry );
    type = NULL;
    if( DWRScanForAttrib( &abbrev, &entry, DW_AT_type ) != 0 ) {
        type = DWRReadReference( abbrev, entry );
    }
    return( type );
}

extern dr_array_stat DRGetArrayInfo( dr_handle entry, dr_array_info *info )
/*************************************************************************/
{
    dr_handle     abbrev;
    dr_array_stat stat;
    uint_32       value;
    unsigned_8    haschild;
    dw_tagnum     tag;

    stat = DR_ARRAY_NONE;
    abbrev = DWRVMReadULEB128( &entry );
    abbrev = DWRLookupAbbrev( entry, abbrev );
    tag = DWRVMReadULEB128( &abbrev );
    haschild = DWRVMReadByte( abbrev );
    ++abbrev; /* skip child flag */
    if( DWRGetConstAT( abbrev, entry, DW_AT_ordering, &value ) ) {
        info->ordering = value;
        stat |= DR_ARRAY_ORDERING;
    }
    if( DWRGetConstAT( abbrev, entry, DW_AT_byte_size, &value ) ) {
        info->byte_size = value;
        stat |= DR_ARRAY_BYTE_SIZE;
    }
    if( DWRGetConstAT( abbrev, entry, DW_AT_stride_size, &value ) ) {
        info->stride_size = value;
        stat |= DR_ARRAY_STRIDE_SIZE;
    }
    if( DWRGetConstAT( abbrev, entry, DW_AT_count, &value ) ) {
        info->count = value;
        stat |= DR_ARRAY_COUNT;
    }
    if( haschild ) {
        DWRSkipAttribs( abbrev, &entry );
        info->child = entry;
    } else {
        info->child = NULL;
    }
    return( stat );
}

extern dr_handle DRSkipTypeChain( dr_handle tref )
/************************************************/
// skip modifiers and typedefs
{
    dr_handle   abbrev;
    dr_handle   entry;
    uint_32     tag;

    for( ;; ) {
        entry = tref;
        abbrev = DWRVMReadULEB128( &entry );
        abbrev = DWRLookupAbbrev( entry, abbrev );
        tag = DWRVMReadULEB128( &abbrev );
        ++abbrev; /* skip child flag */
        switch( tag ) {
        case DW_TAG_const_type:
        case DW_TAG_volatile_type:
        case DW_TAG_packed_type:
        case DW_TAG_typedef:
            break;
        default:
            goto end_loop;
        }
        if( DWRScanForAttrib( &abbrev, &entry, DW_AT_type ) != 0 ) {
            entry = DWRReadReference( abbrev, entry );
            tref = entry;
        } else {
            tref = NULL;
            goto end_loop;
        }
    } end_loop:;
    return( tref );
}

static unsigned_16 const MemTag[DR_WLKBLK_STRUCT] = {
    DW_TAG_member, DW_TAG_inheritance, DW_TAG_variable, DW_TAG_subprogram, 0
};

extern int DRWalkStruct( dr_handle mod,  DRWLKBLK *wlks, void *d )
/****************************************************************/
// wlks[0] == member func, wlks[1] inherit func, wlks[2] default
{
    int ret;

    ret = DWRWalkChildren( mod, MemTag, wlks, d );
    return( ret );
}

static unsigned_16 const ArrayTag[DR_WLKBLK_ARRSIB] = {
    DW_TAG_subrange_type, DW_TAG_enumerator, 0
};

extern int DRWalkArraySibs( dr_handle mod,  DRWLKBLK *wlks, void *d )
/************************************************&******************/
// wlks[0] == subrange [1] = enumerator , 0 = Null
{
    int ret;

    ret = DWRWalkSiblings( mod, ArrayTag, wlks, d );
    return( ret );
}

static unsigned_16 const EnumTag[DR_WLKBLK_ENUMS] = {
    DW_TAG_enumerator, 0
};

extern int DRWalkEnum( dr_handle mod,  DRWLKBLK wlk, void *d )
/************************************************************/
// wlks[0] == Enum  func, [1] Null
{
    int         ret;
    DRWLKBLK    wlks[2];

    wlks[0] = wlk;
    wlks[1] = NULL;
    ret = DWRWalkChildren( mod, EnumTag, wlks, d );
    return( ret );
}

extern int DRConstValAT( dr_handle var, uint_32 *ret )
/****************************************************/
{
    dr_handle   abbrev;
    unsigned    form;
    uint_32     val;
    dwr_formcl  formcl;

    abbrev = DWRGetAbbrev( &var );
    if( DWRScanForAttrib( &abbrev, &var, DW_AT_const_value ) != 0 ) {
        form = DWRVMReadULEB128( &abbrev );
        for( ;; ) {
            formcl = DWRFormClass( form );
            switch( formcl ) {
            case DWR_FORMCL_indirect:
                form = DWRVMReadULEB128( &var );
                break;
            case DWR_FORMCL_data:
                val = ReadConst( form, var );
                *ret = val;
                goto found;
            default:
                goto not_found;
            }
        }
    }
not_found:
    return( FALSE );
found:
    return( TRUE );
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?