| /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ | |
| /* | |
| * Common user-facing libbpf helpers. | |
| * | |
| * Copyright (c) 2019 Facebook | |
| */ | |
| #ifndef __LIBBPF_LIBBPF_COMMON_H | |
| #define __LIBBPF_LIBBPF_COMMON_H | |
| #include <string.h> | |
| #ifndef LIBBPF_API | |
| #define LIBBPF_API __attribute__((visibility("default"))) | |
| #endif | |
| /* Helper macro to declare and initialize libbpf options struct | |
| * | |
| * This dance with uninitialized declaration, followed by memset to zero, | |
| * followed by assignment using compound literal syntax is done to preserve | |
| * ability to use a nice struct field initialization syntax and **hopefully** | |
| * have all the padding bytes initialized to zero. It's not guaranteed though, | |
| * when copying literal, that compiler won't copy garbage in literal's padding | |
| * bytes, but that's the best way I've found and it seems to work in practice. | |
| * | |
| * Macro declares opts struct of given type and name, zero-initializes, | |
| * including any extra padding, it with memset() and then assigns initial | |
| * values provided by users in struct initializer-syntax as varargs. | |
| */ | |
| #define DECLARE_LIBBPF_OPTS(TYPE, NAME, ...) \ | |
| struct TYPE NAME = ({ \ | |
| memset(&NAME, 0, sizeof(struct TYPE)); \ | |
| (struct TYPE) { \ | |
| .sz = sizeof(struct TYPE), \ | |
| __VA_ARGS__ \ | |
| }; \ | |
| }) | |
| #endif /* __LIBBPF_LIBBPF_COMMON_H */ |