tcg/optimize: Add fallthrough annotations

To be able to compile this file with -Werror=implicit-fallthrough,
we need to add some fallthrough annotations to the case statements
that might fall through. Unfortunately, the typical "/* fallthrough */"
comments do not work here as expected since some case labels are
wrapped in macros and the compiler fails to match the comments in
this case. But using __attribute__((fallthrough)) seems to work fine,
so let's use that instead (by introducing a new QEMU_FALLTHROUGH
macro in our compiler.h header file).

Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20201211152426.350966-11-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
Thomas Huth 2020-12-11 16:24:24 +01:00
parent 9cf5a9cf60
commit d84568b773
2 changed files with 15 additions and 0 deletions

View File

@ -222,4 +222,15 @@ extern void QEMU_NORETURN QEMU_ERROR("code path is reachable")
#define qemu_build_not_reached() g_assert_not_reached() #define qemu_build_not_reached() g_assert_not_reached()
#endif #endif
/**
* In most cases, normal "fallthrough" comments are good enough for
* switch-case statements, but sometimes the compiler has problems
* with those. In that case you can use QEMU_FALLTHROUGH instead.
*/
#if __has_attribute(fallthrough)
# define QEMU_FALLTHROUGH __attribute__((fallthrough))
#else
# define QEMU_FALLTHROUGH do {} while (0) /* fallthrough */
#endif
#endif /* COMPILER_H */ #endif /* COMPILER_H */

View File

@ -855,6 +855,7 @@ void tcg_optimize(TCGContext *s)
if ((arg_info(op->args[1])->mask & 0x80) != 0) { if ((arg_info(op->args[1])->mask & 0x80) != 0) {
break; break;
} }
QEMU_FALLTHROUGH;
CASE_OP_32_64(ext8u): CASE_OP_32_64(ext8u):
mask = 0xff; mask = 0xff;
goto and_const; goto and_const;
@ -862,6 +863,7 @@ void tcg_optimize(TCGContext *s)
if ((arg_info(op->args[1])->mask & 0x8000) != 0) { if ((arg_info(op->args[1])->mask & 0x8000) != 0) {
break; break;
} }
QEMU_FALLTHROUGH;
CASE_OP_32_64(ext16u): CASE_OP_32_64(ext16u):
mask = 0xffff; mask = 0xffff;
goto and_const; goto and_const;
@ -869,6 +871,7 @@ void tcg_optimize(TCGContext *s)
if ((arg_info(op->args[1])->mask & 0x80000000) != 0) { if ((arg_info(op->args[1])->mask & 0x80000000) != 0) {
break; break;
} }
QEMU_FALLTHROUGH;
case INDEX_op_ext32u_i64: case INDEX_op_ext32u_i64:
mask = 0xffffffffU; mask = 0xffffffffU;
goto and_const; goto and_const;
@ -886,6 +889,7 @@ void tcg_optimize(TCGContext *s)
if ((arg_info(op->args[1])->mask & 0x80000000) != 0) { if ((arg_info(op->args[1])->mask & 0x80000000) != 0) {
break; break;
} }
QEMU_FALLTHROUGH;
case INDEX_op_extu_i32_i64: case INDEX_op_extu_i32_i64:
/* We do not compute affected as it is a size changing op. */ /* We do not compute affected as it is a size changing op. */
mask = (uint32_t)arg_info(op->args[1])->mask; mask = (uint32_t)arg_info(op->args[1])->mask;