[DTrace-devel] [PATCH] btf: support compilation in older environments

Kris Van Hees kris.van.hees at oracle.com
Wed Nov 22 15:43:26 UTC 2023


Compilation against older kernels (before BTF supported BTF_KIND_ENUM64,
BTF_KIND_DECL_TAG, BT_KIND_TYPE_TAG) and/or libdtrace-ctf instead of
libctf was failing.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_btf.c | 22 +++++++++++++++++++---
 libdtrace/dt_btf.h |  1 -
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/libdtrace/dt_btf.c b/libdtrace/dt_btf.c
index 2cb26aa5..75a44df8 100644
--- a/libdtrace/dt_btf.c
+++ b/libdtrace/dt_btf.c
@@ -7,7 +7,6 @@
 
 #include <assert.h>
 #include <byteswap.h>
-#include <ctf.h>
 #include <errno.h>
 #include <stdio.h>
 #include <sys/mman.h>
@@ -24,7 +23,9 @@ typedef struct btf_member	btf_member_t;
 typedef struct btf_param	btf_param_t;
 typedef struct btf_var		btf_var_t;
 typedef struct btf_var_secinfo	btf_var_secinfo_t;
+#if !defined(BTF_KIND_MAX) || defined(BTF_KIND_DECL_TAG)
 typedef struct btf_decl_tag	btf_decl_tag_t;
+#endif
 typedef struct btf_enum64	btf_enum64_t;
 
 struct dt_btf {
@@ -145,10 +146,18 @@ dt_btf_type_size(const char *ptr)
 		return size + sizeof(btf_var_t);
 	case BTF_KIND_DATASEC:
 		return size + vlen * sizeof(btf_var_secinfo_t);
+#if !defined(BTF_KIND_MAX) || defined(BTF_KIND_DECL_TAG)
 	case BTF_KIND_DECL_TAG:
 		return size + sizeof(btf_decl_tag_t);
+#endif
+#if !defined(BTF_KIND_MAX) || defined(BTF_KIND_TYPE_TAG)
+	case BTF_KIND_TYPE_TAG:
+		return size;
+#endif
+#if !defined(BTF_KIND_MAX) || defined(BTF_KIND_ENUM64)
 	case BTF_KIND_ENUM64:
 		return size + vlen * sizeof(btf_enum64_t);
+#endif
 	case BTF_KIND_PTR:
 	case BTF_KIND_FWD:
 	case BTF_KIND_TYPEDEF:
@@ -157,7 +166,6 @@ dt_btf_type_size(const char *ptr)
 	case BTF_KIND_RESTRICT:
 	case BTF_KIND_FUNC:
 	case BTF_KIND_FLOAT:
-	case BTF_KIND_TYPE_TAG:
 		return size;
 	default:
 		return -EINVAL;
@@ -387,7 +395,9 @@ dt_btf_add_to_ctf(dtrace_hdl_t *dtp, dt_btf_t *btf, ctf_dict_t *ctf,
 		/* Do we already have this type? */
 		switch (kind) {
 		case BTF_KIND_ENUM:
+#if !defined(BTF_KIND_MAX) || defined(BTF_KIND_ENUM64)
 		case BTF_KIND_ENUM64:
+#endif
 			if (snprintf(n, sizeof(n), "enum %s",
 				     name == NULL ? "(anon)" : name) < 0)
 				return dt_ctf_set_errno(dtp, ECTF_NAMELEN);
@@ -656,10 +666,16 @@ dt_btf_add_to_ctf(dtrace_hdl_t *dtp, dt_btf_t *btf, ctf_dict_t *ctf,
 	}
 	case BTF_KIND_VAR:
 	case BTF_KIND_DATASEC:
+#if !defined(BTF_KIND_MAX) || defined(BTF_KIND_DECL_TAG)
 	case BTF_KIND_DECL_TAG:
+#endif
+#if !defined(BTF_KIND_MAX) || defined(BTF_KIND_TYPE_TAG)
 	case BTF_KIND_TYPE_TAG:
-	case BTF_KIND_FUNC:
+#endif
+#if !defined(BTF_KIND_MAX) || defined(BTF_KIND_ENUM64)
 	case BTF_KIND_ENUM64:
+#endif
+	case BTF_KIND_FUNC:
 		return btf->ctfids[0];		/* Ignored for CTF */
 	default:
 		return dt_ctf_error(dtp, ctf);
diff --git a/libdtrace/dt_btf.h b/libdtrace/dt_btf.h
index 3db4203a..863fa470 100644
--- a/libdtrace/dt_btf.h
+++ b/libdtrace/dt_btf.h
@@ -8,7 +8,6 @@
 #ifndef	_DT_BTF_H
 #define	_DT_BTF_H
 
-#include <ctf.h>
 #include <dt_impl.h>
 
 #ifdef	__cplusplus
-- 
2.39.3




More information about the DTrace-devel mailing list