void MakeMemoryAddr( bool pops, memory_expr def_seg, address *val ) { if( ExprSP->flags & SF_LOCATION ) { ExprSP->flags &= ~(SF_LOCATION|SF_IMP_ADDR); ExprSP->v.addr = ExprSP->v.loc.e[0].u.addr; ExprSP->info.kind = TK_ADDRESS; ExprSP->info.modifier = TM_FAR; } switch( ExprSP->info.kind ) { case TK_ADDRESS: case TK_POINTER: if( (ExprSP->info.modifier & TM_MOD_MASK) != TM_NEAR ) break; /* fall through */ default: DefAddr( def_seg, val ); AddrFix( val ); //NYI: lost address abstraction PushInt( val->mach.segment ); SwapStack( 1 ); MakeAddr(); } *val = ExprSP->v.addr; AddrFloat( val ); if( pops ) PopEntry(); }
char *CnvAddr( address addr, cnvaddr_option cao, bool uniq, char *p, size_t max ) { char off_buff[40]; size_t str_width, name_width, off_width; addr_off sym_offset; search_result sr; location_list ll; DIPHDL( sym, sym ); off_width = 0; AddrFloat( &addr ); sr = DeAliasAddrSym( NO_MOD, addr, sym ); switch( sr ) { case SR_NONE: return( NULL ); case SR_CLOSEST: if( cao == CAO_NO_PLUS ) return( NULL ); DIPSymLocation( sym, NULL, &ll ); sym_offset = addr.mach.offset - ll.e[0].u.addr.mach.offset; if( cao == CAO_NORMAL_PLUS ) { char *prfx; prfx = AddHexSpec( off_buff ); off_width = CnvULongHex( sym_offset, prfx, sizeof( off_buff ) - ( prfx - off_buff ) ) - off_buff + 1; } break; case SR_EXACT: break; } name_width = QualifiedSymName( sym, NULL, 0, uniq ); str_width = name_width + off_width; if( max == 0 ) max = str_width; if( str_width > max ) { /* won't fit */ if( off_width != 0 ) return( NULL ); QualifiedSymName( sym, p, max - 1, uniq ); p += max - 1; *p++ = '>'; *p = NULLCHAR; return( p ); } QualifiedSymName( sym, p, name_width + 1, uniq ); p += name_width; if( off_width != 0 ) { --off_width; *p++ = '+'; memcpy( p, off_buff, off_width ); p += off_width; *p = NULLCHAR; } return( p ); }
inspect_type WndGetExprSPInspectType( address *paddr ) { sym_info info; DIPHDL( sym, sh ); LValue( ExprSP ); *paddr = NilAddr; if( ExprSP->info.kind == TK_FUNCTION ) { ExprValue( ExprSP ); *paddr = ExprSP->v.addr; PopEntry(); return( INSP_CODE ); } else if( (ExprSP->flags & SF_LOCATION) && ExprSP->th != NULL && !IsInternalMod( TypeMod( ExprSP->th ) ) ) { if( ExprSP->v.loc.num == 1 && ExprSP->v.loc.e[0].type == LT_ADDR ) { *paddr = ExprSP->v.loc.e[0].u.addr; } PopEntry(); return( INSP_DATA ); } else { if( (ExprSP->flags & SF_LOCATION) && ExprSP->v.loc.e[0].type == LT_ADDR ) { *paddr = ExprSP->v.loc.e[0].u.addr; } else if( ExprSP->info.kind == TK_ADDRESS || ExprSP->info.kind == TK_POINTER ) { *paddr = ExprSP->v.addr; } if( !IS_NIL_ADDR( (*paddr) ) ) { AddrFloat( paddr ); if( DeAliasAddrSym( NO_MOD, *paddr, sh ) != SR_NONE ) { SymInfo( sh, ExprSP->lc, &info ); PopEntry(); switch( info.kind ) { case SK_CODE: case SK_PROCEDURE: return( INSP_CODE ); break; default: return( INSP_RAW_DATA ); break; } } } } ExprValue( ExprSP ); MakeMemoryAddr( TRUE, EXPR_DATA, paddr ); return( INSP_RAW_DATA ); }
char *LineAddr( address *addr, char *buff, size_t buff_len ) { mod_handle mod; char *end; DIPHDL( cue, line ); AddrFloat( addr ); if( DeAliasAddrMod( *addr, &mod ) == SR_NONE ) return( NULL ); if( DeAliasAddrCue( mod, *addr, line ) == SR_NONE ) return( NULL ); end = buff + buff_len; buff += DIPModName( mod, buff, buff_len - 1 ); *buff++ = '@'; buff = CnvULongDec( DIPCueLine( line ), buff, end - buff ); *buff = NULLCHAR; return( buff ); }