summaryrefslogtreecommitdiff
path: root/libctf/ChangeLog
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2021-03-18 12:37:52 +0000
committerNick Alcock <nick.alcock@oracle.com>2021-03-18 12:40:40 +0000
commit77d724a7ecdb3fa84557b0ee5c8b7ea949ce56a5 (patch)
tree0758feb039a9f6e4785f552a594d54cf14631c5e /libctf/ChangeLog
parent986e9e3aa03f854bedacef7fac38fe8f009a416c (diff)
downloadbinutils-gdb-77d724a7ecdb3fa84557b0ee5c8b7ea949ce56a5.tar.gz
libctf: eliminate dtd_u, part 4: enums
This is the first tricky one, the first complex multi-entry vlen containing strings. To handle this in vlen form, we have to handle pending refs moving around on realloc. We grow vlen regions using a new ctf_grow_vlen function, and iterate through the existing enums every time a grow happens, telling the string machinery the distance between the old and new vlen region and letting it adjust the pending refs accordingly. (This avoids traversing all outstanding refs to find the refs that need adjusting, at the cost of having to traverse one enum: an obvious major performance win.) Addition of enums themselves (and also structs/unions later) is a bit trickier than earlier forms, because the type might be being promoted from a forward, and forwards have no vlen: so we have to spot that and create it if needed. Serialization of enums simplifies down to just telling the string machinery about the string refs; all the enum type-lookup code loses all its dynamic member lookup complexity entirely. A new test is added that iterates over (and gets values of) an enum with enough members to force a round of vlen growth. libctf/ChangeLog 2021-03-18 Nick Alcock <nick.alcock@oracle.com> * ctf-impl.h (ctf_dtdef_t) <dtd_vlen_alloc>: New. (ctf_str_move_pending): Declare. * ctf-string.c (ctf_str_add_ref_internal): Fix error return. (ctf_str_move_pending): New. * ctf-create.c (ctf_grow_vlen): New. (ctf_dtd_delete): Zero out the vlen_alloc after free. Free the vlen later: iterate over it and free enum name refs first. (ctf_add_generic): Populate dtd_vlen_alloc from vlen. (ctf_add_enum): populate the vlen; do it by hand if promoting forwards. (ctf_add_enumerator): Set up the vlen rather than the dmd. Expand it as needed, repointing string refs via ctf_str_move_pending. Add the enumerand names as pending strings. * ctf-serialize.c (ctf_copy_emembers): Remove. (ctf_emit_type_sect): Copy the vlen into place and ref the strings. * ctf-types.c (ctf_enum_next): The dynamic portion now uses the same code as the non-dynamic. (ctf_enum_name): Likewise. (ctf_enum_value): Likewise. * testsuite/libctf-lookup/enum-many-ctf.c: New test. * testsuite/libctf-lookup/enum-many.lk: New test.
Diffstat (limited to 'libctf/ChangeLog')
-rw-r--r--libctf/ChangeLog25
1 files changed, 25 insertions, 0 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index b4da0407ca9..fa333d5c2bd 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -1,5 +1,30 @@
2021-03-18 Nick Alcock <nick.alcock@oracle.com>
+ * ctf-impl.h (ctf_dtdef_t) <dtd_vlen_alloc>: New.
+ (ctf_str_move_pending): Declare.
+ * ctf-string.c (ctf_str_add_ref_internal): Fix error return.
+ (ctf_str_move_pending): New.
+ * ctf-create.c (ctf_grow_vlen): New.
+ (ctf_dtd_delete): Zero out the vlen_alloc after free. Free the
+ vlen later: iterate over it and free enum name refs first.
+ (ctf_add_generic): Populate dtd_vlen_alloc from vlen.
+ (ctf_add_enum): populate the vlen; do it by hand if promoting
+ forwards.
+ (ctf_add_enumerator): Set up the vlen rather than the dmd. Expand
+ it as needed, repointing string refs via ctf_str_move_pending. Add
+ the enumerand names as pending strings.
+ * ctf-serialize.c (ctf_copy_emembers): Remove.
+ (ctf_emit_type_sect): Copy the vlen into place and ref the
+ strings.
+ * ctf-types.c (ctf_enum_next): The dynamic portion now uses
+ the same code as the non-dynamic.
+ (ctf_enum_name): Likewise.
+ (ctf_enum_value): Likewise.
+ * testsuite/libctf-lookup/enum-many-ctf.c: New test.
+ * testsuite/libctf-lookup/enum-many.lk: New test.
+
+2021-03-18 Nick Alcock <nick.alcock@oracle.com>
+
* ctf-hash.c (ctf_dynset_elements): New.
* ctf-impl.h (ctf_dynset_elements): Declare it.
(ctf_str_add_pending): Likewise.