diff options
author | Damien George <damien@micropython.org> | 2022-06-09 12:36:45 +1000 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2022-06-09 13:56:30 +1000 |
commit | f63b4f85aae1e0ade7a7c9f908debb5905cc144d (patch) | |
tree | 476707793fb38f4c0838de3f126e950281f718a4 /py | |
parent | 3452ee58d36a1d6ae2c156c84903b84131d00a8b (diff) |
py/parse: Work around xtensa esp-2020r3 compiler bug.
This commit works around a bug in xtensa-esp32-elf-gcc version esp-2020r3.
The bug is in generation of loop constructs. The below code is generated
by the xtensa-esp32 compiler. The first extract is the buggy machine code
and the second extract is the corrected machine code. The test
`basics/logic_constfolding.py` fails with the first code and succeeds with
the second.
Disassembly of section .text.push_result_rule:
00000000 <push_result_rule>:
...
d6: 209770 or a9, a7, a7
d9: 178976 loop a9, f4 <push_result_rule+0xf4>
d9: R_XTENSA_SLOT0_OP .text.push_result_rule+0xf4
dc: 030190 rsr.lend a9
df: 130090 wsr.lbeg a9
e2: a8c992 addi a9, a9, -88
e5: 06d992 addmi a9, a9, 0x600
e8: 130190 wsr.lend a9
eb: 002000 isync
ee: 030290 rsr.lcount a9
f1: 01c992 addi a9, a9, 1
f4: 1494e7 bne a4, a14, 10c <push_result_rule+0x10c>
f4: R_XTENSA_SLOT0_OP .text.push_result_rule+0x10c
Disassembly of section .text.push_result_rule:
00000000 <push_result_rule>:
...
d6: 209770 or a9, a7, a7
d9: 178976 loop a9, f4 <push_result_rule+0xf4>
d9: R_XTENSA_SLOT0_OP .text.push_result_rule+0xf4
dc: 030190 rsr.lend a9
df: 130090 wsr.lbeg a9
e2: 000091 l32r a9, fffc00e4 <push_result_rule+0xfffc00e4>
e2: R_XTENSA_SLOT0_OP .literal.push_result_rule+0x18
e5: 0020f0 nop
e8: 130190 wsr.lend a9
eb: 002000 isync
ee: 030290 rsr.lcount a9
f1: 01c992 addi a9, a9, 1
f4: 1494e7 bne a4, a14, 10c <push_result_rule+0x10c>
f4: R_XTENSA_SLOT0_OP .text.push_result_rule+0x10c
Work done in collaboration with @jimmo.
Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'py')
-rw-r--r-- | py/parse.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/py/parse.c b/py/parse.c index 3972893cb..14f5f6c10 100644 --- a/py/parse.c +++ b/py/parse.c @@ -639,6 +639,11 @@ STATIC MP_DEFINE_CONST_MAP(mp_constants_map, mp_constants_table); STATIC void push_result_rule(parser_t *parser, size_t src_line, uint8_t rule_id, size_t num_args); #if MICROPY_COMP_CONST_FOLDING +#if MICROPY_COMP_CONST_FOLDING_COMPILER_WORKAROUND +// Some versions of the xtensa-esp32-elf-gcc compiler generate wrong code if this +// function is static, so provide a hook for them to work around this problem. +MP_NOINLINE +#endif STATIC bool fold_logical_constants(parser_t *parser, uint8_t rule_id, size_t *num_args) { if (rule_id == RULE_or_test || rule_id == RULE_and_test) { |