Starting with v5.15, "-Wimplicit-fallthrough=5" was added to the build
flags which requires the use of "__attribute__((__fallthrough__))" to
annotate fallthrough case statements.
See upstream commit by the man himself:
commit
d936eb23874433caa3e3d841cfa16f5434b85dcf
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date: Thu Jul 15 18:05:31 2021 -0700
Revert "Makefile: Enable -Wimplicit-fallthrough for Clang"
This reverts commit
b7eb335e26a9c7f258c96b3962c283c379d3ede0.
It turns out that the problem with the clang -Wimplicit-fallthrough
warning is not about the kernel source code, but about clang itself, and
that the warning is unusable until clang fixes its broken ways.
In particular, when you enable this warning for clang, you not only get
warnings about implicit fallthroughs. You also get this:
warning: fallthrough annotation in unreachable code [-Wimplicit-fallthrough]
which is completely broken becasue it
(a) doesn't even tell you where the problem is (seriously: no line
numbers, no filename, no nothing).
(b) is fundamentally broken anyway, because there are perfectly valid
reasons to have a fallthrough statement even if it turns out that
it can perhaps not be reached.
In the kernel, an example of that second case is code in the scheduler:
switch (state) {
case cpuset:
if (IS_ENABLED(CONFIG_CPUSETS)) {
cpuset_cpus_allowed_fallback(p);
state = possible;
break;
}
fallthrough;
case possible:
where if CONFIG_CPUSETS is enabled you actually never hit the
fallthrough case at all. But that in no way makes the fallthrough
wrong.
So the warning is completely broken, and enabling it for clang is a very
bad idea.
In the meantime, we can keep the gcc option enabled, and make the gcc
build use
-Wimplicit-fallthrough=5
which means that we will at least continue to require a proper
fallthrough statement, and that gcc won't silently accept the magic
comment versions. Because gcc does this all correctly, and while the odd
"=5" part is kind of obscure, it's documented in [1]:
"-Wimplicit-fallthrough=5 doesn’t recognize any comments as
fallthrough comments, only attributes disable the warning"
so if clang ever fixes its bad behavior we can try enabling it there again.
Change-Id: Iea69849592fb69ac04fb9bb28efcd6b8dce8ba88
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
#include <linux/uaccess.h>
#include <linux/slab.h>
#include <linux/err.h>
+#include <wrapper/compiler_attributes.h>
#include <wrapper/vmalloc.h> /* for wrapper_vmalloc_sync_mappings() */
#include <wrapper/ringbuffer/vfs.h>
#include <wrapper/ringbuffer/backend.h>
*/
return -ENOSYS;
}
- case RING_BUFFER_FLUSH_EMPTY: /* Fall-through. */
+ case RING_BUFFER_FLUSH_EMPTY:
+ lttng_fallthrough;
case RING_BUFFER_FLUSH:
{
struct lttng_metadata_stream *stream = filp->private_data;
*/
return -ENOSYS;
}
- case RING_BUFFER_FLUSH_EMPTY: /* Fall-through. */
+ case RING_BUFFER_FLUSH_EMPTY:
+ lttng_fallthrough;
case RING_BUFFER_FLUSH:
{
struct lttng_metadata_stream *stream = filp->private_data;
}
break;
- case LTTNG_KERNEL_TRACEPOINT: /* Fallthrough */
- case LTTNG_KERNEL_KPROBE: /* Fallthrough */
- case LTTNG_KERNEL_KRETPROBE: /* Fallthrough */
- case LTTNG_KERNEL_NOOP: /* Fallthrough */
+ case LTTNG_KERNEL_TRACEPOINT:
+ lttng_fallthrough;
+ case LTTNG_KERNEL_KPROBE:
+ lttng_fallthrough;
+ case LTTNG_KERNEL_KRETPROBE:
+ lttng_fallthrough;
+ case LTTNG_KERNEL_NOOP:
+ lttng_fallthrough;
case LTTNG_KERNEL_UPROBE:
break;
- case LTTNG_KERNEL_FUNCTION: /* Fallthrough */
+ case LTTNG_KERNEL_FUNCTION:
+ lttng_fallthrough;
default:
return -EINVAL;
}
#include <lttng-abi-old.h>
#include <lttng-endian.h>
#include <lttng-string-utils.h>
+#include <wrapper/compiler_attributes.h>
#include <wrapper/ringbuffer/backend.h>
#include <wrapper/ringbuffer/frontend.h>
#include <wrapper/time.h>
case LTTNG_KERNEL_KRETPROBE:
ret = lttng_kretprobes_event_enable_state(event, 1);
break;
- case LTTNG_KERNEL_FUNCTION: /* Fall-through. */
+ case LTTNG_KERNEL_FUNCTION:
+ lttng_fallthrough;
default:
WARN_ON_ONCE(1);
ret = -EINVAL;
case LTTNG_KERNEL_KRETPROBE:
ret = lttng_kretprobes_event_enable_state(event, 0);
break;
- case LTTNG_KERNEL_FUNCTION: /* Fall-through. */
+ case LTTNG_KERNEL_FUNCTION:
+ lttng_fallthrough;
default:
WARN_ON_ONCE(1);
ret = -EINVAL;
case LTTNG_KERNEL_SYSCALL:
event_name = event_param->name;
break;
- case LTTNG_KERNEL_FUNCTION: /* Fall-through. */
+ case LTTNG_KERNEL_FUNCTION:
+ lttng_fallthrough;
default:
WARN_ON_ONCE(1);
ret = -EINVAL;
ret = try_module_get(event->desc->owner);
WARN_ON_ONCE(!ret);
break;
- case LTTNG_KERNEL_FUNCTION: /* Fall-through */
+ case LTTNG_KERNEL_FUNCTION:
+ lttng_fallthrough;
default:
WARN_ON_ONCE(1);
ret = -EINVAL;
case LTTNG_KERNEL_NOOP:
ret = 0;
break;
- case LTTNG_KERNEL_FUNCTION: /* Fall-through */
+ case LTTNG_KERNEL_FUNCTION:
+ lttng_fallthrough;
default:
WARN_ON_ONCE(1);
}
lttng_uprobes_unregister(event);
ret = 0;
break;
- case LTTNG_KERNEL_FUNCTION: /* Fall-through */
+ case LTTNG_KERNEL_FUNCTION:
+ lttng_fallthrough;
default:
WARN_ON_ONCE(1);
}
module_put(event->desc->owner);
lttng_uprobes_destroy_private(event);
break;
- case LTTNG_KERNEL_FUNCTION: /* Fall-through */
+ case LTTNG_KERNEL_FUNCTION:
+ lttng_fallthrough;
default:
WARN_ON_ONCE(1);
}
if (ret)
goto error;
/* We still print the current char */
- /* Fallthrough */
+ lttng_fallthrough;
default:
ret = lttng_metadata_printf(session, "%c", cur);
break;
* Copyright (C) 2010-2016 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
*/
+#include <wrapper/compiler_attributes.h>
#include <wrapper/uaccess.h>
#include <wrapper/objtool.h>
#include <wrapper/types.h>
}
break;
case LOAD_ROOT_CONTEXT:
- case LOAD_ROOT_APP_CONTEXT: /* Fall-through */
+ lttng_fallthrough;
+ case LOAD_ROOT_APP_CONTEXT:
{
ret = context_get_index(lttng_probe_ctx,
&stack_top->u.ptr,
#include <lttng-filter.h>
#include "lib/align.h"
+#include <wrapper/compiler_attributes.h>
+
static ssize_t bytecode_reserve_data(struct bytecode_runtime *runtime,
size_t align, size_t len)
{
}
case OBJECT_TYPE_STRUCT:
/* Only generated by the specialize phase. */
- case OBJECT_TYPE_VARIANT: /* Fall-through */
+ case OBJECT_TYPE_VARIANT:
+ lttng_fallthrough;
default:
printk(KERN_WARNING "Unexpected get index type %d",
(int) stack_top->load.object_type);
*/
#include <linux/types.h>
+#include <wrapper/compiler_attributes.h>
#include <lttng-string-utils.h>
p = pattern_get_char_at_cb(p_at,
pattern_get_char_at_cb_data);
- /* Fall-through. */
+ lttng_fallthrough;
default:
/*
* Default case which will compare the escaped
--- /dev/null
+/* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
+ *
+ * wrapper/compiler_attributes.h
+ *
+ * Copyright (C) 2021 Michael Jeanson <mjeanson@efficios.com>
+ */
+
+#ifndef _LTTNG_WRAPPER_COMPILER_ATTRIBUTES_H
+#define _LTTNG_WRAPPER_COMPILER_ATTRIBUTES_H
+
+#include <lttng-kernel-version.h>
+
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,20,0))
+#include <linux/compiler_attributes.h>
+#endif
+
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,4,0))
+
+/*
+ * Use the kernel provided fallthrough attribute macro.
+ */
+#define lttng_fallthrough fallthrough
+
+#else /* LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,4,0) */
+
+/*
+ * Fallback to the comment for kernels pre 5.15 that don't build with
+ * '-Wimplicit-fallthrough=5'.
+ */
+#define lttng_fallthrough do {} while (0) /* fallthrough */
+
+#endif /* LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,4,0) */
+
+#endif /* _LTTNG_WRAPPER_COMPILER_ATTRIBUTES_H */