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.
This commit is contained in:
parent
0c80cb39af
commit
11ecdf2ec6
|
@ -108,7 +108,7 @@ NORETURN void nlr_jump(void *val) {
|
|||
: // clobbered registers
|
||||
);
|
||||
|
||||
for (;;); // needed to silence compiler warning
|
||||
MP_UNREACHABLE
|
||||
}
|
||||
|
||||
#endif // MICROPY_NLR_X64
|
||||
|
|
|
@ -100,7 +100,7 @@ NORETURN void nlr_jump(void *val) {
|
|||
: // clobbered registers
|
||||
);
|
||||
|
||||
for (;;); // needed to silence compiler warning
|
||||
MP_UNREACHABLE
|
||||
}
|
||||
|
||||
#endif // MICROPY_NLR_X86
|
||||
|
|
|
@ -77,7 +77,7 @@ NORETURN void nlr_jump(void *val) {
|
|||
: // clobbered registers
|
||||
);
|
||||
|
||||
for (;;); // needed to silence compiler warning
|
||||
MP_UNREACHABLE
|
||||
}
|
||||
|
||||
#endif // MICROPY_NLR_XTENSA
|
||||
|
|
Loading…
Reference in New Issue