diff mbox series

[bpf-next,2/2] btf: expose API to work with raw btf data

Message ID 20190205194856.967463-3-andriin@fb.com
State Changes Requested
Delegated to: BPF Maintainers
Headers show
Series tools/btf: extends libbpf APIs to work with btf w/o kernel | expand

Commit Message

Andrii Nakryiko Feb. 5, 2019, 7:48 p.m. UTC
This patch exposes two new APIs btf__get_raw_data_size() and
btf__get_raw_data() that allows to get a copy of raw BTF data out of
struct btf. This is useful for external programs that need to manipulate
raw data, e.g., pahole using btf__dedup() to deduplicate BTF type info
and then writing it back to file.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Acked-by: Song Liu <songliubraving@fb.com>
---
 tools/lib/bpf/btf.c      | 10 ++++++++++
 tools/lib/bpf/btf.h      |  2 ++
 tools/lib/bpf/libbpf.map |  2 ++
 3 files changed, 14 insertions(+)

Comments

Yonghong Song Feb. 5, 2019, 10:01 p.m. UTC | #1
On 2/5/19 11:48 AM, Andrii Nakryiko wrote:
> This patch exposes two new APIs btf__get_raw_data_size() and
> btf__get_raw_data() that allows to get a copy of raw BTF data out of
> struct btf. This is useful for external programs that need to manipulate
> raw data, e.g., pahole using btf__dedup() to deduplicate BTF type info
> and then writing it back to file.
> 
> Signed-off-by: Andrii Nakryiko <andriin@fb.com>
> Acked-by: Song Liu <songliubraving@fb.com>

Acked-by: Yonghong Song <yhs@fb.com>

> ---
>   tools/lib/bpf/btf.c      | 10 ++++++++++
>   tools/lib/bpf/btf.h      |  2 ++
>   tools/lib/bpf/libbpf.map |  2 ++
>   3 files changed, 14 insertions(+)
> 
> diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c
> index 065d51fa63e5..6491d440c9a7 100644
> --- a/tools/lib/bpf/btf.c
> +++ b/tools/lib/bpf/btf.c
> @@ -437,6 +437,16 @@ int btf__fd(const struct btf *btf)
>   	return btf->fd;
>   }
>   
> +__u32 btf__get_raw_data_size(const struct btf *btf)
> +{
> +	return btf->data_size;
> +}
> +
> +void btf__get_raw_data(const struct btf *btf, char *data)
> +{
> +	memcpy(data, btf->data, btf->data_size);
> +}
> +
>   void btf__get_strings(const struct btf *btf, const char **strings,
>   		      __u32 *str_len)
>   {
> diff --git a/tools/lib/bpf/btf.h b/tools/lib/bpf/btf.h
> index e8410887f93a..d46f680b9416 100644
> --- a/tools/lib/bpf/btf.h
> +++ b/tools/lib/bpf/btf.h
> @@ -66,6 +66,8 @@ LIBBPF_API const struct btf_type *btf__type_by_id(const struct btf *btf,
>   LIBBPF_API __s64 btf__resolve_size(const struct btf *btf, __u32 type_id);
>   LIBBPF_API int btf__resolve_type(const struct btf *btf, __u32 type_id);
>   LIBBPF_API int btf__fd(const struct btf *btf);
> +LIBBPF_API __u32 btf__get_raw_data_size(const struct btf *btf);
> +LIBBPF_API void btf__get_raw_data(const struct btf *btf, char *data);
>   LIBBPF_API void btf__get_strings(const struct btf *btf, const char **strings,
>   				 __u32 *str_len);
>   LIBBPF_API const char *btf__name_by_offset(const struct btf *btf, __u32 offset);
> diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map
> index ffa1fe044f6a..873a26cd714d 100644
> --- a/tools/lib/bpf/libbpf.map
> +++ b/tools/lib/bpf/libbpf.map
> @@ -137,6 +137,8 @@ LIBBPF_0.0.2 {
>   		btf__load;
>   		btf__get_map_kv_tids;
>   		btf__get_nr_types;
> +		btf__get_raw_data;
> +		btf__get_raw_data_size;
>   		btf__get_strings;
>   		btf_ext__free;
>   		btf_ext__func_info_rec_size;
>
diff mbox series

Patch

diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c
index 065d51fa63e5..6491d440c9a7 100644
--- a/tools/lib/bpf/btf.c
+++ b/tools/lib/bpf/btf.c
@@ -437,6 +437,16 @@  int btf__fd(const struct btf *btf)
 	return btf->fd;
 }
 
+__u32 btf__get_raw_data_size(const struct btf *btf)
+{
+	return btf->data_size;
+}
+
+void btf__get_raw_data(const struct btf *btf, char *data)
+{
+	memcpy(data, btf->data, btf->data_size);
+}
+
 void btf__get_strings(const struct btf *btf, const char **strings,
 		      __u32 *str_len)
 {
diff --git a/tools/lib/bpf/btf.h b/tools/lib/bpf/btf.h
index e8410887f93a..d46f680b9416 100644
--- a/tools/lib/bpf/btf.h
+++ b/tools/lib/bpf/btf.h
@@ -66,6 +66,8 @@  LIBBPF_API const struct btf_type *btf__type_by_id(const struct btf *btf,
 LIBBPF_API __s64 btf__resolve_size(const struct btf *btf, __u32 type_id);
 LIBBPF_API int btf__resolve_type(const struct btf *btf, __u32 type_id);
 LIBBPF_API int btf__fd(const struct btf *btf);
+LIBBPF_API __u32 btf__get_raw_data_size(const struct btf *btf);
+LIBBPF_API void btf__get_raw_data(const struct btf *btf, char *data);
 LIBBPF_API void btf__get_strings(const struct btf *btf, const char **strings,
 				 __u32 *str_len);
 LIBBPF_API const char *btf__name_by_offset(const struct btf *btf, __u32 offset);
diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map
index ffa1fe044f6a..873a26cd714d 100644
--- a/tools/lib/bpf/libbpf.map
+++ b/tools/lib/bpf/libbpf.map
@@ -137,6 +137,8 @@  LIBBPF_0.0.2 {
 		btf__load;
 		btf__get_map_kv_tids;
 		btf__get_nr_types;
+		btf__get_raw_data;
+		btf__get_raw_data_size;
 		btf__get_strings;
 		btf_ext__free;
 		btf_ext__func_info_rec_size;