Skip to content

Commit 7450310

Browse files
committed
py/emitnative: Factor sizeof/offsetof calculations to macros.
1 parent a48cdb5 commit 7450310

File tree

1 file changed

+26
-16
lines changed

1 file changed

+26
-16
lines changed

py/emitnative.c

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,16 @@
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

@@ -101,9 +111,9 @@
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

Comments
 (0)