summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2019-08-19 15:51:40 +1000
committerDamien George <damien.p.george@gmail.com>2019-08-19 16:14:57 +1000
commit11ecdf2ec699c5f78ef7b2bc1bd34618394cc9fa (patch)
tree8e5a17980fa5476397db5f2ed6b3e478e7265208
parent0c80cb39af7a0f6b0ad73d38bf28a8fc1f50b3c7 (diff)
downloadmicropython-11ecdf2ec699c5f78ef7b2bc1bd34618394cc9fa.tar.gz
micropython-11ecdf2ec699c5f78ef7b2bc1bd34618394cc9fa.zip
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.
-rw-r--r--py/nlrx64.c2
-rw-r--r--py/nlrx86.c2
-rw-r--r--py/nlrxtensa.c2
3 files changed, 3 insertions, 3 deletions
diff --git a/py/nlrx64.c b/py/nlrx64.c
index a3a1cf341b..95496b3805 100644
--- a/py/nlrx64.c
+++ b/py/nlrx64.c
@@ -108,7 +108,7 @@ NORETURN void nlr_jump(void *val) {
: // clobbered registers
);
- for (;;); // needed to silence compiler warning
+ MP_UNREACHABLE
}
#endif // MICROPY_NLR_X64
diff --git a/py/nlrx86.c b/py/nlrx86.c
index 59b97d8ee6..6195db63cd 100644
--- a/py/nlrx86.c
+++ b/py/nlrx86.c
@@ -100,7 +100,7 @@ NORETURN void nlr_jump(void *val) {
: // clobbered registers
);
- for (;;); // needed to silence compiler warning
+ MP_UNREACHABLE
}
#endif // MICROPY_NLR_X86
diff --git a/py/nlrxtensa.c b/py/nlrxtensa.c
index cd3dee364c..895b2029e8 100644
--- a/py/nlrxtensa.c
+++ b/py/nlrxtensa.c
@@ -77,7 +77,7 @@ NORETURN void nlr_jump(void *val) {
: // clobbered registers
);
- for (;;); // needed to silence compiler warning
+ MP_UNREACHABLE
}
#endif // MICROPY_NLR_XTENSA