+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.
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 *,
+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
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;
/* 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. */
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
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. */
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;