diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2009-06-29 17:31:24 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2009-06-29 17:31:24 +0000 |
commit | 30b155416bc2f21436603dcbf37d3dd0400813c6 (patch) | |
tree | fe2d327271e96b646ad46fc1776ea09bcc25c2df /gdb/ada-lang.c | |
parent | 7c964f079e2404c667e3e4ffb32a380590c438ab (diff) | |
download | gdb-30b155416bc2f21436603dcbf37d3dd0400813c6.zip gdb-30b155416bc2f21436603dcbf37d3dd0400813c6.tar.gz gdb-30b155416bc2f21436603dcbf37d3dd0400813c6.tar.bz2 |
* ada-lang.c (resolve): Use per-architecture void type instead
of platform-independent one.
(ada_evaluate_subexp) [STRUCTOP_STRUCT]: Likewise.
(ada_resolve_function): Reimplement fallback logic to avoid
explicit reference to builtin_type_void.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r-- | gdb/ada-lang.c | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index ad08c5f..9519ba8 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -2586,9 +2586,13 @@ ada_decoded_op_name (enum exp_opcode op) static void resolve (struct expression **expp, int void_context_p) { - int pc; - pc = 0; - resolve_subexp (expp, &pc, 1, void_context_p ? builtin_type_void : NULL); + struct type *context_type = NULL; + int pc = 0; + + if (void_context_p) + context_type = builtin_type ((*expp)->gdbarch)->builtin_void; + + resolve_subexp (expp, &pc, 1, context_type); } /* Resolve the operator of the subexpression beginning at @@ -3094,35 +3098,27 @@ ada_resolve_function (struct ada_symbol_info syms[], int nsyms, struct value **args, int nargs, const char *name, struct type *context_type) { + int fallback; int k; int m; /* Number of hits */ - struct type *fallback; - struct type *return_type; - - return_type = context_type; - if (context_type == NULL) - fallback = builtin_type_void; - else - fallback = NULL; m = 0; - while (1) + /* In the first pass of the loop, we only accept functions matching + context_type. If none are found, we add a second pass of the loop + where every function is accepted. */ + for (fallback = 0; m == 0 && fallback < 2; fallback++) { for (k = 0; k < nsyms; k += 1) { struct type *type = ada_check_typedef (SYMBOL_TYPE (syms[k].sym)); if (ada_args_match (syms[k].sym, args, nargs) - && return_match (type, return_type)) + && (fallback || return_match (type, context_type))) { syms[m] = syms[k]; m += 1; } } - if (m > 0 || return_type == fallback) - break; - else - return_type = fallback; } if (m == 0) @@ -9375,7 +9371,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, in some extension of the type. Return an object of "type" void, which will match any formal (see ada_type_match). */ - return value_zero (builtin_type_void, lval_memory); + return value_zero (builtin_type (exp->gdbarch)->builtin_void, + lval_memory); } else type = |