diff options
Diffstat (limited to 'tools/lib')
| -rw-r--r-- | tools/lib/bpf/btf.c | 48 | ||||
| -rw-r--r-- | tools/lib/bpf/btf.h | 2 | ||||
| -rw-r--r-- | tools/lib/bpf/libbpf.map | 1 | 
3 files changed, 51 insertions, 0 deletions
diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c index fe087592ad35..d30e67e7e1e5 100644 --- a/tools/lib/bpf/btf.c +++ b/tools/lib/bpf/btf.c @@ -1629,6 +1629,54 @@ static int btf_commit_type(struct btf *btf, int data_sz)  	return btf->start_id + btf->nr_types - 1;  } +struct btf_pipe { +	const struct btf *src; +	struct btf *dst; +}; + +static int btf_rewrite_str(__u32 *str_off, void *ctx) +{ +	struct btf_pipe *p = ctx; +	int off; + +	if (!*str_off) /* nothing to do for empty strings */ +		return 0; + +	off = btf__add_str(p->dst, btf__str_by_offset(p->src, *str_off)); +	if (off < 0) +		return off; + +	*str_off = off; +	return 0; +} + +int btf__add_type(struct btf *btf, const struct btf *src_btf, const struct btf_type *src_type) +{ +	struct btf_pipe p = { .src = src_btf, .dst = btf }; +	struct btf_type *t; +	int sz, err; + +	sz = btf_type_size(src_type); +	if (sz < 0) +		return sz; + +	/* deconstruct BTF, if necessary, and invalidate raw_data */ +	if (btf_ensure_modifiable(btf)) +		return -ENOMEM; + +	t = btf_add_type_mem(btf, sz); +	if (!t) +		return -ENOMEM; + +	memcpy(t, src_type, sz); + +	err = btf_type_visit_str_offs(t, btf_rewrite_str, &p); +	if (err) +		return err; + +	return btf_commit_type(btf, sz); +} +  /*   * Append new BTF_KIND_INT type with:   *   - *name* - non-empty, non-NULL type name; diff --git a/tools/lib/bpf/btf.h b/tools/lib/bpf/btf.h index 029a9cfc8c2d..3b0b17ba94a1 100644 --- a/tools/lib/bpf/btf.h +++ b/tools/lib/bpf/btf.h @@ -93,6 +93,8 @@ LIBBPF_API struct btf *libbpf_find_kernel_btf(void);  LIBBPF_API int btf__find_str(struct btf *btf, const char *s);  LIBBPF_API int btf__add_str(struct btf *btf, const char *s); +LIBBPF_API int btf__add_type(struct btf *btf, const struct btf *src_btf, +			     const struct btf_type *src_type);  LIBBPF_API int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding);  LIBBPF_API int btf__add_float(struct btf *btf, const char *name, size_t byte_sz); diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map index ec898f464ab9..d31d8c968097 100644 --- a/tools/lib/bpf/libbpf.map +++ b/tools/lib/bpf/libbpf.map @@ -354,4 +354,5 @@ LIBBPF_0.3.0 {  LIBBPF_0.4.0 {  	global:  		btf__add_float; +		btf__add_type;  } LIBBPF_0.3.0;  |