https://bugs.exim.org/show_bug.cgi?id=2154
Bug ID: 2154 Summary: sljitNativeMIPS_common.c:506:3: error: a label can only be part of a statement and a declaration is not a statement Product: PCRE Version: 8.41 Hardware: SGI OS: Linux Status: NEW Severity: bug Priority: high Component: Code Assignee: p...@hermes.cam.ac.uk Reporter: ku...@gentoo.org CC: pcre-dev@exim.org Created attachment 1029 --> https://bugs.exim.org/attachment.cgi?id=1029&action=edit Fix compile on MIPS for sljitNativeMIPS_common.c In libpcre-8.41, on a MIPS platform, it looks like in some specific case, this code change (from 8.40): +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) +{ + switch (feature_type) { + case SLJIT_HAS_FPU: +#ifdef SLJIT_IS_FPU_AVAILABLE + return SLJIT_IS_FPU_AVAILABLE; +#elif defined(__GNUC__) + sljit_sw fir; + asm ("cfc1 %0, $0" : "=r"(fir)); + return (fir >> 22) & 0x1; +#else +#error "FIR check is not implemented for this architecture" +#endif + +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) + case SLJIT_HAS_CLZ: + case SLJIT_HAS_CMOV: + return 1; +#endif + + default: + return 0; + } +} + Produces this compiler error: libtool: compile: mips-unknown-linux-uclibc-gcc -DHAVE_CONFIG_H -I. -I/usr/obj/portage/dev-libs/libpcre-8.41/work/pcre-8.41 -fvisibility=hidden -Os -march=rm7000 -mtune=rm7000 -pipe -mplt -fomit-frame-pointer -c /usr/obj/portage/dev-libs/libpcre-8.41/work/pcre-8.41/pcre_jit_compile.c -fPIC -DPIC -o .libs/libpcre_la-pcre_jit_compile.o In file included from /usr/obj/portage/dev-libs/libpcre-8.41/work/pcre-8.41/sljit/sljitLir.c:1747:0, from /usr/obj/portage/dev-libs/libpcre-8.41/work/pcre-8.41/pcre_jit_compile.c:62: /usr/obj/portage/dev-libs/libpcre-8.41/work/pcre-8.41/sljit/sljitNativeMIPS_common.c: In function 'sljit_has_cpu_feature': /usr/obj/portage/dev-libs/libpcre-8.41/work/pcre-8.41/sljit/sljitNativeMIPS_common.c:506:3: error: a label can only be part of a statement and a declaration is not a statement sljit_sw fir; ^~~~~~~~ make[1]: *** [Makefile:1734: libpcre_la-pcre_jit_compile.lo] Error 1 make[1]: Leaving directory '/usr/obj/portage/dev-libs/libpcre-8.41/work/pcre-8.41-abi_mips_o32.o32' make: *** [Makefile:1322: all] Error 2 The error is because SLJIT_IS_FPU_AVAILABLE is not set, but __GNUC__ is, so the switch statement comes out like this: switch (feature_type) { case SLJIT_HAS_FPU: sljit_sw fir; asm ("cfc1 %0, $0" : "=r"(fir)); return (fir >> 22) & 0x1; default: return 0; } And this runs afoul of a quirk in C grammar, based on an explanation at this StackOverflow post: https://stackoverflow.com/a/18496414/ """ This is a quirk of the C grammar. A label (Cleanup:) is not allowed to appear immediately before a declaration (such as char *str ...;), only before a statement (printf(...);). In C89 this was no great difficulty because declarations could only appear at the very beginning of a block, so you could always move the label down a bit and avoid the issue. In C99 you can mix declarations and code, but you still can't put a label immediately before a declaration. """ A simple fix for this is to wrap the code block in the __GNUC__ case in braces. I have attached a patch that does this, and can confirm on running hardware (an SGI O2) that pcre-8.41 will compile with the patch. -- You are receiving this mail because: You are on the CC list for the bug. -- ## List details at https://lists.exim.org/mailman/listinfo/pcre-dev