diff options
author | Joel Brobecker <brobecker@adacore.com> | 2015-01-12 15:46:34 +0400 |
---|---|---|
committer | Joel Brobecker <brobecker@adacore.com> | 2015-01-13 13:38:58 +0400 |
commit | 04dccad086aa9974fb66f8b5d1c1fb32d5a6ae0e (patch) | |
tree | adbe6e4e6e5e52a4d28a1e3964bcde7624f31902 /gdb/ada-lang.c | |
parent | 15eec7902fb3fcee295de60109c8431e70229d27 (diff) | |
download | gdb-04dccad086aa9974fb66f8b5d1c1fb32d5a6ae0e.zip gdb-04dccad086aa9974fb66f8b5d1c1fb32d5a6ae0e.tar.gz gdb-04dccad086aa9974fb66f8b5d1c1fb32d5a6ae0e.tar.bz2 |
[python/Ada] gdb.lookup_type fails to looking primitive type
The following change...
commit 1994afbf19892c9e614a034fbf1a5233e9addce3
Date: Tue Dec 23 07:55:39 2014 -0800
Subject: Look up primitive types as symbols.
... caused the following regression:
% gdb
(gdb) set lang ada
(gdb) python print gdb.lookup_type('character')
Traceback (most recent call last):
File "<string>", line 1, in <module>
gdb.error: No type named character.
Error while executing Python code.
This is because the language_lookup_primitive_type_as_symbol call
was moved to the la_lookup_symbol_nonlocal hook. A couple of
implementations have been upated accordingly, but the Ada version
has not. This patch fixes this omission.
gdb/ChangeLog:
* ada-lang.c (ada_lookup_symbol_nonlocal): If name not found
in static block, then try searching for primitive types.
gdb/testsuite/ChangeLog:
* gdb.python/py-lookup-type.exp: New file.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r-- | gdb/ada-lang.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 71c3b3a..ec06693 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -5598,7 +5598,38 @@ ada_lookup_symbol_nonlocal (const struct language_defn *langdef, const struct block *block, const domain_enum domain) { - return ada_lookup_symbol (name, block_static_block (block), domain, NULL); + struct symbol *sym; + + sym = ada_lookup_symbol (name, block_static_block (block), domain, NULL); + if (sym != NULL) + return sym; + + /* If we haven't found a match at this point, try the primitive + types. In other languages, this search is performed before + searching for global symbols in order to short-circuit that + global-symbol search if it happens that the name corresponds + to a primitive type. But we cannot do the same in Ada, because + it is perfectly legitimate for a program to declare a type which + has the same name as a standard type. If looking up a type in + that situation, we have traditionally ignored the primitive type + in favor of user-defined types. This is why, unlike most other + languages, we search the primitive types this late and only after + having searched the global symbols without success. */ + + if (domain == VAR_DOMAIN) + { + struct gdbarch *gdbarch; + + if (block == NULL) + gdbarch = target_gdbarch (); + else + gdbarch = block_gdbarch (block); + sym = language_lookup_primitive_type_as_symbol (langdef, gdbarch, name); + if (sym != NULL) + return sym; + } + + return NULL; } |