aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2020-06-05 18:15:26 +0100
committerNick Alcock <nick.alcock@oracle.com>2020-07-22 18:02:18 +0100
commit6dd2819ffc282e644e7feb476cc803d4f39d9f17 (patch)
treecbbc466b022a0c522c03f398e374e12aa7ab6655
parent19d4b1addcafc786360c31d02d5ef2b44aef3152 (diff)
downloadfsf-binutils-gdb-6dd2819ffc282e644e7feb476cc803d4f39d9f17.zip
fsf-binutils-gdb-6dd2819ffc282e644e7feb476cc803d4f39d9f17.tar.gz
fsf-binutils-gdb-6dd2819ffc282e644e7feb476cc803d4f39d9f17.tar.bz2
libctf, link: add the ability to filter out variables from the link
The CTF variables section (containing variables that have no corresponding symtab entries) can cause the string table to get very voluminous if the names of variables are long. Some callers want to filter out particular variables they know they won't need. So add a "variable filter" callback that does that: it's passed the name of the variable and a corresponding ctf_file_t / ctf_id_t pair, and should return 1 to filter it out. ld doesn't use this machinery yet, but we could easily add it later if desired. (But see later for a commit that turns off CTF variable- section linking in ld entirely by default.) include/ * ctf-api.h (ctf_link_variable_filter_t): New. (ctf_link_set_variable_filter): Likewise. libctf/ * 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.
-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;