summaryrefslogtreecommitdiff
path: root/tools/mpy-tool.py
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2024-02-09 13:25:58 +1100
committerDamien George <damien@micropython.org>2024-02-16 12:48:02 +1100
commit39bf055d23be4b0f761af115773c3db1074fc2dd (patch)
tree30fd1f642bff42e78b03ff2146100dc389cd16d3 /tools/mpy-tool.py
parent223e0d9a5b116246bda1621201e77945ac5746fe (diff)
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>
Diffstat (limited to 'tools/mpy-tool.py')
-rwxr-xr-xtools/mpy-tool.py20
1 files changed, 10 insertions, 10 deletions
diff --git a/tools/mpy-tool.py b/tools/mpy-tool.py
index a656cccd6..57411c3fb 100755
--- a/tools/mpy-tool.py
+++ b/tools/mpy-tool.py
@@ -909,21 +909,24 @@ class RawCode(object):
print("static const mp_raw_code_t raw_code_%s = {" % self.escaped_name)
print(" .kind = %s," % RawCode.code_kind_str[self.code_kind])
print(" .scope_flags = 0x%02x," % self.scope_flags)
- print(" .n_pos_args = %u," % self.n_pos_args)
print(" .fun_data = fun_data_%s," % self.escaped_name)
- print(" #if MICROPY_PERSISTENT_CODE_SAVE || MICROPY_DEBUG_PRINTERS")
- print(" .fun_data_len = %u," % len(self.fun_data))
- print(" #endif")
if len(self.children):
print(" .children = (void *)&children_%s," % self.escaped_name)
elif prelude_ptr:
print(" .children = (void *)%s," % prelude_ptr)
else:
print(" .children = NULL,")
+ print(" #if MICROPY_PERSISTENT_CODE_SAVE || MICROPY_DEBUG_PRINTERS")
+ print(" .fun_data_len = %u," % len(self.fun_data))
+ print(" #endif")
print(" #if MICROPY_PERSISTENT_CODE_SAVE")
print(" .n_children = %u," % len(self.children))
+ print(" #if MICROPY_EMIT_MACHINE_CODE")
+ print(" .prelude_offset = %u," % self.prelude_offset)
+ print(" #endif")
if self.code_kind == MP_CODE_BYTECODE:
print(" #if MICROPY_PY_SYS_SETTRACE")
+ print(" .line_of_definition = %u," % 0) # TODO
print(" .prelude = {")
print(" .n_state = %u," % self.prelude_signature[0])
print(" .n_exc_stack = %u," % self.prelude_signature[1])
@@ -944,14 +947,11 @@ class RawCode(object):
" .opcodes = fun_data_%s + %u," % (self.escaped_name, self.offset_opcodes)
)
print(" },")
- print(" .line_of_definition = %u," % 0) # TODO
print(" #endif")
- print(" #if MICROPY_EMIT_MACHINE_CODE")
- print(" .prelude_offset = %u," % self.prelude_offset)
- print(" #endif")
print(" #endif")
- print(" #if MICROPY_EMIT_MACHINE_CODE")
- print(" .type_sig = %u," % type_sig)
+ print(" #if MICROPY_EMIT_INLINE_ASM")
+ print(" .asm_n_pos_args = %u," % self.n_pos_args)
+ print(" .asm_type_sig = %u," % type_sig)
print(" #endif")
print("};")