| From fad977c5a173643a1384e970e4365e338bab9c92 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 30 Nov 2022 12:00:12 -0800 |
| Subject: libbpf: Avoid enum forward-declarations in public API in C++ mode |
| |
| From: Andrii Nakryiko <andrii@kernel.org> |
| |
| [ Upstream commit b42693415b86f608049cf1b4870adc1dc65e58b0 ] |
| |
| C++ enum forward declarations are fundamentally not compatible with pure |
| C enum definitions, and so libbpf's use of `enum bpf_stats_type;` |
| forward declaration in libbpf/bpf.h public API header is causing C++ |
| compilation issues. |
| |
| More details can be found in [0], but it comes down to C++ supporting |
| enum forward declaration only with explicitly specified backing type: |
| |
| enum bpf_stats_type: int; |
| |
| In C (and I believe it's a GCC extension also), such forward declaration |
| is simply: |
| |
| enum bpf_stats_type; |
| |
| Further, in Linux UAPI this enum is defined in pure C way: |
| |
| enum bpf_stats_type { BPF_STATS_RUN_TIME = 0; } |
| |
| And even though in both cases backing type is int, which can be |
| confirmed by looking at DWARF information, for C++ compiler actual enum |
| definition and forward declaration are incompatible. |
| |
| To eliminate this problem, for C++ mode define input argument as int, |
| which makes enum unnecessary in libbpf public header. This solves the |
| issue and as demonstrated by next patch doesn't cause any unwanted |
| compiler warnings, at least with default warnings setting. |
| |
| [0] https://stackoverflow.com/questions/42766839/c11-enum-forward-causes-underlying-type-mismatch |
| [1] Closes: https://github.com/libbpf/libbpf/issues/249 |
| |
| Signed-off-by: Andrii Nakryiko <andrii@kernel.org> |
| Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> |
| Link: https://lore.kernel.org/bpf/20221130200013.2997831-1-andrii@kernel.org |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/lib/bpf/bpf.h | 7 +++++++ |
| 1 file changed, 7 insertions(+) |
| |
| diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h |
| index 9c50beabdd14..fddc05c667b5 100644 |
| --- a/tools/lib/bpf/bpf.h |
| +++ b/tools/lib/bpf/bpf.h |
| @@ -393,8 +393,15 @@ LIBBPF_API int bpf_task_fd_query(int pid, int fd, __u32 flags, char *buf, |
| __u32 *buf_len, __u32 *prog_id, __u32 *fd_type, |
| __u64 *probe_offset, __u64 *probe_addr); |
| |
| +#ifdef __cplusplus |
| +/* forward-declaring enums in C++ isn't compatible with pure C enums, so |
| + * instead define bpf_enable_stats() as accepting int as an input |
| + */ |
| +LIBBPF_API int bpf_enable_stats(int type); |
| +#else |
| enum bpf_stats_type; /* defined in up-to-date linux/bpf.h */ |
| LIBBPF_API int bpf_enable_stats(enum bpf_stats_type type); |
| +#endif |
| |
| struct bpf_prog_bind_opts { |
| size_t sz; /* size of this struct for forward/backward compatibility */ |
| -- |
| 2.35.1 |
| |