Allow ada_decode not to decode operators

The new DWARF scanner records names as they appear in DWARF.  However,
because Ada is unusual, it also decodes the Ada names to synthesize
package components for them.  In order for this to work out properly,
gdb also needs a mode where ada_decode can be instructed not to decode
Ada operator names.  That is what this patch implements.
This commit is contained in:
Tom Tromey 2021-06-05 09:24:52 -06:00
parent 6ee823fc4e
commit 5c94f93871
2 changed files with 12 additions and 7 deletions

View File

@ -1304,7 +1304,7 @@ convert_from_hex_encoded (std::string &out, const char *str, int n)
/* See ada-lang.h. */
std::string
ada_decode (const char *encoded, bool wrap)
ada_decode (const char *encoded, bool wrap, bool operators)
{
int i;
int len0;
@ -1399,7 +1399,7 @@ ada_decode (const char *encoded, bool wrap)
while (i < len0)
{
/* Is this a symbol function? */
if (at_start_name && encoded[i] == 'O')
if (operators && at_start_name && encoded[i] == 'O')
{
int k;
@ -1558,9 +1558,12 @@ ada_decode (const char *encoded, bool wrap)
/* Decoded names should never contain any uppercase character.
Double-check this, and abort the decoding if we find one. */
for (i = 0; i < decoded.length(); ++i)
if (isupper (decoded[i]) || decoded[i] == ' ')
goto Suppress;
if (operators)
{
for (i = 0; i < decoded.length(); ++i)
if (isupper (decoded[i]) || decoded[i] == ' ')
goto Suppress;
}
/* If the compiler added a suffix, append it now. */
if (suffix >= 0)

View File

@ -218,8 +218,10 @@ extern const char *ada_decode_symbol (const struct general_symbol_info *);
the name does not appear to be GNAT-encoded, then the result
depends on WRAP. If WRAP is true (the default), then the result is
simply wrapped in <...>. If WRAP is false, then the empty string
will be returned. */
extern std::string ada_decode (const char *name, bool wrap = true);
will be returned. Also, when OPERATORS is false, operator names
will not be decoded. */
extern std::string ada_decode (const char *name, bool wrap = true,
bool operators = true);
extern std::vector<struct block_symbol> ada_lookup_symbol_list
(const char *, const struct block *, domain_enum);