aboutsummaryrefslogtreecommitdiff
path: root/gdb/ChangeLog
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2018-01-10 13:53:18 -0700
committerTom Tromey <tom@tromey.com>2018-02-26 09:21:08 -0700
commit2ddeaf8a7d64094f4caf6cdc412d8162f49f73a1 (patch)
tree74a0c3ecfeaebf20f7d1fb730dbafeb2648ab7ad /gdb/ChangeLog
parentc9317f214b274b805190b8e878c79f4181d93bb4 (diff)
downloadgdb-2ddeaf8a7d64094f4caf6cdc412d8162f49f73a1.zip
gdb-2ddeaf8a7d64094f4caf6cdc412d8162f49f73a1.tar.gz
gdb-2ddeaf8a7d64094f4caf6cdc412d8162f49f73a1.tar.bz2
Handle DW_TAG_variant_part and DW_TAG_variant
This changes dwarf2read to understand DW_TAG_variant_part and DW_TAG_variant. Note that DW_AT_discr_list is not handled. I did not need this for Rust. I imagine this should not be too hard to add later, should someone need it. Meanwhile I have gdb emit a complaint if it is seen. There is a lurking issue concerning the placement of the discriminant in the DWARF. For Rust, I ended up following the letter of the standard and having the discriminant be a child of the DW_TAG_variant_part. However, GCC's Ada support does not do this. Pierre-Marie filed this with the DWARF committee: http://dwarfstd.org/ShowIssue.php?issue=180123.1 However as that is read-only, if you have comments you might consider adding them to the GCC bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83935 Finally, there is a DWARF extension lurking in here. In Rust, a univariant enum will not have a discriminant. However, in order to unify the representation of all data-carrying enums, I've made LLVM (and my forthcoming rustc patch) emit a univariant enum using a DW_TAG_variant with a single variant part and without DW_AT_discr. The lack of this DW_AT_discr is the extension. I will submit an issue on dwarfstd.org about this. 2018-02-26 Tom Tromey <tom@tromey.com> * dwarf2read.c (struct variant_field): New. (struct nextfield) <variant>: New field. (dwarf2_add_field): Handle DW_TAG_variant_part. (dwarf2_attach_fields_to_type): Attach a discriminant_info to a discriminated union. (read_structure_type): Handle DW_TAG_variant_part. (handle_struct_member_die): New function, extracted from process_structure_scope. Handle DW_TAG_variant. (process_structure_scope): Handle discriminated unions. Call handle_struct_member_die. 2018-02-26 Tom Tromey <tom@tromey.com> * gdb.dwarf2/variant.c: New file. * gdb.dwarf2/variant.exp: New file.
Diffstat (limited to 'gdb/ChangeLog')
-rw-r--r--gdb/ChangeLog13
1 files changed, 13 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 31fbe9a..0897d59 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,18 @@
2018-02-26 Tom Tromey <tom@tromey.com>
+ * dwarf2read.c (struct variant_field): New.
+ (struct nextfield) <variant>: New field.
+ (dwarf2_add_field): Handle DW_TAG_variant_part.
+ (dwarf2_attach_fields_to_type): Attach a discriminant_info to a
+ discriminated union.
+ (read_structure_type): Handle DW_TAG_variant_part.
+ (handle_struct_member_die): New function, extracted from
+ process_structure_scope. Handle DW_TAG_variant.
+ (process_structure_scope): Handle discriminated unions. Call
+ handle_struct_member_die.
+
+2018-02-26 Tom Tromey <tom@tromey.com>
+
* rust-lang.h (rust_last_path_segment): Declare.
* rust-lang.c (rust_last_path_segment): Now public. Change
contract.