forked from mirrors/linux
		
	libbpf: add btf_dump API for BTF-to-C conversion
BTF contains enough type information to allow generating valid compilable C header w/ correct layout of structs/unions and all the typedef/enum definitions. This patch adds a new "object" - btf_dump to facilitate dumping BTF as valid C. btf_dump__dump_type() is the main API which takes care of dumping out (through user-provided printf-like callback function) C definitions for given type ID and it's required dependencies. This allows for not just dumping out entirety of BTF types, but also selective filtering based on user-provided criterias w/ minimal set of dependent types. Signed-off-by: Andrii Nakryiko <andriin@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
		
							parent
							
								
									2fc3fc0bcd
								
							
						
					
					
						commit
						351131b51c
					
				
					 4 changed files with 1359 additions and 1 deletions
				
			
		| 
						 | 
					@ -1 +1,3 @@
 | 
				
			||||||
libbpf-y := libbpf.o bpf.o nlattr.o btf.o libbpf_errno.o str_error.o netlink.o bpf_prog_linfo.o libbpf_probes.o xsk.o hashmap.o
 | 
					libbpf-y := libbpf.o bpf.o nlattr.o btf.o libbpf_errno.o str_error.o \
 | 
				
			||||||
 | 
						    netlink.o bpf_prog_linfo.o libbpf_probes.o xsk.o hashmap.o \
 | 
				
			||||||
 | 
						    btf_dump.o
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@
 | 
				
			||||||
#ifndef __LIBBPF_BTF_H
 | 
					#ifndef __LIBBPF_BTF_H
 | 
				
			||||||
#define __LIBBPF_BTF_H
 | 
					#define __LIBBPF_BTF_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdarg.h>
 | 
				
			||||||
#include <linux/types.h>
 | 
					#include <linux/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
| 
						 | 
					@ -102,6 +103,22 @@ struct btf_dedup_opts {
 | 
				
			||||||
LIBBPF_API int btf__dedup(struct btf *btf, struct btf_ext *btf_ext,
 | 
					LIBBPF_API int btf__dedup(struct btf *btf, struct btf_ext *btf_ext,
 | 
				
			||||||
			  const struct btf_dedup_opts *opts);
 | 
								  const struct btf_dedup_opts *opts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct btf_dump;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct btf_dump_opts {
 | 
				
			||||||
 | 
						void *ctx;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef void (*btf_dump_printf_fn_t)(void *ctx, const char *fmt, va_list args);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LIBBPF_API struct btf_dump *btf_dump__new(const struct btf *btf,
 | 
				
			||||||
 | 
										  const struct btf_ext *btf_ext,
 | 
				
			||||||
 | 
										  const struct btf_dump_opts *opts,
 | 
				
			||||||
 | 
										  btf_dump_printf_fn_t printf_fn);
 | 
				
			||||||
 | 
					LIBBPF_API void btf_dump__free(struct btf_dump *d);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LIBBPF_API int btf_dump__dump_type(struct btf_dump *d, __u32 id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
} /* extern "C" */
 | 
					} /* extern "C" */
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1336
									
								
								tools/lib/bpf/btf_dump.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1336
									
								
								tools/lib/bpf/btf_dump.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
					@ -167,5 +167,8 @@ LIBBPF_0.0.3 {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LIBBPF_0.0.4 {
 | 
					LIBBPF_0.0.4 {
 | 
				
			||||||
	global:
 | 
						global:
 | 
				
			||||||
 | 
							btf_dump__dump_type;
 | 
				
			||||||
 | 
							btf_dump__free;
 | 
				
			||||||
 | 
							btf_dump__new;
 | 
				
			||||||
		btf__parse_elf;
 | 
							btf__parse_elf;
 | 
				
			||||||
} LIBBPF_0.0.3;
 | 
					} LIBBPF_0.0.3;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue