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 + -
显示快捷键?