static void DumpLocals( dbg_local *local ) /********************************************/ { dbg_local *next; type_length offset; cv_out out[1]; dbg_type tipe; name *t; for( ; local != NULL; local = next ) { next = local->link; switch( local->kind ) { case DBG_SYM_VAR: tipe = FEDbgType( local->sym ); t = LocSymBP( local->loc ); if( t != NULL ) { offset = NewBase( t ); NewBuff( out, CVSyms ); FrameVar( out, FEName( local->sym ), tipe, offset ); buffEnd( out ); } else { CVGenStatic( local->sym, local->loc, false ); } break; case DBG_SYM_TYPE: break; case DBG_SYM_TYPEDEF: tipe = FEDbgType( local->sym ); CVTypedef( FEName( local->sym ), tipe ); break; } DBLocFini( local->loc ); CGFree( local ); } }
void CVOutSym( cv_out *out, cg_sym_handle sym ) /*** Put a sym in out ***************************/ { dbg_type tipe; fe_attr attr; const char *nm; attr = FEAttr( sym ); tipe = FEDbgType( sym ); nm = FEName( sym ); if( attr & FE_STATIC ) { cs_gdata *ptr; sg_index kind; if( attr & FE_GLOBAL ) { kind = SG_GDATA; } else { kind = SG_LDATA; } ptr = StartSym( out, kind ); ptr->offset = 0; ptr->segment = 0; ptr->type = tipe; CVPutStr( out, nm ); EndSym( out ); } else { FrameVar( out, nm, tipe, 0 ); } }
void CVProEnd( dbg_rtn *rtn, offset lc ) /*****************************************/ { cg_sym_handle sym; dbg_type tipe; fe_attr attr; const char *name; cs_gproc *ptr; sg_index kind; cv_out out[1]; /* unused parameters */ (void)lc; sym = AskForLblSym( CurrProc->label ); attr = FEAttr( sym ); if( attr & FE_GLOBAL ){ kind = SG_GPROC; }else{ kind = SG_LPROC; } NewBuff( out, CVSyms ); ptr = StartSym( out, kind ); ptr->pParent = 0; ptr->pEnd = 0; ptr->pNext = 0; ptr->proc_length = 0; ptr->debug_start = rtn->pro_size; ptr->debug_end = 0; ptr->offset = 0; ptr->segment = 0; tipe = FEDbgType( sym ); ptr->proctype = tipe; ptr->flags.s = 0; #if _TARGET & ( _TARG_IAPX86 | _TARG_80386 ) if( *(call_class *)FindAuxInfoSym( sym, CALL_CLASS ) & FAR_CALL ) { ptr->flags.f.far_ret = true; } #endif if( rtn->obj_type != DBG_NIL_TYPE ) { name = FEAuxInfo( sym, CLASS_APPENDED_NAME ); } else { name = FEName( sym ); } CVPutStr( out, name ); EndSym( out ); BuffPatchSet( CVSyms, RtnPatch ); BuffWrite( out, &ptr->offset ); SymReloc( CVSyms, sym, 0 ); BuffSkip( out, &ptr->proctype ); buffEnd( out ); DBLocFini( rtn->reeturn ); DBLocFini( rtn->obj_loc ); if( rtn->parms != NULL ){ DumpParms( rtn->parms, &rtn->rtn_blk->locals ); } DumpLocals( rtn->rtn_blk->locals ); }
static void SymParm( cg_sym_handle sym, dw_loc_handle loc, dw_loc_handle entry ) { /*******************************************************************/ // fe_attr attr; const char *name; // dw_handle obj; dbg_type dbtype; // attr = FEAttr( sym ); dbtype = FEDbgType( sym ); /* causes FEName side effects */ name = FEName( sym ); // obj = DWFormalParameter( Client, dbtype, loc, entry, name, DW_DEFAULT_NONE ); DWFormalParameter( Client, dbtype, loc, entry, name, DW_DEFAULT_NONE ); }
extern void DFGenStatic( cg_sym_handle sym, dbg_loc loc ) { /*******************************************************************/ uint flags; fe_attr attr; const char *name; dw_loc_handle dw_loc; dw_loc_handle dw_segloc; dw_handle obj; dbg_type dbtype; attr = FEAttr( sym ); if( attr & FE_GLOBAL ){ flags = DW_FLAG_GLOBAL; }else{ flags = 0; } name = FEName( sym ); if( attr & FE_STATIC ){ #if _TARGET & ( _TARG_IAPX86 | _TARG_80386 ) if( _IsTargetModel( FLAT_MODEL ) ) { dw_segloc = NULL; }else{ dw_segloc = SegLoc( sym ); } #else dw_segloc = NULL; #endif }else{ dw_segloc = NULL; } dbtype = FEDbgType( sym ); /* causes name side effects */ dw_loc = DBGLoc2DF( loc ); obj = DWVariable( Client, dbtype, dw_loc, 0, dw_segloc, name, 0, flags ); if( attr & FE_GLOBAL ){ name = FEName( sym ); DWPubname( Client, obj, name ); } if( dw_loc != NULL ){ DWLocTrash( Client, dw_loc ); } if( dw_segloc != NULL ){ DWLocTrash( Client, dw_segloc ); } }
static void DumpParms( dbg_local *parm, dbg_local **locals ) { dbg_local *alt; cv_out out[1]; dbg_local *next; for( ; parm != NULL; parm = next ) { /* find and unlink from locals */ next = parm->link; alt = UnLinkLoc( locals, parm->sym ); if( alt != NULL ){ dbg_type tipe; type_length offset; name *t; if( alt->kind == DBG_SYM_VAR ){ tipe = FEDbgType( alt->sym ); t = LocSymBP( alt->loc ); if( t != NULL ){ offset = NewBase( t ); NewBuff( out, CVSyms ); FrameVar( out, FEName( alt->sym ), tipe, offset ); buffEnd( out ); }else{ CVGenStatic( alt->sym, alt->loc, false ); } } DBLocFini( alt->loc ); CGFree( alt ); } DBLocFini( parm->loc ); CGFree( parm ); } //#if _TARGET & _TARG_AXP #if 0 // seems like it screws CVPACK on intel NewBuff( out, CVSyms ); StartSym( out, SG_ENDARG ); EndSym( out ); buffEnd( out ); #endif }
void CVGenStatic( cg_sym_handle sym, dbg_loc loc, bool mem ) /*************************************************************/ { dbg_type tipe; cv_out out[1]; fe_attr attr; cs_gdata *ptr; sg_index kind; const char *name; attr = FEAttr( sym ); tipe = FEDbgType( sym ); NewBuff( out, CVSyms ); attr = FEAttr( sym ); if( attr & FE_GLOBAL ) { kind = SG_GDATA; } else { kind = SG_LDATA; } ptr = StartSym( out, kind ); ptr->offset = 0; ptr->segment = 0; ptr->type = tipe; if( mem ){ name = FEAuxInfo( sym, CLASS_APPENDED_NAME ); } else { name = FEName( sym ); } CVPutStr( out, name ); EndSym( out ); if( LocSimpStatic( loc ) == sym ) { BuffWrite( out, &ptr->offset ); SymReloc( CVSyms, sym, 0 ); BuffSkip( out, &ptr->type ); } else { /*TODO:can't handle locs */ } buffEnd( out ); }