forked from Imagelibrary/binutils-gdb
libctf: create, lookup: delete DVDs; ctf_lookup_by_kind
Variable handling in BTF and CTFv4 works quite differently from in CTFv3. Rather than a separate section containing sorted, bsearchable variables, they are simply named entities like types, stored in CTF_K_VARs. As a first stage towards migrating to this, delete most references to the ctf_varent_t and ctf_dvdef_t, including the DVD lookup code, all the linking code, and quite a lot of the serialization code. Note: CTF_LINK_OMIT_VARIABLES_SECTION, and the whole "delete variables that already exist in the symtypetabs section" stuff, has yet to be reimplemented. We can implement CTF_LINK_OMIT_VARIABLES_SECTION by simply excising all CTF_K_VARs at deduplication time if requested. (Note: symtypetabs should still point directly at the type, not at the CTF_K_VAR.) (Symtypetabs in general need a bit more thought -- perhaps we can now store them in a separate .ctf.symtypetab section with its own little four-entry header for the symtypetabs and their indexes, making .ctf even more like .BTF; the only difference would then be that .ctf could include prefix types, CTF_K_FLOAT, and external string refs. For later discussion.) We also add ctf_lookup_by_kind() at this stage (because it is hopelessly diff-entangled with ctf_lookup_variable): this looks up a type of a particular kind, without needing a per-kind lookup function for it, nor needing to hack around adding string prefixes (so you can do ctf_lookup_by_kind (fp, CTF_K_STRUCT, "foo") rather than having to do ctf_lookup_by_name (fp, "struct foo"): often this is more convenient, and anything that reduces string buffer manipulation in C is good.)
This commit is contained in:
@@ -364,38 +364,10 @@ ctf_static_type (const ctf_dict_t *fp, ctf_id_t type)
|
||||
return ((unsigned long) idx <= fp->ctf_stypes);
|
||||
}
|
||||
|
||||
int
|
||||
ctf_dvd_insert (ctf_dict_t *fp, ctf_dvdef_t *dvd)
|
||||
{
|
||||
if (ctf_dynhash_insert (fp->ctf_dvhash, dvd->dvd_name, dvd) < 0)
|
||||
return ctf_set_errno (fp, ENOMEM);
|
||||
ctf_list_append (&fp->ctf_dvdefs, dvd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
ctf_dvd_delete (ctf_dict_t *fp, ctf_dvdef_t *dvd)
|
||||
{
|
||||
ctf_dynhash_remove (fp->ctf_dvhash, dvd->dvd_name);
|
||||
free (dvd->dvd_name);
|
||||
|
||||
ctf_list_delete (&fp->ctf_dvdefs, dvd);
|
||||
free (dvd);
|
||||
}
|
||||
|
||||
ctf_dvdef_t *
|
||||
ctf_dvd_lookup (const ctf_dict_t *fp, const char *name)
|
||||
{
|
||||
return (ctf_dvdef_t *) ctf_dynhash_lookup (fp->ctf_dvhash, name);
|
||||
}
|
||||
|
||||
/* Discard all of the dynamic type definitions and variable definitions that
|
||||
have been added to the dict since the last call to ctf_update(). We locate
|
||||
such types by scanning the dtd list and deleting elements that have type IDs
|
||||
greater than ctf_dtoldid, which is set by ctf_update(), above, and by
|
||||
scanning the variable list and deleting elements that have update IDs equal
|
||||
to the current value of the last-update snapshot count (indicating that they
|
||||
were added after the most recent call to ctf_update()). */
|
||||
/* Discard all of the dynamic type definitions that have been added to the dict
|
||||
since the last call to ctf_update(). We locate such types by scanning the
|
||||
dtd list and deleting elements that have indexes greater than ctf_dtoldid,
|
||||
which is set by ctf_update(), above. */
|
||||
int
|
||||
ctf_discard (ctf_dict_t *fp)
|
||||
{
|
||||
@@ -420,7 +392,6 @@ int
|
||||
ctf_rollback (ctf_dict_t *fp, ctf_snapshot_id_t id)
|
||||
{
|
||||
ctf_dtdef_t *dtd, *ntd;
|
||||
ctf_dvdef_t *dvd, *nvd;
|
||||
|
||||
if (fp->ctf_flags & LCTF_NO_STR)
|
||||
return (ctf_set_errno (fp, ECTF_NOPARENT));
|
||||
@@ -454,16 +425,6 @@ ctf_rollback (ctf_dict_t *fp, ctf_snapshot_id_t id)
|
||||
ctf_dtd_delete (fp, dtd);
|
||||
}
|
||||
|
||||
for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
|
||||
{
|
||||
nvd = ctf_list_next (dvd);
|
||||
|
||||
if (dvd->dvd_snapshots <= id.snapshot_id)
|
||||
continue;
|
||||
|
||||
ctf_dvd_delete (fp, dvd);
|
||||
}
|
||||
|
||||
fp->ctf_typemax = id.dtd_id;
|
||||
fp->ctf_snapshots = id.snapshot_id;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user