diff options
-rw-r--r-- | libctf/ChangeLog | 5 | ||||
-rw-r--r-- | libctf/ctf-link.c | 30 |
2 files changed, 35 insertions, 0 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog index f11b511..db75fd5 100644 --- a/libctf/ChangeLog +++ b/libctf/ChangeLog @@ -1,5 +1,10 @@ 2021-01-05 Nick Alcock <nick.alcock@oracle.com> + * ctf-link.c (ctf_link_warn_outdated_inputs): New. + (ctf_link_write): Call it. + +2021-01-05 Nick Alcock <nick.alcock@oracle.com> + * testsuite/libctf-lookup/enum-symbol.lk: New symbol-lookup test. * testsuite/libctf-lookup/enum-symbol-ctf.c: New CTF input. * testsuite/libctf-lookup/enum-symbol.c: New lookup test. diff --git a/libctf/ctf-link.c b/libctf/ctf-link.c index 14ed322..5384b20 100644 --- a/libctf/ctf-link.c +++ b/libctf/ctf-link.c @@ -2004,6 +2004,34 @@ ctf_change_parent_name (void *key _libctf_unused_, void *value, void *arg) ctf_parent_name_set (fp, name); } +/* Warn if we may suffer information loss because the CTF input files are too + old. Usually we provide complete backward compatibility, but compiler + changes etc which never hit a release may have a flag in the header that + simply prevents those changes from being used. */ +static void +ctf_link_warn_outdated_inputs (ctf_dict_t *fp) +{ + ctf_next_t *i = NULL; + void *name_; + void *ifp_; + int err; + + while ((err = ctf_dynhash_next (fp->ctf_link_inputs, &i, &name_, &ifp_)) == 0) + { + const char *name = (const char *) name_; + ctf_dict_t *ifp = (ctf_dict_t *) ifp_; + + if (!(ifp->ctf_header->cth_flags & CTF_F_NEWFUNCINFO) + && (ifp->ctf_header->cth_varoff - ifp->ctf_header->cth_funcoff) > 0) + ctf_err_warn (ifp, 1, 0, _("linker input %s has CTF func info but uses " + "an old, unreleased func info format: " + "this func info section will be dropped."), + name); + } + if (err != ECTF_NEXT_END) + ctf_err_warn (fp, 0, err, _("error checking for outdated inputs")); +} + /* Write out a CTF archive (if there are per-CU CTF files) or a CTF file (otherwise) into a new dynamically-allocated string, and return it. Members with sizes above THRESHOLD are compressed. */ @@ -2023,6 +2051,8 @@ ctf_link_write (ctf_dict_t *fp, size_t *size, size_t threshold) memset (&arg, 0, sizeof (ctf_name_list_accum_cb_arg_t)); arg.fp = fp; + ctf_link_warn_outdated_inputs (fp); + if (fp->ctf_link_outputs) { ctf_dynhash_iter (fp->ctf_link_outputs, ctf_accumulate_archive_names, &arg); |