diff options
author | Tom Tromey <tromey@adacore.com> | 2022-01-25 11:26:15 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2022-02-28 10:49:29 -0700 |
commit | a7041de85a0cc43b86989eb697cef7a6cecdbdb7 (patch) | |
tree | 0e59babe7b0a46de2d60f82c2dc96d840754de71 /gdb/ada-lang.c | |
parent | 659971cb0f8fd749aa951221d99de2868a860d07 (diff) | |
download | fsf-binutils-gdb-a7041de85a0cc43b86989eb697cef7a6cecdbdb7.zip fsf-binutils-gdb-a7041de85a0cc43b86989eb697cef7a6cecdbdb7.tar.gz fsf-binutils-gdb-a7041de85a0cc43b86989eb697cef7a6cecdbdb7.tar.bz2 |
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.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r-- | gdb/ada-lang.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index d2f620c..f1d59d2 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -8786,7 +8786,13 @@ ada_enum_name (const char *name) if (name[1] == 'U' || name[1] == 'W') { - if (sscanf (name + 2, "%x", &v) != 1) + int offset = 2; + if (name[1] == 'W' && name[2] == 'W') + { + /* Also handle the QWW case. */ + ++offset; + } + if (sscanf (name + offset, "%x", &v) != 1) return name; } else if (((name[1] >= '0' && name[1] <= '9') @@ -8802,9 +8808,11 @@ ada_enum_name (const char *name) if (isascii (v) && isprint (v)) storage = string_printf ("'%c'", v); else if (name[1] == 'U') - storage = string_printf ("[\"%02x\"]", v); + storage = string_printf ("'[\"%02x\"]'", v); + else if (name[2] != 'W') + storage = string_printf ("'[\"%04x\"]'", v); else - storage = string_printf ("[\"%04x\"]", v); + storage = string_printf ("'[\"%06x\"]'", v); return storage.c_str (); } |