py/emitglue: Reorder and resize members of mp_raw_code_t.
The mp_raw_code_t struct has been reordered and some members resized. The `n_pos_args` member is renamed to `asm_n_pos_args`, and `type_sig` renamed to `asm_type_sig` to indicate that these are used only for the inline-asm emitters. These two members are also grouped together in the struct. The justifications for resizing the members are: - `fun_data_len` can be 32-bits without issue - `n_children` is already limited to 16-bits by `mp_emit_common_t::ct_cur_child` - `scope_flags` is already limited to 16-bits by `scope_t::scope_flags` - `prelude_offset` is already limited to 16-bits by the argument to `mp_emit_glue_assign_native()` - it's reasonable to limit the maximim number of inline-asm arguments to 12 (24 bits for `asm_type_sig` divided by 2) This change helps to reduce frozen code size (and in some cases RAM usage) in the following cases: - 64-bit targets - builds with MICROPY_PY_SYS_SETTRACE enabled - builds with MICROPY_EMIT_MACHINE_CODE enabled but MICROPY_EMIT_INLINE_ASM disabled With this change, unix 64-bit builds are -4080 bytes in size. Bare-metal ports like rp2 are unchanged (because mp_raw_code_t is still 32 bytes on those 32-bit targets). Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
@@ -49,34 +49,38 @@ typedef enum {
|
||||
MP_CODE_NATIVE_ASM,
|
||||
} mp_raw_code_kind_t;
|
||||
|
||||
// This mp_raw_code_t struct holds static information about a non-instantiated function.
|
||||
// A function object is created from this information, and that object can then be executed.
|
||||
//
|
||||
// This struct appears in the following places:
|
||||
// compiled bytecode: instance in RAM, referenced by outer scope, usually freed after first (and only) use
|
||||
// mpy file: instance in RAM, created when .mpy file is loaded (same comments as above)
|
||||
// frozen: instance in ROM
|
||||
typedef struct _mp_raw_code_t {
|
||||
mp_uint_t kind : 3; // of type mp_raw_code_kind_t
|
||||
mp_uint_t scope_flags : 7;
|
||||
mp_uint_t n_pos_args : 11;
|
||||
uint32_t kind : 3; // of type mp_raw_code_kind_t
|
||||
uint32_t scope_flags : 7;
|
||||
const void *fun_data;
|
||||
#if MICROPY_PERSISTENT_CODE_SAVE || MICROPY_DEBUG_PRINTERS
|
||||
size_t fun_data_len; // so mp_raw_code_save and mp_bytecode_print work
|
||||
#endif
|
||||
struct _mp_raw_code_t **children;
|
||||
#if MICROPY_PERSISTENT_CODE_SAVE || MICROPY_DEBUG_PRINTERS
|
||||
uint32_t fun_data_len; // so mp_raw_code_save and mp_bytecode_print work
|
||||
#endif
|
||||
#if MICROPY_PERSISTENT_CODE_SAVE
|
||||
size_t n_children;
|
||||
uint16_t n_children;
|
||||
#if MICROPY_EMIT_MACHINE_CODE
|
||||
uint16_t prelude_offset;
|
||||
#endif
|
||||
#if MICROPY_PY_SYS_SETTRACE
|
||||
mp_bytecode_prelude_t prelude;
|
||||
// line_of_definition is a Python source line where the raw_code was
|
||||
// created e.g. MP_BC_MAKE_FUNCTION. This is different from lineno info
|
||||
// stored in prelude, which provides line number for first statement of
|
||||
// a function. Required to properly implement "call" trace event.
|
||||
mp_uint_t line_of_definition;
|
||||
#endif
|
||||
#if MICROPY_EMIT_MACHINE_CODE
|
||||
uint16_t prelude_offset;
|
||||
uint32_t line_of_definition;
|
||||
mp_bytecode_prelude_t prelude;
|
||||
#endif
|
||||
#endif
|
||||
#if MICROPY_EMIT_MACHINE_CODE
|
||||
mp_uint_t type_sig; // for viper, compressed as 2-bit types; ret is MSB, then arg0, arg1, etc
|
||||
#if MICROPY_EMIT_INLINE_ASM
|
||||
uint32_t asm_n_pos_args : 8;
|
||||
uint32_t asm_type_sig : 24; // compressed as 2-bit types; ret is MSB, then arg0, arg1, etc
|
||||
#endif
|
||||
} mp_raw_code_t;
|
||||
|
||||
@@ -88,17 +92,17 @@ void mp_emit_glue_assign_bytecode(mp_raw_code_t *rc, const byte *code,
|
||||
#endif
|
||||
mp_raw_code_t **children,
|
||||
#if MICROPY_PERSISTENT_CODE_SAVE
|
||||
size_t n_children,
|
||||
uint16_t n_children,
|
||||
#endif
|
||||
mp_uint_t scope_flags);
|
||||
uint16_t scope_flags);
|
||||
|
||||
void mp_emit_glue_assign_native(mp_raw_code_t *rc, mp_raw_code_kind_t kind, void *fun_data, mp_uint_t fun_len,
|
||||
mp_raw_code_t **children,
|
||||
#if MICROPY_PERSISTENT_CODE_SAVE
|
||||
size_t n_children,
|
||||
uint16_t n_children,
|
||||
uint16_t prelude_offset,
|
||||
#endif
|
||||
mp_uint_t scope_flags, mp_uint_t n_pos_args, mp_uint_t type_sig);
|
||||
uint16_t scope_flags, uint32_t asm_n_pos_args, uint32_t asm_type_sig);
|
||||
|
||||
mp_obj_t mp_make_function_from_raw_code(const mp_raw_code_t *rc, const mp_module_context_t *context, const mp_obj_t *def_args);
|
||||
mp_obj_t mp_make_closure_from_raw_code(const mp_raw_code_t *rc, const mp_module_context_t *context, mp_uint_t n_closed_over, const mp_obj_t *args);
|
||||
|
||||
Reference in New Issue
Block a user