All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC][PATCH] Make BPF support optional
@ 2022-01-22 17:51 Domenico Andreoli
  0 siblings, 0 replies; only message in thread
From: Domenico Andreoli @ 2022-01-22 17:51 UTC (permalink / raw)
  To: dwarves

Non-linux systems also can make good use of these tools. This patch
adds option LIBBPF_ENABLED (default: on) so to opt-out BPF when needed.

Signed-off-by: Domenico Andreoli <domenico.andreoli@linux.com>
---
 CMakeLists.txt |   61 +++++++++++++++++++++++++++++++++------------------------
 dwarves.c      |    2 ++
 pahole.c       |   34 ++++++++++++++++++++++++++------
 3 files changed, 65 insertions(+), 32 deletions(-)

Index: b/CMakeLists.txt
===================================================================
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,23 +2,30 @@ project(pahole C)
 cmake_minimum_required(VERSION 2.8.12)
 cmake_policy(SET CMP0005 NEW)
 
-option(LIBBPF_EMBEDDED "Use the embedded version of libbpf instead of searching it via pkg-config" ON)
-if (NOT LIBBPF_EMBEDDED)
-	find_package(PkgConfig REQUIRED)
-	if(PKGCONFIG_FOUND)
-		pkg_check_modules(LIBBPF REQUIRED libbpf>=0.4.0)
+option(LIBBPF_ENABLED "Enable BPF support" ON)
+if(LIBBPF_ENABLED)
+	option(LIBBPF_EMBEDDED "Use the embedded version of libbpf instead of searching it via pkg-config" ON)
+	if(NOT LIBBPF_EMBEDDED)
+		find_package(PkgConfig REQUIRED)
+		if(PKGCONFIG_FOUND)
+			pkg_check_modules(LIBBPF REQUIRED libbpf>=0.4.0)
+		endif()
 	endif()
+else()
+	message(STATUS "Disabled BPF support")
 endif()
 
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}
 		    ${CMAKE_CURRENT_SOURCE_DIR})
-if(NOT LIBBPF_FOUND)
-	# Allows to use 'system' style #include with both embedded and system libbpf
-	INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib/include)
-	INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib/bpf/include/uapi)
-else()
-	INCLUDE_DIRECTORIES(${LIBBPF_INCLUDE_DIRS})
-	LINK_DIRECTORIES(${LIBBPF_LIBRARY_DIRS})
+if(LIBBPF_ENABLED)
+	if(LIBBPF_FOUND)
+		INCLUDE_DIRECTORIES(${LIBBPF_INCLUDE_DIRS})
+		LINK_DIRECTORIES(${LIBBPF_LIBRARY_DIRS})
+	else()
+		# Allows to use 'system' style #include with both embedded and system libbpf
+		INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib/include)
+		INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib/bpf/include/uapi)
+	endif()
 endif()
 
 # Try to parse this later, Helio just showed me a KDE4 example to support
@@ -79,7 +86,7 @@ if(GIT_FOUND AND EXISTS "${PROJECT_SOURC
 		endif()
 	endif()
 endif()
-if(NOT LIBBPF_FOUND AND NOT EXISTS "${PROJECT_SOURCE_DIR}/lib/bpf/src/btf.h")
+if(LIBBPF_ENABLED AND NOT LIBBPF_FOUND AND NOT EXISTS "${PROJECT_SOURCE_DIR}/lib/bpf/src/btf.h")
 	message(FATAL_ERROR "The submodules were not downloaded! GIT_SUBMODULE was turned off or failed. Please update submodules and try again.")
 endif()
 
@@ -104,21 +111,23 @@ endif()
 
 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64")
 
-if (NOT LIBBPF_FOUND)
-	file(GLOB libbpf_sources "lib/bpf/src/*.c")
-	add_library(bpf OBJECT ${libbpf_sources})
-	set_property(TARGET bpf PROPERTY POSITION_INDEPENDENT_CODE 1)
-	target_include_directories(bpf PRIVATE
-				   ${CMAKE_CURRENT_SOURCE_DIR}/lib/bpf/include
-				   ${CMAKE_CURRENT_SOURCE_DIR}/lib/bpf/include/uapi)
-endif()
+set(dwarves_LIB_SRCS dwarves.c dwarves_fprintf.c gobuffer.c ctf_loader.c libctf.c
+                     dwarf_loader.c dutil.c elf_symtab.c rbtree.c)
 
-set(dwarves_LIB_SRCS dwarves.c dwarves_fprintf.c gobuffer.c
-		     ctf_loader.c libctf.c btf_encoder.c btf_loader.c
-		     dwarf_loader.c dutil.c elf_symtab.c rbtree.c)
-if (NOT LIBBPF_FOUND)
-	list(APPEND dwarves_LIB_SRCS $<TARGET_OBJECTS:bpf>)
+if(LIBBPF_ENABLED)
+	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_BPF")
+	list(APPEND dwarves_LIB_SRCS btf_encoder.c btf_loader.c)
+	if(NOT LIBBPF_FOUND)
+		file(GLOB libbpf_sources "lib/bpf/src/*.c")
+		add_library(bpf OBJECT ${libbpf_sources})
+		set_property(TARGET bpf PROPERTY POSITION_INDEPENDENT_CODE 1)
+		target_include_directories(bpf PRIVATE
+					   ${CMAKE_CURRENT_SOURCE_DIR}/lib/bpf/include
+					   ${CMAKE_CURRENT_SOURCE_DIR}/lib/bpf/include/uapi)
+		list(APPEND dwarves_LIB_SRCS $<TARGET_OBJECTS:bpf>)
+	endif()
 endif()
+
 add_library(dwarves ${dwarves_LIB_SRCS})
 set_target_properties(dwarves PROPERTIES VERSION 1.0.0 SOVERSION 1)
 set_target_properties(dwarves PROPERTIES INTERFACE_LINK_LIBRARIES "")
Index: b/pahole.c
===================================================================
--- a/pahole.c
+++ b/pahole.c
@@ -19,26 +19,32 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+
+#ifdef HAVE_BPF
 #include <bpf/btf.h>
 #include "bpf/libbpf.h"
+#include "btf_encoder.h"
+#endif
 
 #include "dwarves_reorganize.h"
 #include "dwarves.h"
 #include "dutil.h"
 //#include "ctf_encoder.h" FIXME: disabled, probably its better to move to Oracle's libctf
-#include "btf_encoder.h"
 
+static bool btf_encode;
+static bool ctf_encode;
+#ifdef HAVE_BPF
 static struct btf_encoder *btf_encoder;
 static char *detached_btf_filename;
-static bool btf_encode;
 static bool btf_gen_floats;
-static bool ctf_encode;
-static bool sort_output;
-static bool need_resort;
-static bool first_obj_only;
 static bool skip_encoding_btf_vars;
 static bool btf_encode_force;
 static const char *base_btf_file;
+#endif
+
+static bool sort_output;
+static bool need_resort;
+static bool first_obj_only;
 
 static const char *prettify_input_filename;
 static FILE *prettify_input;
@@ -1533,6 +1539,7 @@ static error_t pahole__options_parser(in
 		  fputs("pahole: Multithreading requires elfutils >= 0.178. Continuing with a single thread...\n", stderr);
 #endif
 							break;
+#ifdef HAVE_BPF
 	case ARGP_btf_encode_detached:
 		  detached_btf_filename = arg; // fallthru
 	case 'J': btf_encode = 1;
@@ -1544,6 +1551,7 @@ static error_t pahole__options_parser(in
 		  conf_load.ignore_labels	     = true;
 		  conf_load.use_obstack		     = true;
 		  no_bitfield_type_recode = true;	break;
+#endif
 	case 'l': conf.show_first_biggest_size_base_type_member = 1;	break;
 	case 'M': conf.show_only_data_members = 1;	break;
 	case 'm': stats_formatter = nr_methods_formatter; break;
@@ -1617,21 +1625,25 @@ static error_t pahole__options_parser(in
 		conf.range = arg;			break;
 	case ARGP_header_type:
 		conf.header_type = arg;			break;
+#ifdef HAVE_BPF
 	case ARGP_skip_encoding_btf_vars:
 		skip_encoding_btf_vars = true;		break;
 	case ARGP_btf_encode_force:
 		btf_encode_force = true;		break;
 	case ARGP_btf_base:
 		base_btf_file = arg;			break;
+#endif
 	case ARGP_kabi_prefix:
 		conf_load.kabi_prefix = arg;
 		conf_load.kabi_prefix_len = strlen(arg); break;
 	case ARGP_numeric_version:
 		print_numeric_version = true;		break;
+#ifdef HAVE_BPF
 	case ARGP_btf_gen_floats:
 		btf_gen_floats = true;			break;
 	case ARGP_btf_gen_all:
 		btf_gen_floats = true;			break;
+#endif
 	case ARGP_with_flexible_array:
 		show_with_flexible_array = true;	break;
 	case ARGP_prettify_input_filename:
@@ -2792,6 +2804,7 @@ static enum load_steal_kind pahole_steal
 		cu__fprintf_ptr_table_stats_csv(cu, stderr);
 	}
 
+#ifdef HAVE_BTF
 	if (btf_encode) {
 		static pthread_mutex_t btf_lock = PTHREAD_MUTEX_INITIALIZER;
 
@@ -2820,6 +2833,7 @@ out_btf:
 		pthread_mutex_unlock(&btf_lock);
 		return ret;
 	}
+#endif
 #if 0
 	if (ctf_encode) {
 		cu__encode_ctf(cu, global_verbose);
@@ -3153,6 +3167,7 @@ int main(int argc, char *argv[])
 		}
 	}
 
+#ifdef HAVE_BPF
 	if (base_btf_file) {
 		conf_load.base_btf = btf__parse(base_btf_file, NULL);
 		if (libbpf_get_error(conf_load.base_btf)) {
@@ -3165,6 +3180,7 @@ int main(int argc, char *argv[])
 			conf_load.format_path = "btf";
 		}
 	}
+#endif
 
 	struct cus *cus = cus__new();
 	if (cus == NULL) {
@@ -3187,6 +3203,7 @@ try_sole_arg_as_class_names:
 	if (class_name && populate_class_names())
 		goto out_dwarves_exit;
 
+#ifdef HAVE_BPF
 	if (base_btf_file == NULL) {
 		const char *filename = argv[remaining];
 
@@ -3202,6 +3219,7 @@ try_sole_arg_as_class_names:
 			}
 		}
 	}
+#endif
 
 	err = cus__load_files(cus, &conf_load, argv + remaining);
 	if (err != 0) {
@@ -3261,6 +3279,7 @@ try_sole_arg_as_class_names:
 	type_instance__delete(header);
 	header = NULL;
 
+#ifdef HAVE_BTF
 	if (btf_encode) {
 		err = btf_encoder__encode(btf_encoder);
 		if (err) {
@@ -3268,6 +3287,7 @@ try_sole_arg_as_class_names:
 			goto out_cus_delete;
 		}
 	}
+#endif
 out_ok:
 	if (stats_formatter != NULL)
 		print_stats();
@@ -3277,9 +3297,11 @@ out_cus_delete:
 #ifdef DEBUG_CHECK_LEAKS
 	cus__delete(cus);
 	structures__delete();
+#ifdef HAVE_BTF
 	btf__free(conf_load.base_btf);
 	conf_load.base_btf = NULL;
 #endif
+#endif
 out_dwarves_exit:
 	if (prettify_input && prettify_input != stdin) {
 		fclose(prettify_input);
Index: b/dwarves.c
===================================================================
--- a/dwarves.c
+++ b/dwarves.c
@@ -1979,8 +1979,10 @@ extern struct debug_fmt_ops dwarf__ops,
 
 static struct debug_fmt_ops *debug_fmt_table[] = {
 	&dwarf__ops,
+#ifdef HAVE_BPF
 	&btf__ops,
 	&ctf__ops,
+#endif
 	NULL,
 };
 
-- 
rsa4096: 3B10 0CA1 8674 ACBA B4FE  FCD2 CE5B CF17 9960 DE13
ed25519: FFB4 0CC3 7F2E 091D F7DA  356E CC79 2832 ED38 CB05

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-01-22 17:51 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-01-22 17:51 [RFC][PATCH] Make BPF support optional Domenico Andreoli

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.