aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/ChangeLog5
-rw-r--r--include/ctf-api.h6
-rw-r--r--libctf/ChangeLog9
-rw-r--r--libctf/ctf-create.c2
-rw-r--r--libctf/ctf-impl.h7
-rw-r--r--libctf/ctf-link.c19
-rw-r--r--libctf/libctf.ver1
7 files changed, 48 insertions, 1 deletions
diff --git a/include/ChangeLog b/include/ChangeLog
index 60d7b9f..3ddc264 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,5 +1,10 @@
2020-07-22 Nick Alcock <nick.alcock@oracle.com>
+ * ctf-api.h (ctf_link_variable_filter_t): New.
+ (ctf_link_set_variable_filter): Likewise.
+
+2020-07-22 Nick Alcock <nick.alcock@oracle.com>
+
* ctf-api.h (CTF_LINK_EMPTY_CU_MAPPINGS): New.
2020-07-22 Nick Alcock <nick.alcock@oracle.com>
diff --git a/include/ctf-api.h b/include/ctf-api.h
index 700a2b1..70bf7e0 100644
--- a/include/ctf-api.h
+++ b/include/ctf-api.h
@@ -458,6 +458,12 @@ extern int ctf_compress_write (ctf_file_t * fp, int fd);
extern unsigned char *ctf_write_mem (ctf_file_t *, size_t *, size_t threshold);
extern int ctf_link_add_ctf (ctf_file_t *, ctf_archive_t *, const char *);
+/* The variable filter should return nonzero if a variable should not
+ appear in the output. */
+typedef int ctf_link_variable_filter_f (ctf_file_t *, const char *, ctf_id_t,
+ void *);
+extern int ctf_link_set_variable_filter (ctf_file_t *,
+ ctf_link_variable_filter_f *, void *);
extern int ctf_link (ctf_file_t *, int flags);
typedef const char *ctf_link_strtab_string_f (uint32_t *offset, void *arg);
extern int ctf_link_add_strtab (ctf_file_t *, ctf_link_strtab_string_f *,
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index d664998..0210b45 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -1,5 +1,14 @@
2020-07-22 Nick Alcock <nick.alcock@oracle.com>
+ * libctf.ver (ctf_link_set_variable_filter): Add.
+ * ctf-impl.h (ctf_file_t) <ctf_link_variable_filter>: New.
+ <ctf_link_variable_filter_arg>: Likewise.
+ * ctf-create.c (ctf_serialize): Adjust.
+ * ctf-link.c (ctf_link_set_variable_filter): New, set it.
+ (ctf_link_one_variable): Call it if set.
+
+2020-07-22 Nick Alcock <nick.alcock@oracle.com>
+
* ctf-link.c (ctf_link_one_variable): Check the dst_type for
conflicts, not the source type.
diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c
index 10c6bbf..001e625 100644
--- a/libctf/ctf-create.c
+++ b/libctf/ctf-create.c
@@ -543,6 +543,8 @@ ctf_serialize (ctf_file_t *fp)
nfp->ctf_link_type_mapping = fp->ctf_link_type_mapping;
nfp->ctf_link_memb_name_changer = fp->ctf_link_memb_name_changer;
nfp->ctf_link_memb_name_changer_arg = fp->ctf_link_memb_name_changer_arg;
+ nfp->ctf_link_variable_filter = fp->ctf_link_variable_filter;
+ nfp->ctf_link_variable_filter_arg = fp->ctf_link_variable_filter_arg;
nfp->ctf_link_flags = fp->ctf_link_flags;
nfp->ctf_snapshot_lu = fp->ctf_snapshots;
diff --git a/libctf/ctf-impl.h b/libctf/ctf-impl.h
index 46bceb4..7f47c68 100644
--- a/libctf/ctf-impl.h
+++ b/libctf/ctf-impl.h
@@ -333,7 +333,12 @@ struct ctf_file
/* Allow the caller to change the name of link archive members. */
ctf_link_memb_name_changer_f *ctf_link_memb_name_changer;
- void *ctf_link_memb_name_changer_arg; /* Argument for it. */
+ void *ctf_link_memb_name_changer_arg; /* Argument for it. */
+
+ /* Allow the caller to filter out variables they don't care about. */
+ ctf_link_variable_filter_f *ctf_link_variable_filter;
+ void *ctf_link_variable_filter_arg; /* Argument for it. */
+
ctf_dynhash_t *ctf_add_processing; /* Types ctf_add_type is working on now. */
char *ctf_tmp_typeslice; /* Storage for slicing up type names. */
size_t ctf_tmp_typeslicelen; /* Size of the typeslice. */
diff --git a/libctf/ctf-link.c b/libctf/ctf-link.c
index 7b0ac38..886106c 100644
--- a/libctf/ctf-link.c
+++ b/libctf/ctf-link.c
@@ -528,6 +528,16 @@ ctf_link_one_type (ctf_id_t type, int isroot _libctf_unused_, void *arg_)
return 0; /* As above: do not lose types. */
}
+/* Set a function which is used to filter out unwanted variables from the link. */
+int
+ctf_link_set_variable_filter (ctf_file_t *fp, ctf_link_variable_filter_f *filter,
+ void *arg)
+{
+ fp->ctf_link_variable_filter = filter;
+ fp->ctf_link_variable_filter_arg = arg;
+ return 0;
+}
+
/* Check if we can safely add a variable with the given type to this container. */
static int
@@ -564,6 +574,15 @@ ctf_link_one_variable (const char *name, ctf_id_t type, void *arg_)
ctf_file_t *check_fp;
ctf_dvdef_t *dvd;
+ /* See if this variable is filtered out. */
+
+ if (arg->out_fp->ctf_link_variable_filter)
+ {
+ void *farg = arg->out_fp->ctf_link_variable_filter_arg;
+ if (arg->out_fp->ctf_link_variable_filter (arg->in_fp, name, type, farg))
+ return 0;
+ }
+
/* In unconflicted link mode, if this type is mapped to a type in the parent
container, we want to try to add to that first: if it reports a duplicate,
or if the type is in a child already, add straight to the child. */
diff --git a/libctf/libctf.ver b/libctf/libctf.ver
index 7eed14a..62f9977 100644
--- a/libctf/libctf.ver
+++ b/libctf/libctf.ver
@@ -159,6 +159,7 @@ LIBCTF_1.0 {
ctf_link_add_ctf;
ctf_link_add_cu_mapping;
ctf_link_set_memb_name_changer;
+ ctf_link_set_variable_filter;
ctf_link;
ctf_link_add_strtab;
ctf_link_shuffle_syms;