summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
authorAyke van Laethem <aykevanlaethem@gmail.com>2018-02-13 22:00:20 +0100
committerAyke van Laethem <aykevanlaethem@gmail.com>2018-02-18 01:35:27 +0100
commit5591bd237a69a3a1a6ac03cb1dc9edcde835f708 (patch)
treee60a82ad3cffca3847a4212f7e918bcb7e476ad0 /py
parent60c6b880fa4077a05d1273606d41fdc33f06bc2b (diff)
py/nlrthumb: Do not mark nlr_push as not returning anything.
By adding __builtin_unreachable() at the end of nlr_push, we're essentially telling the compiler that this function will never return. When GCC LTO is in use, this means that any time nlr_push() is called (which is often), the compiler thinks this function will never return and thus eliminates all code following the call. Note: I've added a 'return 0' for older GCC versions like 4.6 which complain about not returning anything (which doesn't make sense in a naked function). Newer GCC versions (tested 4.8, 5.4 and some others) don't complain about this.
Diffstat (limited to 'py')
-rw-r--r--py/nlrthumb.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/py/nlrthumb.c b/py/nlrthumb.c
index fb0a92236..7dbeac1b6 100644
--- a/py/nlrthumb.c
+++ b/py/nlrthumb.c
@@ -76,9 +76,9 @@ __attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) {
#endif
);
- #if defined(__GNUC__)
+ #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8))
// Older versions of gcc give an error when naked functions don't return a value
- __builtin_unreachable();
+ return 0;
#endif
}