mirror of
https://github.com/netdata/libbpf.git
synced 2026-04-08 17:49:07 +08:00
libbpf: Introduce kflag for type_tags and decl_tags in BTF
Add the following functions to libbpf API: * btf__add_type_attr() * btf__add_decl_attr() These functions allow to add to BTF the type tags and decl tags with info->kflag set to 1. The kflag indicates that the tag directly encodes an __attribute__ and not a normal tag. See Documentation/bpf/btf.rst changes in the subsequent patch for details on the semantics. Suggested-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Reviewed-by: Alan Maguire <alan.maguire@oracle.com> Acked-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20250130201239.1429648-2-ihor.solodrai@linux.dev
This commit is contained in:
committed by
Andrii Nakryiko
parent
71208c3362
commit
32bda80136
86
src/btf.c
86
src/btf.c
@@ -2090,7 +2090,7 @@ static int validate_type_id(int id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* generic append function for PTR, TYPEDEF, CONST/VOLATILE/RESTRICT */
|
/* generic append function for PTR, TYPEDEF, CONST/VOLATILE/RESTRICT */
|
||||||
static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id)
|
static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id, int kflag)
|
||||||
{
|
{
|
||||||
struct btf_type *t;
|
struct btf_type *t;
|
||||||
int sz, name_off = 0;
|
int sz, name_off = 0;
|
||||||
@@ -2113,7 +2113,7 @@ static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref
|
|||||||
}
|
}
|
||||||
|
|
||||||
t->name_off = name_off;
|
t->name_off = name_off;
|
||||||
t->info = btf_type_info(kind, 0, 0);
|
t->info = btf_type_info(kind, 0, kflag);
|
||||||
t->type = ref_type_id;
|
t->type = ref_type_id;
|
||||||
|
|
||||||
return btf_commit_type(btf, sz);
|
return btf_commit_type(btf, sz);
|
||||||
@@ -2128,7 +2128,7 @@ static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref
|
|||||||
*/
|
*/
|
||||||
int btf__add_ptr(struct btf *btf, int ref_type_id)
|
int btf__add_ptr(struct btf *btf, int ref_type_id)
|
||||||
{
|
{
|
||||||
return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id);
|
return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2506,7 +2506,7 @@ int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind)
|
|||||||
struct btf_type *t;
|
struct btf_type *t;
|
||||||
int id;
|
int id;
|
||||||
|
|
||||||
id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0);
|
id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0, 0);
|
||||||
if (id <= 0)
|
if (id <= 0)
|
||||||
return id;
|
return id;
|
||||||
t = btf_type_by_id(btf, id);
|
t = btf_type_by_id(btf, id);
|
||||||
@@ -2536,7 +2536,7 @@ int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id)
|
|||||||
if (!name || !name[0])
|
if (!name || !name[0])
|
||||||
return libbpf_err(-EINVAL);
|
return libbpf_err(-EINVAL);
|
||||||
|
|
||||||
return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id);
|
return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2548,7 +2548,7 @@ int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id)
|
|||||||
*/
|
*/
|
||||||
int btf__add_volatile(struct btf *btf, int ref_type_id)
|
int btf__add_volatile(struct btf *btf, int ref_type_id)
|
||||||
{
|
{
|
||||||
return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id);
|
return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2560,7 +2560,7 @@ int btf__add_volatile(struct btf *btf, int ref_type_id)
|
|||||||
*/
|
*/
|
||||||
int btf__add_const(struct btf *btf, int ref_type_id)
|
int btf__add_const(struct btf *btf, int ref_type_id)
|
||||||
{
|
{
|
||||||
return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id);
|
return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2572,7 +2572,7 @@ int btf__add_const(struct btf *btf, int ref_type_id)
|
|||||||
*/
|
*/
|
||||||
int btf__add_restrict(struct btf *btf, int ref_type_id)
|
int btf__add_restrict(struct btf *btf, int ref_type_id)
|
||||||
{
|
{
|
||||||
return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id);
|
return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2588,7 +2588,24 @@ int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id)
|
|||||||
if (!value || !value[0])
|
if (!value || !value[0])
|
||||||
return libbpf_err(-EINVAL);
|
return libbpf_err(-EINVAL);
|
||||||
|
|
||||||
return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id);
|
return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Append new BTF_KIND_TYPE_TAG type with:
|
||||||
|
* - *value*, non-empty/non-NULL tag value;
|
||||||
|
* - *ref_type_id* - referenced type ID, it might not exist yet;
|
||||||
|
* Set info->kflag to 1, indicating this tag is an __attribute__
|
||||||
|
* Returns:
|
||||||
|
* - >0, type ID of newly added BTF type;
|
||||||
|
* - <0, on error.
|
||||||
|
*/
|
||||||
|
int btf__add_type_attr(struct btf *btf, const char *value, int ref_type_id)
|
||||||
|
{
|
||||||
|
if (!value || !value[0])
|
||||||
|
return libbpf_err(-EINVAL);
|
||||||
|
|
||||||
|
return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2610,7 +2627,7 @@ int btf__add_func(struct btf *btf, const char *name,
|
|||||||
linkage != BTF_FUNC_EXTERN)
|
linkage != BTF_FUNC_EXTERN)
|
||||||
return libbpf_err(-EINVAL);
|
return libbpf_err(-EINVAL);
|
||||||
|
|
||||||
id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id);
|
id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id, 0);
|
||||||
if (id > 0) {
|
if (id > 0) {
|
||||||
struct btf_type *t = btf_type_by_id(btf, id);
|
struct btf_type *t = btf_type_by_id(btf, id);
|
||||||
|
|
||||||
@@ -2845,18 +2862,8 @@ int btf__add_datasec_var_info(struct btf *btf, int var_type_id, __u32 offset, __
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static int btf_add_decl_tag(struct btf *btf, const char *value, int ref_type_id,
|
||||||
* Append new BTF_KIND_DECL_TAG type with:
|
int component_idx, int kflag)
|
||||||
* - *value* - non-empty/non-NULL string;
|
|
||||||
* - *ref_type_id* - referenced type ID, it might not exist yet;
|
|
||||||
* - *component_idx* - -1 for tagging reference type, otherwise struct/union
|
|
||||||
* member or function argument index;
|
|
||||||
* Returns:
|
|
||||||
* - >0, type ID of newly added BTF type;
|
|
||||||
* - <0, on error.
|
|
||||||
*/
|
|
||||||
int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id,
|
|
||||||
int component_idx)
|
|
||||||
{
|
{
|
||||||
struct btf_type *t;
|
struct btf_type *t;
|
||||||
int sz, value_off;
|
int sz, value_off;
|
||||||
@@ -2880,13 +2887,46 @@ int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id,
|
|||||||
return value_off;
|
return value_off;
|
||||||
|
|
||||||
t->name_off = value_off;
|
t->name_off = value_off;
|
||||||
t->info = btf_type_info(BTF_KIND_DECL_TAG, 0, false);
|
t->info = btf_type_info(BTF_KIND_DECL_TAG, 0, kflag);
|
||||||
t->type = ref_type_id;
|
t->type = ref_type_id;
|
||||||
btf_decl_tag(t)->component_idx = component_idx;
|
btf_decl_tag(t)->component_idx = component_idx;
|
||||||
|
|
||||||
return btf_commit_type(btf, sz);
|
return btf_commit_type(btf, sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Append new BTF_KIND_DECL_TAG type with:
|
||||||
|
* - *value* - non-empty/non-NULL string;
|
||||||
|
* - *ref_type_id* - referenced type ID, it might not exist yet;
|
||||||
|
* - *component_idx* - -1 for tagging reference type, otherwise struct/union
|
||||||
|
* member or function argument index;
|
||||||
|
* Returns:
|
||||||
|
* - >0, type ID of newly added BTF type;
|
||||||
|
* - <0, on error.
|
||||||
|
*/
|
||||||
|
int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id,
|
||||||
|
int component_idx)
|
||||||
|
{
|
||||||
|
return btf_add_decl_tag(btf, value, ref_type_id, component_idx, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Append new BTF_KIND_DECL_TAG type with:
|
||||||
|
* - *value* - non-empty/non-NULL string;
|
||||||
|
* - *ref_type_id* - referenced type ID, it might not exist yet;
|
||||||
|
* - *component_idx* - -1 for tagging reference type, otherwise struct/union
|
||||||
|
* member or function argument index;
|
||||||
|
* Set info->kflag to 1, indicating this tag is an __attribute__
|
||||||
|
* Returns:
|
||||||
|
* - >0, type ID of newly added BTF type;
|
||||||
|
* - <0, on error.
|
||||||
|
*/
|
||||||
|
int btf__add_decl_attr(struct btf *btf, const char *value, int ref_type_id,
|
||||||
|
int component_idx)
|
||||||
|
{
|
||||||
|
return btf_add_decl_tag(btf, value, ref_type_id, component_idx, 1);
|
||||||
|
}
|
||||||
|
|
||||||
struct btf_ext_sec_info_param {
|
struct btf_ext_sec_info_param {
|
||||||
__u32 off;
|
__u32 off;
|
||||||
__u32 len;
|
__u32 len;
|
||||||
|
|||||||
@@ -227,6 +227,7 @@ LIBBPF_API int btf__add_volatile(struct btf *btf, int ref_type_id);
|
|||||||
LIBBPF_API int btf__add_const(struct btf *btf, int ref_type_id);
|
LIBBPF_API int btf__add_const(struct btf *btf, int ref_type_id);
|
||||||
LIBBPF_API int btf__add_restrict(struct btf *btf, int ref_type_id);
|
LIBBPF_API int btf__add_restrict(struct btf *btf, int ref_type_id);
|
||||||
LIBBPF_API int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id);
|
LIBBPF_API int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id);
|
||||||
|
LIBBPF_API int btf__add_type_attr(struct btf *btf, const char *value, int ref_type_id);
|
||||||
|
|
||||||
/* func and func_proto construction APIs */
|
/* func and func_proto construction APIs */
|
||||||
LIBBPF_API int btf__add_func(struct btf *btf, const char *name,
|
LIBBPF_API int btf__add_func(struct btf *btf, const char *name,
|
||||||
@@ -243,6 +244,8 @@ LIBBPF_API int btf__add_datasec_var_info(struct btf *btf, int var_type_id,
|
|||||||
/* tag construction API */
|
/* tag construction API */
|
||||||
LIBBPF_API int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id,
|
LIBBPF_API int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id,
|
||||||
int component_idx);
|
int component_idx);
|
||||||
|
LIBBPF_API int btf__add_decl_attr(struct btf *btf, const char *value, int ref_type_id,
|
||||||
|
int component_idx);
|
||||||
|
|
||||||
struct btf_dedup_opts {
|
struct btf_dedup_opts {
|
||||||
size_t sz;
|
size_t sz;
|
||||||
|
|||||||
@@ -436,4 +436,6 @@ LIBBPF_1.6.0 {
|
|||||||
bpf_linker__add_buf;
|
bpf_linker__add_buf;
|
||||||
bpf_linker__add_fd;
|
bpf_linker__add_fd;
|
||||||
bpf_linker__new_fd;
|
bpf_linker__new_fd;
|
||||||
|
btf__add_decl_attr;
|
||||||
|
btf__add_type_attr;
|
||||||
} LIBBPF_1.5.0;
|
} LIBBPF_1.5.0;
|
||||||
|
|||||||
Reference in New Issue
Block a user