libbpf: Introduce btf__find_by_name_kind()
authorAlexei Starovoitov <ast@kernel.org>
Thu, 14 Nov 2019 18:57:05 +0000 (10:57 -0800)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 15 Nov 2019 22:42:14 +0000 (23:42 +0100)
Introduce btf__find_by_name_kind() helper to search BTF by name and kind, since
name alone can be ambiguous.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Song Liu <songliubraving@fb.com>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Link: https://lore.kernel.org/bpf/20191114185720.1641606-6-ast@kernel.org
tools/lib/bpf/btf.c
tools/lib/bpf/btf.h
tools/lib/bpf/libbpf.map

index 86a1847..88efa2b 100644 (file)
@@ -316,6 +316,28 @@ __s32 btf__find_by_name(const struct btf *btf, const char *type_name)
        return -ENOENT;
 }
 
+__s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name,
+                            __u32 kind)
+{
+       __u32 i;
+
+       if (kind == BTF_KIND_UNKN || !strcmp(type_name, "void"))
+               return 0;
+
+       for (i = 1; i <= btf->nr_types; i++) {
+               const struct btf_type *t = btf->types[i];
+               const char *name;
+
+               if (btf_kind(t) != kind)
+                       continue;
+               name = btf__name_by_offset(btf, t->name_off);
+               if (name && !strcmp(type_name, name))
+                       return i;
+       }
+
+       return -ENOENT;
+}
+
 void btf__free(struct btf *btf)
 {
        if (!btf)
index b189941..d9ac73a 100644 (file)
@@ -72,6 +72,8 @@ LIBBPF_API int btf__finalize_data(struct bpf_object *obj, struct btf *btf);
 LIBBPF_API int btf__load(struct btf *btf);
 LIBBPF_API __s32 btf__find_by_name(const struct btf *btf,
                                   const char *type_name);
+LIBBPF_API __s32 btf__find_by_name_kind(const struct btf *btf,
+                                       const char *type_name, __u32 kind);
 LIBBPF_API __u32 btf__get_nr_types(const struct btf *btf);
 LIBBPF_API const struct btf_type *btf__type_by_id(const struct btf *btf,
                                                  __u32 id);
index 9f39ee0..420e69b 100644 (file)
@@ -204,4 +204,5 @@ LIBBPF_0.0.6 {
                bpf_program__is_tracing;
                bpf_program__set_tracing;
                bpf_program__size;
+               btf__find_by_name_kind;
 } LIBBPF_0.0.5;