mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 09:08:59 +00:00
* 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.
This commit is contained in:
24
gdb/eval.c
24
gdb/eval.c
@@ -1161,8 +1161,13 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||
if (addr)
|
||||
{
|
||||
struct symbol *sym = NULL;
|
||||
/* Is it a high_level symbol? */
|
||||
|
||||
/* The address might point to a function descriptor;
|
||||
resolve it to the actual code address instead. */
|
||||
addr = gdbarch_convert_from_func_ptr_addr (exp->gdbarch, addr,
|
||||
¤t_target);
|
||||
|
||||
/* Is it a high_level symbol? */
|
||||
sym = find_pc_function (addr);
|
||||
if (sym != NULL)
|
||||
method = value_of_variable (sym, 0);
|
||||
@@ -1216,11 +1221,20 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||
{
|
||||
if (TYPE_CODE (value_type (method)) != TYPE_CODE_FUNC)
|
||||
error (_("method address has symbol information with non-function type; skipping"));
|
||||
|
||||
/* Create a function pointer of the appropriate type, and replace
|
||||
its value with the value of msg_send or msg_send_stret. We must
|
||||
use a pointer here, as msg_send and msg_send_stret are of pointer
|
||||
type, and the representation may be different on systems that use
|
||||
function descriptors. */
|
||||
if (struct_return)
|
||||
set_value_address (method, value_as_address (msg_send_stret));
|
||||
called_method
|
||||
= value_from_pointer (lookup_pointer_type (value_type (method)),
|
||||
value_as_address (msg_send_stret));
|
||||
else
|
||||
set_value_address (method, value_as_address (msg_send));
|
||||
called_method = method;
|
||||
called_method
|
||||
= value_from_pointer (lookup_pointer_type (value_type (method)),
|
||||
value_as_address (msg_send));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1275,7 +1289,7 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||
{
|
||||
/* Function objc_msg_lookup returns a pointer. */
|
||||
deprecated_set_value_type (argvec[0],
|
||||
lookup_function_type (lookup_pointer_type (value_type (argvec[0]))));
|
||||
lookup_pointer_type (lookup_function_type (value_type (argvec[0]))));
|
||||
argvec[0] = call_function_by_hand (argvec[0], nargs + 2, argvec + 1);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user