diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/eval.c | 26 | ||||
-rw-r--r-- | gdb/objc-lang.c | 4 | ||||
-rw-r--r-- | gdb/objc-lang.h | 2 |
4 files changed, 27 insertions, 11 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aef385d..df32cf3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -2,6 +2,12 @@ Committed by Jim Blandy <jimb@redhat.com>. + * eval.c (evaluate_subexp_standard, case OP_OBJC_MSGCALL): Use + CORE_ADDR as type for selectors. Correct types for GNU run time + message lookup function to use double indirection. + * objc-lang.c (lookup_child_selector): Use CORE_ADDR as return type. + * objc-lang.h (lookup_child_selector): Adapt prototype. + * s390-nat.c (SUBOFF): New macro. (supply_gregset, fill_gregset): Use it to handle debugging of 32-bit exectuables running under a 64-bit kernel. @@ -697,10 +697,10 @@ evaluate_subexp_standard (struct type *expect_type, case OP_OBJC_MSGCALL: { /* Objective C message (method) call. */ - static unsigned long responds_selector = 0; - static unsigned long method_selector = 0; + static CORE_ADDR responds_selector = 0; + static CORE_ADDR method_selector = 0; - unsigned long selector = 0; + CORE_ADDR selector = 0; int using_gcc = 0; int struct_return = 0; @@ -750,8 +750,19 @@ evaluate_subexp_standard (struct type *expect_type, only). */ if (gnu_runtime) { + struct type *type; + type = lookup_pointer_type (builtin_type_void); + type = lookup_function_type (type); + type = lookup_pointer_type (type); + type = lookup_function_type (type); + type = lookup_pointer_type (type); + msg_send = find_function_in_inferior ("objc_msg_lookup"); msg_send_stret = find_function_in_inferior ("objc_msg_lookup"); + + msg_send = value_from_pointer (type, value_as_address (msg_send)); + msg_send_stret = value_from_pointer (type, + value_as_address (msg_send_stret)); } else { @@ -936,14 +947,13 @@ evaluate_subexp_standard (struct type *expect_type, if (gnu_runtime && (method != NULL)) { - ret = call_function_by_hand (argvec[0], nargs + 2, argvec + 1); /* Function objc_msg_lookup returns a pointer. */ - argvec[0] = ret; - ret = call_function_by_hand (argvec[0], nargs + 2, argvec + 1); + VALUE_TYPE (argvec[0]) = lookup_function_type + (lookup_pointer_type (VALUE_TYPE (argvec[0]))); + argvec[0] = call_function_by_hand (argvec[0], nargs + 2, argvec + 1); } - else - ret = call_function_by_hand (argvec[0], nargs + 2, argvec + 1); + ret = call_function_by_hand (argvec[0], nargs + 2, argvec + 1); return ret; } break; diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index cc933db..5c184f3 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -133,7 +133,7 @@ lookup_objc_class (char *classname) 1, &classval)); } -int +CORE_ADDR lookup_child_selector (char *selname) { struct value * function, *selstring; @@ -754,7 +754,7 @@ end_msglist(void) int val = msglist_len; struct selname *sel = selname_chain; char *p = msglist_sel; - int selid; + CORE_ADDR selid; selname_chain = sel->next; msglist_len = sel->msglist_len; diff --git a/gdb/objc-lang.h b/gdb/objc-lang.h index c88a0f7..5a11c5d 100644 --- a/gdb/objc-lang.h +++ b/gdb/objc-lang.h @@ -39,7 +39,7 @@ extern int c_value_print (struct value *, struct ui_file *, int, enum val_prettyprint); extern CORE_ADDR lookup_objc_class (char *classname); -extern int lookup_child_selector (char *methodname); +extern CORE_ADDR lookup_child_selector (char *methodname); extern char *objc_demangle (const char *mangled, int options); |