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 ); }
void DoAddr( void ) { mad_type_info mti; LValue( ExprSP ); if( (ExprSP->flags & SF_LOCATION) && ExprSP->v.loc.num == 1 && ExprSP->v.loc.e[0].type == LT_ADDR ) { ExprSP->v.addr = ExprSP->v.loc.e[0].u.addr; ExprSetAddrInfo( ExprSP, false ); if( ExprSP->th != NULL ) { GetMADTypeDefaultAt( ExprSP->v.addr, MTK_ADDRESS, &mti ); DIPTypePointer( ExprSP->th, TM_FAR, BITS2BYTES( mti.b.bits ), ExprSP->th ); ExprSP->info.kind = TK_POINTER; } else { ExprSP->info.kind = TK_ADDRESS; } ExprSP->flags &= ~SF_FORM_MASK; } else { Error( ERR_NONE, LIT_ENG( ERR_NEED_ADDRESS ) ); } }
void BreakOnExprSP( const char *comment ) { address addr; dip_type_info tinfo; tmp_break_struct s; LValue( ExprSP ); tinfo.size = ExprSP->info.size; if( !( ExprSP->flags & SF_LOCATION ) ) { tinfo.size = DefaultSize( DK_INT ); } switch( WndGetExprSPInspectType( &addr ) ) { case INSP_CODE: AddBreak( addr ); break; case INSP_DATA: case INSP_RAW_DATA: s.addr = addr; s.size = tinfo.size; s.comment = comment; BreakOnAddress( &s ); break; } }
static unsigned MechStack( unsigned select, unsigned parm ) { unsigned result = 0; stack_entry *entry; sym_info info; switch( select ) { case 0: SwapStack( parm ); break; case 1: MoveSP( parm ); break; case 2: entry = StkEntry( parm ); LValue( entry ); result = TypeInfoToClass( &entry->info ) & (BASE_TYPE | STK_UNSIGNED); break; case 3: ExprValue( StkEntry( parm ) ); break; case 4: LValue( StkEntry( parm ) ); break; case 5: RValue( StkEntry( parm ) ); break; case 6: LRValue( StkEntry( parm ) ); break; case 7: entry = StkEntry( parm ); LValue( entry ); result = TI_CREATE( entry->info.kind, TM_NONE, 0 ); break; case 8: entry = StkEntry( parm ); NameResolve( entry, FALSE ); if( entry->flags & SF_SYM ) { SymInfo( entry->v.sh, entry->lc, &info ); result = info.kind; } else { result = SK_NONE; } break; case 9: entry = StkEntry( parm ); result = NameResolve( entry, FALSE ); break; case 10: entry = StkEntry( parm ); if( entry->flags & SF_NAME ) { result = 0; } else if( entry->flags & SF_SYM ) { result = 1; } else if( entry->flags & SF_LOCATION ) { result = 2; } else { result = 3; } break; } return( result ); }
void FunctionModel::insertToST(CodeGenContext* context) { context->st->insert(name, function_t, LValue(this)); // 插入符号表中 }
void StructModel::insertToST(CodeGenContext* context) { context->st->insert(name, struct_t, LValue(this)); // 插入符号表中 }