aboutsummaryrefslogtreecommitdiff
path: root/gdb/linespec.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2009-09-29 00:48:32 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2009-09-29 00:48:32 +0000
commit69368a60a4878ec4ef1060732020e9eaf19b32b0 (patch)
treee42355f5c9bd92ed24f12457f1b50f24f1b216f8 /gdb/linespec.c
parent67f470de12c95c08410c46543072c22f857a0a3b (diff)
downloadgdb-69368a60a4878ec4ef1060732020e9eaf19b32b0.zip
gdb-69368a60a4878ec4ef1060732020e9eaf19b32b0.tar.gz
gdb-69368a60a4878ec4ef1060732020e9eaf19b32b0.tar.bz2
* eval.c (evaluate_subexp_standard) [OP_OBJC_MSGCALL]: Support
platforms that use function descriptors. Prefer to use function pointer types instead of function types. * linespec.c (decode_objc): Support function descriptors. Fully initialize SAL result. * objc-lang.c (find_methods): Support function descriptors. Do not require function symbol to point to text section. * ppc-sysv-tdep.c (ppc64_sysv_abi_push_dummy_call): When calling via a function pointer, use the descriptor it points to.
Diffstat (limited to 'gdb/linespec.c')
-rw-r--r--gdb/linespec.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/gdb/linespec.c b/gdb/linespec.c
index 70e27f76..19df329 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -1172,11 +1172,19 @@ decode_objc (char **argptr, int funfirstline, struct symtab *file_symtab,
}
else
{
- /* The only match was a non-debuggable symbol. */
- values.sals[0].symtab = NULL;
- values.sals[0].line = 0;
- values.sals[0].end = 0;
- values.sals[0].pc = SYMBOL_VALUE_ADDRESS (sym_arr[0]);
+ /* The only match was a non-debuggable symbol, which might point
+ to a function descriptor; resolve it to the actual code address
+ instead. */
+ struct minimal_symbol *msymbol = (struct minimal_symbol *)sym_arr[0];
+ struct objfile *objfile = msymbol_objfile (msymbol);
+ struct gdbarch *gdbarch = get_objfile_arch (objfile);
+ CORE_ADDR pc = SYMBOL_VALUE_ADDRESS (msymbol);
+
+ pc = gdbarch_convert_from_func_ptr_addr (gdbarch, pc,
+ &current_target);
+
+ init_sal (&values.sals[0]);
+ values.sals[0].pc = pc;
}
return values;
}