[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