diff options
author | Ayke van Laethem <aykevanlaethem@gmail.com> | 2018-02-13 22:00:20 +0100 |
---|---|---|
committer | Ayke van Laethem <aykevanlaethem@gmail.com> | 2018-02-18 01:35:27 +0100 |
commit | 5591bd237a69a3a1a6ac03cb1dc9edcde835f708 (patch) | |
tree | e60a82ad3cffca3847a4212f7e918bcb7e476ad0 | |
parent | 60c6b880fa4077a05d1273606d41fdc33f06bc2b (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.
-rw-r--r-- | py/nlrthumb.c | 4 |
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 } |