dbsyms.c

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

C
982
字号
        if( fno == 0 && col == 1 ){
            DBLineNum( line );
        }
    }else{
        idx = CueAdd( fno, line, col );
        SrcLine = idx;
    }
}

extern  void _CGAPI DBGenStMem( sym_handle sym, dbg_loc loc ) {
/*********************************************************/
#ifndef NDEBUG
    EchoAPI( "DBGenStMem( %s,%i)\n", sym, loc );
#endif
    if( _IsModel( DBG_DF ) ) {
        DFGenStatic( sym, loc );
    }else if( _IsModel( DBG_CV ) ) {
        CVGenStatic( sym, loc, TRUE );
    }else{
    }
}

static  void    AddLocal( dbg_local **owner, dbg_local *new  ){
/************************************************************/

    dbg_local *curr;

    while( (curr = *owner) != NULL ) {
        owner = &curr->link;
    }
    new->link = NULL;
    *owner = new;
}

extern  void _CGAPI DBGenSym( sym_handle sym, dbg_loc loc, int scoped ) {
/***********************************************************************/

    fe_attr     attr;
    dbg_block   *blk;
    dbg_local   *new;

#ifndef NDEBUG
    EchoAPI( "DBGenSym( %s, %i, %i )\n", sym, loc, scoped );
#endif
    if( _IsModel( DBG_LOCALS ) ) {
        attr = FEAttr( sym );
        if( (attr & FE_IMPORT) == 0 ) {
            if( attr & FE_PROC ) {
                CurrProc->state.attr |= ROUTINE_WANTS_DEBUGGING;
                _Alloc( CurrProc->targ.debug, sizeof( dbg_rtn ) );
                CurrProc_debug->blk = NULL;
                CurrProc_debug->parms = NULL;
                CurrProc_debug->reeturn = LocDupl( loc );
                CurrProc_debug->obj_type = DBG_NIL_TYPE;
                CurrProc_debug->obj_loc = NULL;
                MkBlock();
            } else if( scoped ) {
                blk = CurrProc_debug->blk;
                _Alloc( new, sizeof( dbg_local ) );
                new->sym = sym;
                new->loc = LocDupl( loc );
                new->kind = DBG_SYM_VAR;
                AddLocal( &blk->locals, new );
            } else {
                if( _IsModel( DBG_DF ) ) {
                    DFGenStatic( sym, loc );
                }else if( _IsModel( DBG_CV ) ) {
                    CVGenStatic( sym, loc, FALSE );
                }else{

                 #if _TARGET &( _TARG_IAPX86 | _TARG_80386 )
                    WVGenStatic( sym , loc );
                 #endif
                }
            }
        }
    }
}


extern  void    _CGAPI DBModSym( sym_handle sym, cg_type indirect ) {
/*******************************************************************/


    fe_attr     attr;
    dbg_loc     loc;

#ifndef NDEBUG
    EchoAPI( "DBModSym( %s, %t )\n",  sym, indirect );
#endif
    indirect = indirect;
    if( _IsModel( DBG_LOCALS ) ) {
        attr = FEAttr( sym );
        if( (attr & FE_IMPORT) == 0 ) {
            if( attr & FE_PROC ) {
                loc = NULL;
            } else {
                loc = DBLocInit();
                loc = DBLocSym( loc, sym );
            }
            DBGenSym( sym, loc, FALSE );
            DBLocFini( loc );
        }
    }
}


extern  void _CGAPI DBObject( dbg_type tipe, dbg_loc loc, cg_type ptr_type ) {
/************************************************************************/

#ifndef NDEBUG
    EchoAPI( "DBObject( %i, %i, %t )\n", tipe, loc, ptr_type );
#endif
    CurrProc_debug->obj_type = tipe;
    CurrProc_debug->obj_loc = LocDupl( loc );
    if( _IsModel( DBG_DF ) ) {
       //
    }else if( _IsModel( DBG_CV ) ) {
      //
    }else{
#if _TARGET &( _TARG_IAPX86 | _TARG_80386 )
        WVObjectPtr( ptr_type );
#endif
    }
}



extern  void    DBAllocReg( name *reg, name *temp ) {
/***************************************************/

    temp = temp;
    reg = reg;
}

extern void _CGAPI DBTypeDef( char *nm, dbg_type tipe ){
/******************************************************/
#ifndef NDEBUG
    EchoAPI( "DBTypeDef( %c, %t )\n", nm, tipe );
#endif
    if( _IsModel( DBG_DF ) ) {
         DFTypedef( nm, tipe );
    }else if( _IsModel( DBG_CV ) ) {
        CVTypedef( nm, tipe );
    }else{
     }
}

extern  void    _CGAPI DBLocalSym( sym_handle sym, cg_type indirect ) {
/*********************************************************************/


    fe_attr     attr;
    dbg_loc     loc;

#ifndef NDEBUG
    EchoAPI( "DBLocalSym( %s, %t )\n", sym, indirect );
#endif
    indirect = indirect;
    if( CurrProc->targ.debug != NULL ) {
        attr = FEAttr( sym );
        if( (attr & FE_IMPORT) == 0 ) {
            loc = DBLocInit();
            loc = DBLocSym( loc, sym );
            DBGenSym( sym, loc, TRUE );
            DBLocFini( loc );
        }
    }
}

extern  void    _CGAPI DBLocalType( sym_handle sym, char kind ) {
/***************************************************************/
    dbg_block   *blk;
    dbg_local   *new;

#ifndef NDEBUG
    EchoAPI( "DBLocalType( %s, %i)\n", sym, kind );
#endif
    if( _IsModel( DBG_LOCALS ) ) {
        if( _IsModel( DBG_CV | DBG_DF ) ) {
            blk = CurrProc_debug->blk;
            _Alloc( new, sizeof( dbg_local ) );
            new->sym = sym;
            new->loc = NULL;
            AddLocal( &blk->locals, new );
            if( kind ){
               new->kind = DBG_SYM_TYPE;
            }else{
                new->kind = DBG_SYM_TYPEDEF;
           }
        }
    }
}

extern  dbg_block *DoDBBegBlock( int fast_codegen ) {
/***************************************************/

    if( CurrProc->targ.debug == NULL ) return( NULL );
    MkBlock();
    if( !fast_codegen ) {
        /*%%%% stick a NOP in the instruction stream, point it at block*/
        AddBlockInfo( CurrProc_debug->blk, TRUE );
    }
    return( CurrProc_debug->blk );
}

extern  void _CGAPI     DBBegBlock() {
/************************************/
#ifndef NDEBUG
    EchoAPI( "DBBegBlock()\n" );
#endif
    DoDBBegBlock( 0 );
}


static  void    MkBlock( void ) {
/********************************/


    dbg_block   *new;

    _Alloc( new, sizeof( dbg_block ) );
    new->parent = CurrProc_debug->blk;
    CurrProc_debug->blk = new;
    new->locals = NULL;
    new->patches = NULL;
}


extern  void    DoDBEndBlock( int fast_codegen ) {
/************************************************/

    dbg_block   *blk;

#ifndef NDEBUG
    EchoAPI( "DBEndBlock()\n" );
#endif
    if( CurrProc->targ.debug != NULL ) {
        blk = CurrProc_debug->blk;
        if( !fast_codegen ) {
            AddBlockInfo( blk, FALSE );
        }
        CurrProc_debug->blk = blk->parent;
    }
}

extern  void _CGAPI     DBEndBlock() {
/************************************/

    DoDBEndBlock( 0 );
}


static  void    AddBlockInfo( dbg_block *blk, bool start ) {
/**********************************************************/


    instruction *ins;

    ins = MakeNop();
    ins->table = DbgInfo;
    ins->u.gen_table = ins->table;
    ins->flags.nop_flags = NOP_DBGINFO;
    if( start ) ins->flags.nop_flags |= NOP_DBGINFO_START;
    ins->operands[ 0 ] = (name *)blk;
    AddIns( ins );
}


extern  void    DbgSetBase() {
/****************************/

    if( _IsModel( DBG_DF ) ) {
    /* nothing */
    }else if( _IsModel( DBG_CV ) ) {
        CVSetBase();
    }else{
#if _TARGET &( _TARG_IAPX86 | _TARG_80386 )
        WVSetBase();
#endif
    }
}


extern  void    DbgParmLoc( name_def *parm, sym_handle sym ) {
/********************************************/
// sym is NULL if no front end sym

    dbg_local           *new;
    dbg_loc             loc;

    if( _IsntModel( DBG_DF ) ){
        if( parm->class != N_REGISTER  ){
            return;
        }
    }
    _Alloc( new, sizeof( dbg_local ) );
    loc = DBLocInit();
    loc = LocParm( loc, (name *) parm );
    new->loc = loc;
    new->sym = sym;
    new->kind = DBG_SYM_VAR;
    AddLocal( &CurrProc_debug->parms, new );
}


extern  void    DbgRetLoc() {
/***************************/


    dbg_loc     loc;

    if( CurrProc_debug->reeturn == NULL ) {
        loc = DBLocInit();
        loc = LocReg( loc, AllocRegName( CurrProc->state.return_reg ) );
#if _TARGET & ( _TARG_IAPX86 | _TARG_80386 )
        if( CurrProc->targ.return_points == NULL ) {
            /* nothing to do */
        } else if( CurrProc->state.attr & ROUTINE_ALLOCS_RETURN ) {
            loc->class = LOC_IND_REG + IND_RALLOC_NEAR;
        } else {
            loc->class = LOC_IND_REG + IND_CALLOC_NEAR;
        }
#endif
        CurrProc_debug->reeturn = loc;
    }
}


/**/
/* Going into optimizer queue*/
/**/


extern  void    DbgRetOffset( type_length offset ) {
/*******************************************/


    CurrProc_debug->ret_offset = offset;
}


extern  void    EmitRtnBeg() {
/****************************/


    EmitDbg( INFO_DBG_RTN_BEG, CurrProc->targ.debug );
}


extern  void    EmitProEnd() {
/****************************/


    EmitDbg( INFO_DBG_PRO_END, CurrProc->targ.debug );
}


extern  void    EmitDbgInfo( instruction *ins ) {
/***********************************************/


    if( ins->flags.nop_flags & NOP_DBGINFO_START ) {
        EmitDbg( INFO_DBG_BLK_BEG, ins->operands[ 0 ] );
   } else {
        EmitDbg( INFO_DBG_BLK_END, ins->operands[ 0 ] );
    }
}


extern  void    EmitEpiBeg() {
/****************************/


    EmitDbg( INFO_DBG_EPI_BEG, CurrProc->targ.debug );
}


extern  void    EmitRtnEnd() {
/****************************/


    seg_id      old;

    EmitDbg( INFO_DBG_RTN_END, CurrProc->targ.debug );
    old = SetOP( AskCodeSeg() );
    EmptyQueue();
    SetOP( old );
}


static  void    EmitDbg( byte class, pointer ptr ) {
/**************************************************/


    any_oc      temp;

    temp.oc_debug.op.class = OC_INFO + class;
    temp.oc_debug.op.reclen = sizeof( oc_debug );
    temp.oc_debug.op.objlen = 0;
    temp.oc_debug.ptr = ptr;
    InputOC( &temp );
}


/**/
/* Coming out of optimizer queue*/
/**/


extern  void    DbgRtnBeg( dbg_rtn *rtn,  offset lc ) {
/***************************************************/

    rtn->blk->start = lc;
    if( _IsModel( DBG_CV ) ) {
        CVRtnBeg( rtn, lc );
    }
}


extern  void    DbgProEnd( dbg_rtn *rtn, offset lc ) {
/**************************************************/

    rtn->pro_size = lc - rtn->blk->start;
    if( _IsModel( DBG_DF ) ) {
        DFProEnd( rtn, lc );
    }else if( _IsModel( DBG_CV ) ) {
        CVProEnd( rtn, lc );
    }
}


extern  void    DbgBlkBeg( dbg_block *blk, offset lc ) {
/****************************************************/


    blk->start = lc;
    if( _IsModel( DBG_DF ) ) {
        DFBlkBeg( blk, lc );
    }else if( _IsModel( DBG_CV ) ) {
        CVBlkBeg( blk, lc );
    }
}

extern  void    DbgBlkEnd( dbg_block *blk, offset lc ) {
/****************************************************/


    if( _IsModel( DBG_DF ) ) {
        DFBlkEnd( blk, lc );
    }else if( _IsModel( DBG_CV ) ) {
        CVBlkEnd( blk, lc );
    }else{
#if _TARGET &( _TARG_IAPX86 | _TARG_80386 )
        WVBlkEnd( blk, lc );
#endif
    }
    _Free( blk, sizeof( dbg_block ) );
}


extern  void    DbgEpiBeg( dbg_rtn *blk, offset lc ) {
/****************************************************/


    blk->epi_start = lc;
    if( _IsModel( DBG_DF ) ) {
        DFEpiBeg( blk, lc );
    }else if( _IsModel( DBG_CV ) ) {
        CVEpiBeg( blk, lc );
    }
}


extern  void    DbgRtnEnd( dbg_rtn *rtn, offset lc ) {
/****************************************************/


    if( _IsModel( DBG_DF ) ) {
        DFRtnEnd( rtn, lc );
    }else if( _IsModel( DBG_CV ) ) {
        CVRtnEnd( rtn, lc );
    }else{
#if _TARGET &( _TARG_IAPX86 | _TARG_80386 )
        WVRtnEnd( rtn, lc );
#endif
    }
    _Free( rtn->blk, sizeof( dbg_block ) );
    _Free( rtn, sizeof( dbg_rtn ) );
}

⌨️ 快捷键说明

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