]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
libbpf: Add btf__new_empty() to create an empty BTF object
authorAndrii Nakryiko <andriin@fb.com>
Sat, 26 Sep 2020 01:13:54 +0000 (18:13 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 29 Sep 2020 00:27:32 +0000 (17:27 -0700)
Add an ability to create an empty BTF object from scratch. This is going to be
used by pahole for BTF encoding. And also by selftest for convenient creation
of BTF objects.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20200926011357.2366158-7-andriin@fb.com
tools/lib/bpf/btf.c
tools/lib/bpf/btf.h
tools/lib/bpf/libbpf.map

index 040f3b8ee39f2cd1cca77dcce40cb42e484909c1..54861a5ba9d947b90db834eedd18007461aced37 100644 (file)
@@ -565,6 +565,36 @@ void btf__free(struct btf *btf)
        free(btf);
 }
 
+struct btf *btf__new_empty(void)
+{
+       struct btf *btf;
+
+       btf = calloc(1, sizeof(*btf));
+       if (!btf)
+               return ERR_PTR(-ENOMEM);
+       btf->fd = -1;
+       btf->ptr_sz = sizeof(void *);
+
+       /* +1 for empty string at offset 0 */
+       btf->raw_size = sizeof(struct btf_header) + 1;
+       btf->raw_data = calloc(1, btf->raw_size);
+       if (!btf->raw_data) {
+               free(btf);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       btf->hdr = btf->raw_data;
+       btf->hdr->hdr_len = sizeof(struct btf_header);
+       btf->hdr->magic = BTF_MAGIC;
+       btf->hdr->version = BTF_VERSION;
+
+       btf->types_data = btf->raw_data + btf->hdr->hdr_len;
+       btf->strs_data = btf->raw_data + btf->hdr->hdr_len;
+       btf->hdr->str_len = 1; /* empty string at offset 0 */
+
+       return btf;
+}
+
 struct btf *btf__new(const void *data, __u32 size)
 {
        struct btf *btf;
index d88b6447c22211b193d127823ab21037b8112a49..b387d0b61f1c3ded9b26767557562a65232b4a2d 100644 (file)
@@ -27,6 +27,7 @@ struct bpf_object;
 
 LIBBPF_API void btf__free(struct btf *btf);
 LIBBPF_API struct btf *btf__new(const void *data, __u32 size);
+LIBBPF_API struct btf *btf__new_empty(void);
 LIBBPF_API struct btf *btf__parse(const char *path, struct btf_ext **btf_ext);
 LIBBPF_API struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext);
 LIBBPF_API struct btf *btf__parse_raw(const char *path);
index f1518c51d2e51ba6a5d3ffdb14900e4384b7139e..d02d8f51e34f62acaa6217704cdd60daceeb0606 100644 (file)
@@ -307,6 +307,7 @@ LIBBPF_0.2.0 {
                bpf_program__section_name;
                btf__add_str;
                btf__find_str;
+               btf__new_empty;
                perf_buffer__buffer_cnt;
                perf_buffer__buffer_fd;
                perf_buffer__epoll_fd;