dfsyms.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,126 行 · 第 1/3 页
C
1,126 行
static void InitSegBck( void ){
/*********************************/
dw_sectnum i;
seg_id old;
bck_info *bck;
for( i = DW_DEBUG_INFO; i < DW_DEBUG_MAX; ++i ){
old = SetOP( DwarfSegs[i].seg );
bck = MakeLabel();
bck->seg = DwarfSegs[i].seg;
DwarfSegs[i].bck = bck;
DataLabel( bck->lbl );
SetOP( old );
}
}
static void InitLineSegBck( void ){
/*************************************/
seg_id old;
bck_info *bck;
old = SetOP( DwarfSegs[DW_DEBUG_LINE].seg );
bck = MakeLabel();
bck->seg = DwarfSegs[DW_DEBUG_LINE].seg;
DwarfSegs[DW_DEBUG_LINE].bck = bck;
DataLabel( bck->lbl );
SetOP( old );
}
static void FiniSegBck( void ){
/**********************************/
int i;
bck_info *bck;
for( i = DW_DEBUG_INFO; i < DW_DEBUG_MAX; ++i ){
bck = DwarfSegs[i].bck;
BEFreeBack( bck );
}
}
static void FiniLineSegBck( void ){
/**************************************/
bck_info *bck;
bck = DwarfSegs[DW_DEBUG_LINE].bck;
BEFreeBack( bck );
}
extern void DFSymRange( sym_handle sym, offset size ){
/*********************************************************/
// I don't see what this is good for. The aranges for any
// comdat symbols will be taken care of by DFSegRange().
// Running this code may produce overlapping aranges that
// confuse the hell out of the debugger. However, not running
// this may cause debug information to be missing... call it
// a FIXME
bck_info *bck;
if( !_IsModel( DBG_LOCALS | DBG_TYPES ) )return;
bck = FEBack( sym );
ARange = bck;
DWAddress( Client, size );
}
extern void DFSegRange( void ){
/****************************/
/* do arange for the current segment */
bck_info *bck;
offset off;
offset size;
if( !_IsModel( DBG_LOCALS | DBG_TYPES ) )return;
size = AskMaxSize();
if( size > 0 ){
bck = MakeLabel();
off = AskLocation();
SetLocation( 0 );
DataLabel( bck->lbl );
SetLocation( off );
ARange = bck;
DWAddress( Client, size );
BEFreeBack( bck );
}
}
extern void DFBegCCU( seg_id code, dw_sym_handle dbg_pch ){
/**************************************/
// Call when codeseg hase been defined
dw_cu_info cu;
bck_info *bck;
seg_id old;
type_def *tipe_addr;
if( !_IsModel( DBG_LOCALS | DBG_TYPES ) ){
return;
}
if( CcuDef ){
cu.source_filename = FEAuxInfo( NULL, SOURCE_NAME );
cu.directory = "";
cu.dbg_pch = dbg_pch;
cu.inc_list = NULL;
cu.inc_list_len = 0;
old = SetOP( code );
#if _TARGET &( _TARG_IAPX86 | _TARG_80386 )
if( _IsTargetModel( FLAT_MODEL ) ) {
bck = MakeLabel();
OutLabel( bck->lbl );
Pc_Low = bck;
Pc_High = MakeLabel();
// Emitting DW_AT_low_pc and DW_AT_high_pc is valid *only* if the
// compilation unit's code is in a single contiguous block (see
// DWARF 2, section 3.1).
// I don't know how to find out at the time of this call if there's
// only one code segment or not, hence these attributes are always
// disabled. The low/high pc attribs should probably be handled by
// the linker.
cu.flags = FALSE;
cu.segment_size = 0;
}else{
cu.flags = FALSE;
Pc_Low = NULL;
Pc_High = NULL;
cu.segment_size = 2;
}
#else
bck = MakeLabel();
OutLabel( bck->lbl );
Pc_Low = bck;
Pc_High = MakeLabel();
cu.flags = TRUE;
cu.segment_size = 0;
#endif
SetOP( old );
Comp_High = Pc_High;
tipe_addr = TypeAddress( T_NEAR_POINTER );
cu.offset_size = tipe_addr->length;
switch( GetMemModel() ){
case 'h':
cu.model = DW_MODEL_HUGE;
break;
case 'l':
cu.model = DW_MODEL_LARGE;
break;
case 'f':
cu.model = DW_MODEL_FLAT;
break;
case 's':
cu.model = DW_MODEL_SMALL;
break;
default:
cu.model = DW_MODEL_NONE;
break;
}
DWBeginCompileUnit( Client, &cu );
if( cu.flags ){
BEFreeBack( bck );
}
}else{
CcuDef = TRUE;
}
}
extern void DFObjInitInfo( void ) {
/*****************************************************/
/* called by objinit to init segments and dwarf writing library */
static const dw_funcs cli_funcs = {
CLIReloc,
CLIWrite,
CLISeek,
CLITell,
CLIAlloc,
CLIFree
};
dw_init_info info;
sym_handle abbrev_sym;
sym_handle debug_pch;
fe_attr attr;
if( !_IsModel( DBG_LOCALS | DBG_TYPES ) ){
return;
}
info.language = DWLANG_C;
info.compiler_options = DW_CM_DEBUGGER;
info.abbrev_sym = NULL;
info.producer_name = "WATCOM";
info.language = SetLang();
if( setjmp( info.exception_handler ) == 0 ) {
info.funcs = cli_funcs;
InitSegBck(); // start each seg with a ref label
if( _IsModel( DBG_PREDEF ) ) {
abbrev_sym = FEAuxInfo( NULL, DBG_PREDEF_SYM );
info.abbrev_sym = (dw_sym_handle)abbrev_sym;
attr = FEAttr( abbrev_sym );
if( (attr & FE_IMPORT) ) {
info.compiler_options |= DW_CM_ABBREV_PRE;
}else{
bck_info *bck;
seg_id old;
info.compiler_options |= DW_CM_ABBREV_GEN;
bck = FEBack( abbrev_sym ); // dump out export label
bck->seg = DwarfSegs[DW_DEBUG_ABBREV].seg;
old = SetOP( DwarfSegs[DW_DEBUG_ABBREV].seg );
DataLabel( bck->lbl );
SetOP( old );
}
}
debug_pch = FEAuxInfo( NULL, DBG_PCH_SYM );
if( debug_pch != NULL ){
attr = FEAttr( debug_pch );
if( !(attr & FE_IMPORT) ) {
bck_info *bck;
seg_id old;
bck = FEBack( debug_pch );
bck->seg = DwarfSegs[DW_DEBUG_INFO].seg;
old = SetOP( DwarfSegs[DW_DEBUG_INFO].seg );
DataLabel( bck->lbl );
SetOP( old );
debug_pch = NULL;
}
}
Client = DWInit( &info );
if( Client == NULL ) {
Zoiks( ZOIKS_107 ); /* Bad */
}
DFBegCCU( AskCodeSeg(), (dw_sym_handle)debug_pch );
} else {
Zoiks( ZOIKS_107 ); /* Big Error */
}
}
extern void DFObjLineInitInfo( void ) {
/*****************************************************/
/* called by objinit to init segments and dwarf writing library */
static const dw_funcs cli_funcs = {
CLIReloc,
CLIWrite,
CLISeek,
CLITell,
CLIAlloc,
CLIFree
};
dw_init_info info;
dw_cu_info cu;
type_def *tipe_addr;
info.language = DWLANG_C;
info.compiler_options = DW_CM_DEBUGGER;
info.abbrev_sym = NULL;
info.producer_name = "WATCOM";
info.language = SetLang();
if( setjmp( info.exception_handler ) == 0 ) {
info.funcs = cli_funcs;
InitLineSegBck(); // start each seg with a ref label
Client = DWInit( &info );
if( Client == NULL ) {
Zoiks( ZOIKS_107 ); /* Bad */
}
cu.source_filename = FEAuxInfo( NULL, SOURCE_NAME );
cu.directory = "";
cu.dbg_pch = NULL;
cu.inc_list = NULL;
cu.inc_list_len = 0;
#if _TARGET &( _TARG_IAPX86 | _TARG_80386 )
if( _IsTargetModel( FLAT_MODEL ) ) {
cu.flags = TRUE;
cu.segment_size = 0;
}else{
cu.flags = FALSE;
cu.segment_size = 2;
}
#else
cu.flags = TRUE;
cu.segment_size = 0;
#endif
tipe_addr = TypeAddress( T_NEAR_POINTER );
cu.offset_size = tipe_addr->length;
switch( GetMemModel() ){
case 'h':
cu.model = DW_MODEL_HUGE;
break;
case 'l':
cu.model = DW_MODEL_LARGE;
break;
case 'f':
cu.model = DW_MODEL_FLAT;
break;
case 's':
cu.model = DW_MODEL_SMALL;
break;
default:
cu.model = DW_MODEL_NONE;
break;
}
DWInitDebugLine( Client, &cu );
} else {
Zoiks( ZOIKS_107 ); /* Big Error */
}
}
extern pointer _CGAPI DFClient( void ) {
/*** return the client handle ***/
return( Client );
}
//TODO: maybe this should be some sort of call back
extern void DFDwarfLocal( dw_client client, dw_loc_id locid, sym_handle sym ){
/*** add to location expr where local sym is *************************/
name *tmp;
type_length offset;
tmp = DeAlias( AllocUserTemp( sym, XX ) );
offset = NewBase( tmp );
DWLocOp( client, locid, DW_LOC_fbreg, offset );
}
extern void DFFiniDbgInfo() {
}
extern void DFObjFiniDbgInfo( offset codesize ) {
/******************************/
seg_id old;
offset here;
bck_info *bck;
if( !_IsModel( DBG_LOCALS | DBG_TYPES ) )return;
bck = Comp_High;
if( bck != NULL ){
old = SetOP( AskCodeSeg() );
OutLabel( bck->lbl );
SetOP( old );
BEFreeBack( bck );
Comp_High = NULL;
}
DWEndCompileUnit( Client );
DWFini( Client );
old = SetOP( UnitSize->segment );
here = AskLocation();
SetLocation( UnitSize->offset );
DataLong( codesize );
SetLocation( here );
SetOP( old );
FiniSegBck();
}
extern void DFObjLineFiniDbgInfo( void ) {
/********************************************/
DWFiniDebugLine( Client );
DWFini( Client );
FiniLineSegBck();
}
extern void DFLineNum( cue_state *state, offset lc ){
/*******************************************************/
char *fname;
if( NeedBaseSet() ){
bck_info *bck;
bck = MakeLabel();
OutLabel( bck->lbl );
DWLineAddr( Client, (dw_sym_handle)bck, lc );
#if _TARGET &( _TARG_IAPX86 | _TARG_80386 )
if( !_IsTargetModel( FLAT_MODEL ) ) {
DWLineSeg( Client, (dw_sym_handle)bck );
}
#endif
BEFreeBack( bck );
}
if( state->fno != CurrFNo ){
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?