diff options
-rw-r--r-- | include/ChangeLog | 5 | ||||
-rw-r--r-- | include/ctf-api.h | 6 | ||||
-rw-r--r-- | libctf/ChangeLog | 9 | ||||
-rw-r--r-- | libctf/ctf-create.c | 2 | ||||
-rw-r--r-- | libctf/ctf-impl.h | 7 | ||||
-rw-r--r-- | libctf/ctf-link.c | 19 | ||||
-rw-r--r-- | libctf/libctf.ver | 1 |
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; |