py/nlr: Use MP_UNREACHABLE at the end of arch-specific nlr_jump funcs.

Recent versions of gcc perform optimisations which can lead to the
following code from the MP_NLR_JUMP_HEAD macro being omitted:

    top->ret_val = val; \
    MP_NLR_RESTORE_PYSTACK(top); \
    *_top_ptr = top->prev; \

This is noticeable (at least) in the unix coverage on x86-64 built with gcc
9.1.0.  This is because the nlr_jump function is marked as no-return, so
gcc deduces that the above code has no effect.

Adding MP_UNREACHABLE tells the compiler that the asm code may branch
elsewhere, and so it cannot optimise away the code.
pull/1/head
Damien George 2019-08-19 15:51:40 +10:00
parent 0c80cb39af
commit 11ecdf2ec6
3 changed files with 3 additions and 3 deletions

View File

@ -108,7 +108,7 @@ NORETURN void nlr_jump(void *val) {
: // clobbered registers
);
for (;;); // needed to silence compiler warning
MP_UNREACHABLE
}
#endif // MICROPY_NLR_X64

View File

@ -100,7 +100,7 @@ NORETURN void nlr_jump(void *val) {
: // clobbered registers
);
for (;;); // needed to silence compiler warning
MP_UNREACHABLE
}
#endif // MICROPY_NLR_X86

View File

@ -77,7 +77,7 @@ NORETURN void nlr_jump(void *val) {
: // clobbered registers
);
for (;;); // needed to silence compiler warning
MP_UNREACHABLE
}
#endif // MICROPY_NLR_XTENSA