diff options
Diffstat (limited to 'src/bytecode.c')
| -rw-r--r-- | src/bytecode.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index ce075c86afd..48a29c22d55 100644 --- a/src/bytecode.c +++ b/src/bytecode.c | |||
| @@ -29,11 +29,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 29 | #include "window.h" | 29 | #include "window.h" |
| 30 | #include "puresize.h" | 30 | #include "puresize.h" |
| 31 | 31 | ||
| 32 | /* Work around GCC bug 54561. */ | ||
| 33 | #if GNUC_PREREQ (4, 3, 0) | ||
| 34 | # pragma GCC diagnostic ignored "-Wclobbered" | ||
| 35 | #endif | ||
| 36 | |||
| 37 | /* Define BYTE_CODE_SAFE true to enable some minor sanity checking, | 32 | /* Define BYTE_CODE_SAFE true to enable some minor sanity checking, |
| 38 | useful for debugging the byte compiler. It defaults to false. */ | 33 | useful for debugging the byte compiler. It defaults to false. */ |
| 39 | 34 | ||
| @@ -536,6 +531,12 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template, | |||
| 536 | for (ptrdiff_t i = nargs - rest; i < nonrest; i++) | 531 | for (ptrdiff_t i = nargs - rest; i < nonrest; i++) |
| 537 | PUSH (Qnil); | 532 | PUSH (Qnil); |
| 538 | 533 | ||
| 534 | unsigned char volatile saved_quitcounter; | ||
| 535 | #if GCC_LINT && __GNUC__ && !__clang__ | ||
| 536 | Lisp_Object *volatile saved_vectorp; | ||
| 537 | unsigned char const *volatile saved_bytestr_data; | ||
| 538 | #endif | ||
| 539 | |||
| 539 | while (true) | 540 | while (true) |
| 540 | { | 541 | { |
| 541 | int op; | 542 | int op; |
| @@ -967,15 +968,23 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template, | |||
| 967 | 968 | ||
| 968 | if (sys_setjmp (c->jmp)) | 969 | if (sys_setjmp (c->jmp)) |
| 969 | { | 970 | { |
| 971 | quitcounter = saved_quitcounter; | ||
| 970 | struct handler *c = handlerlist; | 972 | struct handler *c = handlerlist; |
| 971 | handlerlist = c->next; | 973 | handlerlist = c->next; |
| 972 | top = c->bytecode_top; | 974 | top = c->bytecode_top; |
| 973 | op = c->bytecode_dest; | 975 | op = c->bytecode_dest; |
| 976 | bc = ¤t_thread->bc; | ||
| 974 | struct bc_frame *fp = bc->fp; | 977 | struct bc_frame *fp = bc->fp; |
| 975 | 978 | ||
| 976 | Lisp_Object fun = fp->fun; | 979 | Lisp_Object fun = fp->fun; |
| 977 | Lisp_Object bytestr = AREF (fun, CLOSURE_CODE); | 980 | Lisp_Object bytestr = AREF (fun, CLOSURE_CODE); |
| 978 | Lisp_Object vector = AREF (fun, CLOSURE_CONSTANTS); | 981 | Lisp_Object vector = AREF (fun, CLOSURE_CONSTANTS); |
| 982 | #if GCC_LINT && __GNUC__ && !__clang__ | ||
| 983 | /* These useless assignments pacify GCC 14.2.1 x86-64 | ||
| 984 | <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=21161>. */ | ||
| 985 | bytestr_data = saved_bytestr_data; | ||
| 986 | vectorp = saved_vectorp; | ||
| 987 | #endif | ||
| 979 | bytestr_data = SDATA (bytestr); | 988 | bytestr_data = SDATA (bytestr); |
| 980 | vectorp = XVECTOR (vector)->contents; | 989 | vectorp = XVECTOR (vector)->contents; |
| 981 | if (BYTE_CODE_SAFE) | 990 | if (BYTE_CODE_SAFE) |
| @@ -989,6 +998,11 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template, | |||
| 989 | goto op_branch; | 998 | goto op_branch; |
| 990 | } | 999 | } |
| 991 | 1000 | ||
| 1001 | saved_quitcounter = quitcounter; | ||
| 1002 | #if GCC_LINT && __GNUC__ && !__clang__ | ||
| 1003 | saved_vectorp = vectorp; | ||
| 1004 | saved_bytestr_data = bytestr_data; | ||
| 1005 | #endif | ||
| 992 | NEXT; | 1006 | NEXT; |
| 993 | } | 1007 | } |
| 994 | 1008 | ||