8080// locals (reversed, L0 at end) |
8181// (L0-L2 may be in regs instead)
8282
83+ // Native emitter needs to know the following sizes and offsets of C structs (on the target):
84+ #define SIZEOF_NLR_BUF (sizeof(nlr_buf_t) / sizeof(uintptr_t))
85+ #define SIZEOF_CODE_STATE (sizeof(mp_code_state_t) / sizeof(uintptr_t))
86+ #define OFFSETOF_CODE_STATE_STATE (offsetof(mp_code_state_t, state) / sizeof(uintptr_t))
87+ #define OFFSETOF_CODE_STATE_FUN_BC (offsetof(mp_code_state_t, fun_bc) / sizeof(uintptr_t))
88+ #define OFFSETOF_CODE_STATE_IP (offsetof(mp_code_state_t, ip) / sizeof(uintptr_t))
89+ #define OFFSETOF_CODE_STATE_SP (offsetof(mp_code_state_t, sp) / sizeof(uintptr_t))
90+ #define OFFSETOF_OBJ_FUN_BC_GLOBALS (offsetof(mp_obj_fun_bc_t, globals) / sizeof(uintptr_t))
91+ #define OFFSETOF_OBJ_FUN_BC_CONST_TABLE (offsetof(mp_obj_fun_bc_t, const_table) / sizeof(uintptr_t))
92+
8393// Word index of nlr_buf_t.ret_val
8494#define NLR_BUF_IDX_RET_VAL (1)
8595
101111#define LOCAL_IDX_EXC_HANDLER_PC (emit ) (NLR_BUF_IDX_LOCAL_1)
102112#define LOCAL_IDX_EXC_HANDLER_UNWIND (emit ) (NLR_BUF_IDX_LOCAL_2)
103113#define LOCAL_IDX_RET_VAL (emit ) (NLR_BUF_IDX_LOCAL_3)
104- #define LOCAL_IDX_FUN_OBJ (emit ) ((emit)->code_state_start + offsetof(mp_code_state_t, fun_bc) / sizeof(uintptr_t) )
105- #define LOCAL_IDX_OLD_GLOBALS (emit ) ((emit)->code_state_start + offsetof(mp_code_state_t, ip) / sizeof(uintptr_t) )
106- #define LOCAL_IDX_GEN_PC (emit ) ((emit)->code_state_start + offsetof(mp_code_state_t, ip) / sizeof(uintptr_t) )
114+ #define LOCAL_IDX_FUN_OBJ (emit ) ((emit)->code_state_start + OFFSETOF_CODE_STATE_FUN_BC )
115+ #define LOCAL_IDX_OLD_GLOBALS (emit ) ((emit)->code_state_start + OFFSETOF_CODE_STATE_IP )
116+ #define LOCAL_IDX_GEN_PC (emit ) ((emit)->code_state_start + OFFSETOF_CODE_STATE_IP )
107117#define LOCAL_IDX_LOCAL_VAR (emit , local_num ) ((emit)->stack_start + (emit)->n_state - 1 - (local_num))
108118
109119#define REG_GENERATOR_STATE (REG_LOCAL_3)
@@ -364,7 +374,7 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop
364374 // Work out start of code state (mp_code_state_t or reduced version for viper)
365375 emit -> code_state_start = 0 ;
366376 if (NEED_GLOBAL_EXC_HANDLER (emit )) {
367- emit -> code_state_start = sizeof ( nlr_buf_t ) / sizeof ( uintptr_t ) ;
377+ emit -> code_state_start = SIZEOF_NLR_BUF ;
368378 }
369379
370380 if (emit -> do_viper_types ) {
@@ -402,7 +412,7 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop
402412 #endif
403413
404414 // Load REG_FUN_TABLE with a pointer to mp_fun_table, found in the const_table
405- ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_LOCAL_3 , REG_ARG_1 , offsetof( mp_obj_fun_bc_t , const_table ) / sizeof ( uintptr_t ) );
415+ ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_LOCAL_3 , REG_ARG_1 , OFFSETOF_OBJ_FUN_BC_CONST_TABLE );
406416 ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_FUN_TABLE , REG_LOCAL_3 , 0 );
407417
408418 // Store function object (passed as first arg) to stack if needed
@@ -458,10 +468,10 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop
458468
459469 if (emit -> scope -> scope_flags & MP_SCOPE_FLAG_GENERATOR ) {
460470 emit -> code_state_start = 0 ;
461- emit -> stack_start = sizeof ( mp_code_state_t ) / sizeof ( mp_uint_t ) ;
471+ emit -> stack_start = SIZEOF_CODE_STATE ;
462472 mp_asm_base_data (& emit -> as -> base , ASM_WORD_SIZE , (uintptr_t )emit -> prelude_offset );
463473 mp_asm_base_data (& emit -> as -> base , ASM_WORD_SIZE , (uintptr_t )emit -> start_offset );
464- ASM_ENTRY (emit -> as , sizeof ( nlr_buf_t ) / sizeof ( uintptr_t ) );
474+ ASM_ENTRY (emit -> as , SIZEOF_NLR_BUF );
465475
466476 // Put address of code_state into REG_GENERATOR_STATE
467477 #if N_X86
@@ -478,11 +488,11 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop
478488
479489 // Load REG_FUN_TABLE with a pointer to mp_fun_table, found in the const_table
480490 ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_TEMP0 , REG_GENERATOR_STATE , LOCAL_IDX_FUN_OBJ (emit ));
481- ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_TEMP0 , REG_TEMP0 , offsetof( mp_obj_fun_bc_t , const_table ) / sizeof ( uintptr_t ) );
491+ ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_TEMP0 , REG_TEMP0 , OFFSETOF_OBJ_FUN_BC_CONST_TABLE );
482492 ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_FUN_TABLE , REG_TEMP0 , emit -> scope -> num_pos_args + emit -> scope -> num_kwonly_args );
483493 } else {
484494 // The locals and stack start after the code_state structure
485- emit -> stack_start = emit -> code_state_start + sizeof ( mp_code_state_t ) / sizeof ( mp_uint_t ) ;
495+ emit -> stack_start = emit -> code_state_start + SIZEOF_CODE_STATE ;
486496
487497 // Allocate space on C-stack for code_state structure, which includes state
488498 ASM_ENTRY (emit -> as , emit -> stack_start + emit -> n_state );
@@ -497,15 +507,15 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop
497507 #endif
498508
499509 // Load REG_FUN_TABLE with a pointer to mp_fun_table, found in the const_table
500- ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_LOCAL_3 , REG_ARG_1 , offsetof( mp_obj_fun_bc_t , const_table ) / sizeof ( uintptr_t ) );
510+ ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_LOCAL_3 , REG_ARG_1 , OFFSETOF_OBJ_FUN_BC_CONST_TABLE );
501511 ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_FUN_TABLE , REG_LOCAL_3 , emit -> scope -> num_pos_args + emit -> scope -> num_kwonly_args );
502512
503513 // Set code_state.fun_bc
504514 ASM_MOV_LOCAL_REG (emit -> as , LOCAL_IDX_FUN_OBJ (emit ), REG_ARG_1 );
505515
506516 // Set code_state.ip (offset from start of this function to prelude info)
507517 // TODO this encoding may change size in the final pass, need to make it fixed
508- emit_native_mov_state_imm_via (emit , emit -> code_state_start + offsetof( mp_code_state_t , ip ) / sizeof ( uintptr_t ) , emit -> prelude_offset , REG_ARG_1 );
518+ emit_native_mov_state_imm_via (emit , emit -> code_state_start + OFFSETOF_CODE_STATE_IP , emit -> prelude_offset , REG_ARG_1 );
509519
510520 // Put address of code_state into first arg
511521 ASM_MOV_REG_LOCAL_ADDR (emit -> as , REG_ARG_1 , emit -> code_state_start );
@@ -1036,7 +1046,7 @@ STATIC void emit_load_reg_with_ptr(emit_t *emit, int reg, mp_uint_t ptr, size_t
10361046 emit -> const_table [table_off ] = ptr ;
10371047 }
10381048 emit_native_mov_reg_state (emit , REG_TEMP0 , LOCAL_IDX_FUN_OBJ (emit ));
1039- ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_TEMP0 , REG_TEMP0 , offsetof( mp_obj_fun_bc_t , const_table ) / sizeof ( uintptr_t ) );
1049+ ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_TEMP0 , REG_TEMP0 , OFFSETOF_OBJ_FUN_BC_CONST_TABLE );
10401050 ASM_LOAD_REG_REG_OFFSET (emit -> as , reg , REG_TEMP0 , table_off );
10411051}
10421052
@@ -1093,7 +1103,7 @@ STATIC void emit_native_global_exc_entry(emit_t *emit) {
10931103 if (!(emit -> scope -> scope_flags & MP_SCOPE_FLAG_GENERATOR )) {
10941104 // Set new globals
10951105 emit_native_mov_reg_state (emit , REG_ARG_1 , LOCAL_IDX_FUN_OBJ (emit ));
1096- ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_ARG_1 , REG_ARG_1 , offsetof( mp_obj_fun_bc_t , globals ) / sizeof ( uintptr_t ) );
1106+ ASM_LOAD_REG_REG_OFFSET (emit -> as , REG_ARG_1 , REG_ARG_1 , OFFSETOF_OBJ_FUN_BC_GLOBALS );
10971107 emit_call (emit , MP_F_NATIVE_SWAP_GLOBALS );
10981108
10991109 // Save old globals (or NULL if globals didn't change)
@@ -1146,7 +1156,7 @@ STATIC void emit_native_global_exc_entry(emit_t *emit) {
11461156 if (emit -> scope -> scope_flags & MP_SCOPE_FLAG_GENERATOR ) {
11471157 // Store return value in state[0]
11481158 ASM_MOV_REG_LOCAL (emit -> as , REG_TEMP0 , LOCAL_IDX_EXC_VAL (emit ));
1149- ASM_STORE_REG_REG_OFFSET (emit -> as , REG_TEMP0 , REG_GENERATOR_STATE , offsetof( mp_code_state_t , state ) / sizeof ( uintptr_t ) );
1159+ ASM_STORE_REG_REG_OFFSET (emit -> as , REG_TEMP0 , REG_GENERATOR_STATE , OFFSETOF_CODE_STATE_STATE );
11501160
11511161 // Load return kind
11521162 ASM_MOV_REG_IMM (emit -> as , REG_RET , MP_VM_RETURN_EXCEPTION );
@@ -2575,7 +2585,7 @@ STATIC void emit_native_return_value(emit_t *emit) {
25752585 if (emit -> scope -> scope_flags & MP_SCOPE_FLAG_GENERATOR ) {
25762586 // Save pointer to current stack position for caller to access return value
25772587 emit_get_stack_pointer_to_reg_for_pop (emit , REG_TEMP0 , 1 );
2578- emit_native_mov_state_reg (emit , offsetof( mp_code_state_t , sp ) / sizeof ( uintptr_t ) , REG_TEMP0 );
2588+ emit_native_mov_state_reg (emit , OFFSETOF_CODE_STATE_SP , REG_TEMP0 );
25792589
25802590 // Put return type in return value slot
25812591 ASM_MOV_REG_IMM (emit -> as , REG_TEMP0 , MP_VM_RETURN_NORMAL );
@@ -2658,7 +2668,7 @@ STATIC void emit_native_yield(emit_t *emit, int kind) {
26582668
26592669 // Save pointer to current stack position for caller to access yielded value
26602670 emit_get_stack_pointer_to_reg_for_pop (emit , REG_TEMP0 , 1 );
2661- emit_native_mov_state_reg (emit , offsetof( mp_code_state_t , sp ) / sizeof ( uintptr_t ) , REG_TEMP0 );
2671+ emit_native_mov_state_reg (emit , OFFSETOF_CODE_STATE_SP , REG_TEMP0 );
26622672
26632673 // Put return type in return value slot
26642674 ASM_MOV_REG_IMM (emit -> as , REG_TEMP0 , MP_VM_RETURN_YIELD );
0 commit comments