Handle 'QWW' encoding case in Ada enums
authorTom Tromey <tromey@adacore.com>
Tue, 25 Jan 2022 18:26:15 +0000 (11:26 -0700)
committerTom Tromey <tromey@adacore.com>
Mon, 28 Feb 2022 17:49:29 +0000 (10:49 -0700)
commita7041de85a0cc43b86989eb697cef7a6cecdbdb7
tree0e59babe7b0a46de2d60f82c2dc96d840754de71
parent659971cb0f8fd749aa951221d99de2868a860d07
Handle 'QWW' encoding case in Ada enums

In Ada, an enum can contain character literals.  GNAT encodes these
values in a special way.  For example, the Unicode character U+0178
would be represented as 'QW0178' in the DWARF:

 <3><112f>: Abbrev Number: 2 (DW_TAG_enumerator)
    <1130>   DW_AT_name        : (indirect string, offset: 0x19ff): QW0178
    <1134>   DW_AT_const_value : 2

gdb handles this reasonably well, but failed to handle the 'QWW'
encoding, which is used for characters outside the base plane.

Also, while working on this, I noticed that gdb will print the decimal
value for an enum character constant:

    (gdb) print Char_X
    $2 = 1 'x'

This is a nice feature, IMO, because in this situation the 'x' enum
constant does not have its usual decimal value -- it has the value
that's assigned based on the enumeration type.

However, gdb did not do this when it decided to print the constant
using the bracket notation:

    (gdb) print Char_Thorn
    $3 = ["de"]

This patch changes gdb to print the decimal value here as well, and to
put the bracket notation in single quotes -- otherwise gdb will be
printing something that it can't then read.  Now it looks like:

    (gdb) print Char_Thorn
    $3 = 4 '["de"]'

Note that gdb can't read longer bracket notations, like the other ones
printed in this test case:

    (gdb) print Char_King
    $4 = 3 '["01fa00"]'

While I think this is a bug, I plan to fix it separately.

Finally, in the new test case, the copyright dates are chosen this way
because this all started as a copy of an existing test.
gdb/ada-lang.c
gdb/testsuite/gdb.ada/char_enum_unicode.exp [new file with mode: 0644]
gdb/testsuite/gdb.ada/char_enum_unicode/foo.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/char_enum_unicode/pck.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/char_enum_unicode/pck.ads [new file with mode: 0644]