dwsym.c

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

C
659
字号
    Info8( cli, (flags & DW_PTR_TYPE_MASK) >> DW_PTR_TYPE_SHIFT );
    /* AT_name */
    InfoString( cli, name );
    EndDIE( cli );
    StartChildren( cli );
    return( new );
}

static void MemFuncCommon(
    dw_client                   cli,
    abbrev_code                 abbrev,
    dw_handle                   return_type,
    const char *                name,
    uint                        flags )
{
    StartDIE( cli, abbrev );
    if( flags & DW_FLAG_ARTIFICIAL ){
        /* AT_artificial */
        Info8( cli, 1 );
    }
    /* AT_accessibility =  AT_public, AT_protected, AT_private */
    EmitAccessFlags( cli, flags );
    /* AT_type */
    EmitTypeRef( cli, return_type );
    /* AT_name */
    InfoString( cli, name );
    /* AT_declaration */
    if( flags & DW_FLAG_DECLARATION ){
        Info8( cli, 1 );
    }else{
        Info8( cli, 0 );
    }
    /* AT_inline */
    Info8( cli, (flags & DW_FLAG_INLINE_MASK) >> DW_FLAG_INLINE_SHIFT );
}

dw_handle DWENTRY DWBeginMemFuncDecl(
    dw_client                   cli,
    dw_handle                   return_type,
    dw_loc_handle               segment,
    dw_loc_handle               loc,
    const char *                name,
    uint                        flags )
{
    dw_handle                   new;
    abbrev_code                 abbrev;

    segment = segment;
    loc = loc;
    new = GetHandle( cli );
//  if( segment != NULL ){
//      abbrev = AB_MEMFUNCDECLSEG;
//  }else{
        abbrev = AB_MEMFUNCDECL;
//  }
    if( flags & DW_FLAG_ARTIFICIAL ){
        abbrev |= AB_ARTIFICIAL;
    }
    MemFuncCommon( cli, abbrev, return_type, name, flags );
    /* AT_segment    */
//  if( segment != NULL ){
//      EmitLocExpr( cli, DW_DEBUG_INFO, sizeof( uint_8), segment );
//  }
//  /* AT_loc       */
//  if( loc != NULL ){
//      EmitLocExpr( cli, DW_DEBUG_INFO, sizeof( uint_8), loc );
//  }else{
//      EmitLocExprNull( cli, DW_DEBUG_INFO, sizeof( uint_8) );
//  }
    EndDIE( cli );
    return( new );
}

dw_handle DWENTRY DWBeginVirtMemFuncDecl(
    dw_client                   cli,
    dw_handle                   return_type,
    dw_loc_handle               vtable_loc,
    const char *                name,
    uint                        flags )
{
    dw_handle                   new;
    abbrev_code                 abbrev;

    new = GetHandle( cli );
    abbrev = AB_VIRTMEMFUNCDECL;
    _Assert( (flags & DW_FLAG_ARTIFICIAL) == 0 );
    MemFuncCommon( cli, abbrev, return_type, name, flags );
    /* AT_virtuality  */
    Info8( cli, 1 );
    /* AT_vtable_location */
    if( vtable_loc != NULL ){
        EmitLocExpr( cli, DW_DEBUG_INFO, sizeof( uint_8), vtable_loc );
    }else{
        EmitLocExprNull( cli, DW_DEBUG_INFO, sizeof( uint_8) );
    }
    EndDIE( cli );
    return( new );
}

void DWENTRY DWEndSubroutine(
    dw_client                   cli )
{
    EndChildren( cli );
    EndRef( cli );
}


dw_handle DWENTRY DWFormalParameter(
    dw_client                   cli,
    dw_handle                   parm_type,
    dw_loc_handle               parm_loc,
    dw_loc_handle               entry_loc,
    const char *                name,
    uint                        default_value_type,
    ... )
{
    dw_handle                   new;
    abbrev_code                 abbrev;
    va_list                     args;
    const void *                value;
    dw_size_t                   len;

    new = LabelNewHandle( cli );
    _Validate( parm_type !=NULL );
    va_start( args, default_value_type );
    abbrev = default_value_type == DW_DEFAULT_NONE ? AB_FORMAL_PARAMETER
        : AB_FORMAL_PARAMETER_WITH_DEFAULT;
    StartDIE( cli, abbrev );
    switch( default_value_type ) {
    case DW_DEFAULT_NONE:
        break;
    case DW_DEFAULT_FUNCTION:
        InfoULEB128( cli, DW_FORM_addr );
        InfoReloc( cli, DW_W_DEFAULT_FUNCTION );
        break;
    case DW_DEFAULT_STRING:
        InfoULEB128( cli, DW_FORM_string );
        InfoString( cli, va_arg( args, const char * ) );
        break;
    case DW_DEFAULT_BLOCK:
        InfoULEB128( cli, DW_FORM_block );
        value = va_arg( args, const void * );
        len = va_arg( args, dw_size_t );
        InfoULEB128( cli, len );
        InfoBytes( cli, value, len );
        break;
    default:
        _Abort( ABORT_INVALID_DEFAULT_VALUE );
        break;
    }
    /* AT_name */
    if( name == NULL ) {
        name = "";
    }
    InfoString( cli, name );
    /* AT_location */
    if( parm_loc ) {
        EmitLocExpr( cli, DW_DEBUG_INFO, sizeof( uint_8), parm_loc );
    }else{
        EmitLocExprNull( cli, DW_DEBUG_INFO, sizeof( uint_8) );
    }
    /* AT_WATCOM_parm_entry */
    if( entry_loc ) {
        EmitLocExpr( cli, DW_DEBUG_INFO, sizeof( uint_8), entry_loc );
    }else{
        EmitLocExprNull( cli, DW_DEBUG_INFO, sizeof( uint_8) );
    }
    /* AT_type */
    EmitTypeRef( cli, parm_type );
    EndDIE( cli );
    return( new );
}


dw_handle DWENTRY DWEllipsis(
    dw_client                   cli )
{
    dw_handle                   new;

    new = LabelNewHandle( cli );
    StartDIE( cli, AB_ELLIPSIS );
    EndDIE( cli );
    return( new );
}


dw_handle DWENTRY DWLabel(
    dw_client                   cli,
    dw_loc_handle               segment,
    const char *                name,
    dw_addr_offset              start_scope )
{
    dw_handle                   new;
    abbrev_code                 abbrev;

    new = GetHandle( cli );
    abbrev = AB_LABEL;
    if( name ) abbrev |= AB_NAME;
    if( segment ) abbrev |= AB_SEGMENT;
    StartDIE( cli, abbrev );
    /* AT_name */
    if( name ) {
        InfoString( cli, name );
    }
    /* AT_start_scope */
    InfoULEB128( cli, start_scope );
    /* AT_segment */
    if( segment ) {
        EmitLocExpr( cli, DW_DEBUG_INFO, sizeof( uint_8), segment );
    }
    /* AT_low_pc */
    InfoReloc( cli, DW_W_LABEL );
    EndDIE( cli );
    return( new );
}


dw_handle DWENTRY DWVariable(
    dw_client                   cli,
    dw_handle                   type,
    dw_loc_handle               loc,
    dw_handle                   member_of,
    dw_loc_handle               segment,
    const char *                name,
    dw_addr_offset              start_scope,
    uint                        flags )
{
    dw_handle                   new;
    abbrev_code                 abbrev;

    start_scope = start_scope;
    _Validate( type !=NULL );
    _Validate( name !=NULL );
    new = LabelNewHandle( cli );
    abbrev = AB_VARIABLE;
    if( member_of ) abbrev |= AB_MEMBER;
    if( segment ) abbrev |= AB_SEGMENT;
    if( flags & DW_FLAG_DECLARATION ) abbrev |= AB_DECLARATION;
    StartDIE( cli, abbrev );
    if( flags & DW_FLAG_DECLARATION ) {
        Info8( cli, 1 );
    }
    /* AT_private, etc. */
    EmitAccessFlags( cli, flags );
    /* AT_member */
    if( member_of ) {
        HandleReference( cli, member_of, DW_DEBUG_INFO );
    }
    /* AT_segment */
    if( segment ) {
        EmitLocExpr( cli, DW_DEBUG_INFO, sizeof( uint_8), segment );
    }
    Info8( cli, (flags & DW_FLAG_GLOBAL) != 0 );
    Info8( cli, (flags & DW_FLAG_ARTIFICIAL) != 0 );
    /* AT_name */
    InfoString( cli, name );
    /* AT_location */
    if( loc ) {
        EmitLocExpr( cli, DW_DEBUG_INFO, sizeof( uint_8), loc );
    }else{
        EmitLocExprNull( cli, DW_DEBUG_INFO, sizeof( uint_8) );
    }
    /* AT_type */
    EmitTypeRef( cli, type );
    EndDIE( cli );
    return( new );
}


dw_handle DWENTRY DWConstant(
    dw_client                   cli,
    dw_handle                   type,
    const void *                value,
    dw_size_t                   len,
    dw_handle                   member_of,
    const char *                name,
    dw_addr_offset              start_scope,
    uint                        flags )
{
    dw_handle                   new;
    abbrev_code                 abbrev;

    start_scope = start_scope;
    _Validate( type != NULL );
    _Validate( name != NULL );
    new = LabelNewHandle( cli );
    abbrev = AB_CONSTANT;
    if( member_of ) abbrev |= AB_MEMBER;
    StartDIE( cli, abbrev );
    /* AT_private */
    EmitAccessFlags( cli, flags );
    /* AT_member */
    if( member_of ) {
        HandleReference( cli, member_of, DW_DEBUG_INFO );
    }
    /* AT_external */
    Info8( cli, (flags & DW_FLAG_GLOBAL) != 0 );
    /* AT_const_value */
    if( len == 0 ) {    /* assume it's a string */
        InfoULEB128( cli, DW_FORM_string );
        InfoString( cli, value );
    } else {
        InfoULEB128( cli, DW_FORM_block );
        InfoULEB128( cli, len );
        InfoBytes( cli, value, len );
    }
    /* AT_name */
    InfoString( cli, name );
    /* AT_type */
    EmitTypeRef( cli, type );
    EndDIE( cli );
    return( new );
}


dw_handle DWENTRY DWIncludeCommonBlock(
    dw_client                   cli,
    dw_handle                   common_block )
{
    dw_handle                   new;

    new = LabelNewHandle( cli );
    StartDIE( cli, AB_COMMON_INCLUSION );
    /* AT_common_inclusion */
    HandleReference( cli, common_block, DW_DEBUG_INFO );
    EndDIE( cli );
    return( new );
}

⌨️ 快捷键说明

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