mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
139633c307
The naming of the ctf_file_t type in libctf is a historical curiosity. Back in the Solaris days, CTF dictionaries were originally generated as a separate file and then (sometimes) merged into objects: hence the datatype was named ctf_file_t, and known as a "CTF file". Nowadays, raw CTF is essentially never written to a file on its own, and the datatype changed name to a "CTF dictionary" years ago. So the term "CTF file" refers to something that is never a file! This is at best confusing. The type has also historically been known as a 'CTF container", which is even more confusing now that we have CTF archives which are *also* a sort of container (they contain CTF dictionaries), but which are never referred to as containers in the source code. So fix this by completing the renaming, renaming ctf_file_t to ctf_dict_t throughout, and renaming those few functions that refer to CTF files by name (keeping compatibility aliases) to refer to dicts instead. Old users who still refer to ctf_file_t will see (harmless) pointer-compatibility warnings at compile time, but the ABI is unchanged (since C doesn't mangle names, and ctf_file_t was always an opaque type) and things will still compile fine as long as -Werror is not specified. All references to CTF containers and CTF files in the source code are fixed to refer to CTF dicts instead. Further (smaller) renamings of annoyingly-named functions to come, as part of the process of souping up queries across whole archives at once (needed for the function info and data object sections). binutils/ChangeLog 2020-11-20 Nick Alcock <nick.alcock@oracle.com> * objdump.c (dump_ctf_errs): Rename ctf_file_t to ctf_dict_t. (dump_ctf_archive_member): Likewise. (dump_ctf): Likewise. Use ctf_dict_close, not ctf_file_close. * readelf.c (dump_ctf_errs): Rename ctf_file_t to ctf_dict_t. (dump_ctf_archive_member): Likewise. (dump_section_as_ctf): Likewise. Use ctf_dict_close, not ctf_file_close. gdb/ChangeLog 2020-11-20 Nick Alcock <nick.alcock@oracle.com> * ctfread.c: Change uses of ctf_file_t to ctf_dict_t. (ctf_fp_info::~ctf_fp_info): Call ctf_dict_close, not ctf_file_close. include/ChangeLog 2020-11-20 Nick Alcock <nick.alcock@oracle.com> * ctf-api.h (ctf_file_t): Rename to... (ctf_dict_t): ... this. Keep ctf_file_t around for compatibility. (struct ctf_file): Likewise rename to... (struct ctf_dict): ... this. (ctf_file_close): Rename to... (ctf_dict_close): ... this, keeping compatibility function. (ctf_parent_file): Rename to... (ctf_parent_dict): ... this, keeping compatibility function. All callers adjusted. * ctf.h: Rename references to ctf_file_t to ctf_dict_t. (struct ctf_archive) <ctfa_nfiles>: Rename to... <ctfa_ndicts>: ... this. ld/ChangeLog 2020-11-20 Nick Alcock <nick.alcock@oracle.com> * ldlang.c (ctf_output): This is a ctf_dict_t now. (lang_ctf_errs_warnings): Rename ctf_file_t to ctf_dict_t. (ldlang_open_ctf): Adjust comment. (lang_merge_ctf): Use ctf_dict_close, not ctf_file_close. * ldelfgen.h (ldelf_examine_strtab_for_ctf): Rename ctf_file_t to ctf_dict_t. Change opaque declaration accordingly. * ldelfgen.c (ldelf_examine_strtab_for_ctf): Adjust. * ldemul.h (examine_strtab_for_ctf): Likewise. (ldemul_examine_strtab_for_ctf): Likewise. * ldeuml.c (ldemul_examine_strtab_for_ctf): Likewise. libctf/ChangeLog 2020-11-20 Nick Alcock <nick.alcock@oracle.com> * ctf-impl.h: Rename ctf_file_t to ctf_dict_t: all declarations adjusted. (ctf_fileops): Rename to... (ctf_dictops): ... this. (ctf_dedup_t) <cd_id_to_file_t>: Rename to... <cd_id_to_dict_t>: ... this. (ctf_file_t): Fix outdated comment. <ctf_fileops>: Rename to... <ctf_dictops>: ... this. (struct ctf_archive_internal) <ctfi_file>: Rename to... <ctfi_dict>: ... this. * ctf-archive.c: Rename ctf_file_t to ctf_dict_t. Rename ctf_archive.ctfa_nfiles to ctfa_ndicts. Rename ctf_file_close to ctf_dict_close. All users adjusted. * ctf-create.c: Likewise. Refer to CTF dicts, not CTF containers. (ctf_bundle_t) <ctb_file>: Rename to... <ctb_dict): ... this. * ctf-decl.c: Rename ctf_file_t to ctf_dict_t. * ctf-dedup.c: Likewise. Rename ctf_file_close to ctf_dict_close. Refer to CTF dicts, not CTF containers. * ctf-dump.c: Likewise. * ctf-error.c: Likewise. * ctf-hash.c: Likewise. * ctf-inlines.h: Likewise. * ctf-labels.c: Likewise. * ctf-link.c: Likewise. * ctf-lookup.c: Likewise. * ctf-open-bfd.c: Likewise. * ctf-string.c: Likewise. * ctf-subr.c: Likewise. * ctf-types.c: Likewise. * ctf-util.c: Likewise. * ctf-open.c: Likewise. (ctf_file_close): Rename to... (ctf_dict_close): ...this. (ctf_file_close): New trivial wrapper around ctf_dict_close, for compatibility. (ctf_parent_file): Rename to... (ctf_parent_dict): ... this. (ctf_parent_file): New trivial wrapper around ctf_parent_dict, for compatibility. * libctf.ver: Add ctf_dict_close and ctf_parent_dict.
141 lines
3.7 KiB
C
141 lines
3.7 KiB
C
/* Labelled ranges of type IDs.
|
|
Copyright (C) 2019-2020 Free Software Foundation, Inc.
|
|
|
|
This file is part of libctf.
|
|
|
|
libctf is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 3, or (at your option) any later
|
|
version.
|
|
|
|
This program is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; see the file COPYING. If not see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include <ctf-impl.h>
|
|
#include <string.h>
|
|
|
|
static int
|
|
extract_label_info (ctf_dict_t *fp, const ctf_lblent_t **ctl,
|
|
uint32_t *num_labels)
|
|
{
|
|
const ctf_header_t *h;
|
|
|
|
h = (const ctf_header_t *) fp->ctf_data.cts_data;
|
|
|
|
*ctl = (const ctf_lblent_t *) (fp->ctf_buf + h->cth_lbloff);
|
|
*num_labels = (h->cth_objtoff - h->cth_lbloff) / sizeof (ctf_lblent_t);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Returns the topmost label, or NULL if any errors are encountered. */
|
|
|
|
const char *
|
|
ctf_label_topmost (ctf_dict_t *fp)
|
|
{
|
|
const ctf_lblent_t *ctlp = NULL;
|
|
const char *s;
|
|
uint32_t num_labels = 0;
|
|
|
|
if (extract_label_info (fp, &ctlp, &num_labels) < 0)
|
|
return NULL; /* errno is set for us. */
|
|
|
|
if (num_labels == 0)
|
|
{
|
|
(void) ctf_set_errno (fp, ECTF_NOLABELDATA);
|
|
return NULL;
|
|
}
|
|
|
|
if ((s = ctf_strraw (fp, (ctlp + num_labels - 1)->ctl_label)) == NULL)
|
|
(void) ctf_set_errno (fp, ECTF_CORRUPT);
|
|
|
|
return s;
|
|
}
|
|
|
|
/* Iterate over all labels. We pass the label string and the lblinfo_t struct
|
|
to the specified callback function. */
|
|
int
|
|
ctf_label_iter (ctf_dict_t *fp, ctf_label_f *func, void *arg)
|
|
{
|
|
const ctf_lblent_t *ctlp = NULL;
|
|
uint32_t i;
|
|
uint32_t num_labels = 0;
|
|
ctf_lblinfo_t linfo;
|
|
const char *lname;
|
|
int rc;
|
|
|
|
if (extract_label_info (fp, &ctlp, &num_labels) < 0)
|
|
return -1; /* errno is set for us. */
|
|
|
|
if (num_labels == 0)
|
|
return (ctf_set_errno (fp, ECTF_NOLABELDATA));
|
|
|
|
for (i = 0; i < num_labels; i++, ctlp++)
|
|
{
|
|
if ((lname = ctf_strraw (fp, ctlp->ctl_label)) == NULL)
|
|
{
|
|
/* Not marked for translation: label code not used yet. */
|
|
ctf_err_warn (fp, 0, ECTF_CORRUPT,
|
|
"failed to decode label %u with type %u",
|
|
ctlp->ctl_label, ctlp->ctl_type);
|
|
return (ctf_set_errno (fp, ECTF_CORRUPT));
|
|
}
|
|
|
|
linfo.ctb_type = ctlp->ctl_type;
|
|
if ((rc = func (lname, &linfo, arg)) != 0)
|
|
return rc;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
typedef struct linfo_cb_arg
|
|
{
|
|
const char *lca_name; /* Label we want to retrieve info for. */
|
|
ctf_lblinfo_t *lca_info; /* Where to store the info about the label. */
|
|
} linfo_cb_arg_t;
|
|
|
|
static int
|
|
label_info_cb (const char *lname, const ctf_lblinfo_t *linfo, void *arg)
|
|
{
|
|
/* If lname matches the label we are looking for, copy the
|
|
lblinfo_t struct for the caller. */
|
|
|
|
if (strcmp (lname, ((linfo_cb_arg_t *) arg)->lca_name) == 0)
|
|
{
|
|
/* * Allow caller not to allocate storage to test if label exists. */
|
|
|
|
if (((linfo_cb_arg_t *) arg)->lca_info != NULL)
|
|
memcpy (((linfo_cb_arg_t *) arg)->lca_info, linfo,
|
|
sizeof (ctf_lblinfo_t));
|
|
return 1; /* Indicate we found a match. */
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Retrieve information about the label with name "lname". */
|
|
int
|
|
ctf_label_info (ctf_dict_t *fp, const char *lname, ctf_lblinfo_t *linfo)
|
|
{
|
|
linfo_cb_arg_t cb_arg;
|
|
int rc;
|
|
|
|
cb_arg.lca_name = lname;
|
|
cb_arg.lca_info = linfo;
|
|
|
|
if ((rc = ctf_label_iter (fp, label_info_cb, &cb_arg)) < 0)
|
|
return rc;
|
|
|
|
if (rc != 1)
|
|
return (ctf_set_errno (fp, ECTF_NOLABEL));
|
|
|
|
return 0;
|
|
}
|