From 3e4f87c384d44f416b5c4897f65103de50db3205 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Tue, 29 Sep 2009 18:59:39 +0000 Subject: [PATCH] Revert 2009-09-28 commit: * 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. --- gdb/ChangeLog | 14 ++++++++++++++ gdb/eval.c | 24 +++++------------------- gdb/linespec.c | 18 +++++------------- gdb/objc-lang.c | 16 +++++++--------- gdb/ppc-sysv-tdep.c | 10 +++------- 5 files changed, 34 insertions(+), 48 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e2d3808513d..a69e039828c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2009-09-29 Ulrich Weigand + + Revert 2009-09-28 commit: + * 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. + 2009-09-29 Tom Tromey * python/py-value.c (valpy_string): NULL-terminate 'keywords'. diff --git a/gdb/eval.c b/gdb/eval.c index a1d6e124d53..2926465c418 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -1161,13 +1161,8 @@ evaluate_subexp_standard (struct type *expect_type, if (addr) { struct symbol *sym = NULL; - - /* 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); @@ -1221,20 +1216,11 @@ 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) - called_method - = value_from_pointer (lookup_pointer_type (value_type (method)), - value_as_address (msg_send_stret)); + set_value_address (method, value_as_address (msg_send_stret)); else - called_method - = value_from_pointer (lookup_pointer_type (value_type (method)), - value_as_address (msg_send)); + set_value_address (method, value_as_address (msg_send)); + called_method = method; } else { @@ -1289,7 +1275,7 @@ evaluate_subexp_standard (struct type *expect_type, { /* Function objc_msg_lookup returns a pointer. */ deprecated_set_value_type (argvec[0], - lookup_pointer_type (lookup_function_type (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); } diff --git a/gdb/linespec.c b/gdb/linespec.c index 565d601f7fe..3e943a18e74 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1171,19 +1171,11 @@ decode_objc (char **argptr, int funfirstline, struct symtab *file_symtab, } else { - /* 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, - ¤t_target); - - init_sal (&values.sals[0]); - values.sals[0].pc = pc; + /* 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]); } return values; } diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index f3a8b7308fb..0e4fb71965b 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -1173,18 +1173,16 @@ find_methods (struct symtab *symtab, char type, ALL_OBJFILE_MSYMBOLS (objfile, msymbol) { - struct gdbarch *gdbarch = get_objfile_arch (objfile); - CORE_ADDR pc = SYMBOL_VALUE_ADDRESS (msymbol); - QUIT; - /* The minimal symbol might point to a function descriptor; - resolve it to the actual code address instead. */ - pc = gdbarch_convert_from_func_ptr_addr (gdbarch, pc, - ¤t_target); + if ((MSYMBOL_TYPE (msymbol) != mst_text) + && (MSYMBOL_TYPE (msymbol) != mst_file_text)) + /* Not a function or method. */ + continue; if (symtab) - if (pc < BLOCK_START (block) || pc >= BLOCK_END (block)) + if ((SYMBOL_VALUE_ADDRESS (msymbol) < BLOCK_START (block)) || + (SYMBOL_VALUE_ADDRESS (msymbol) >= BLOCK_END (block))) /* Not in the specified symtab. */ continue; @@ -1223,7 +1221,7 @@ find_methods (struct symtab *symtab, char type, ((nselector == NULL) || (strcmp (selector, nselector) != 0))) continue; - sym = find_pc_function (pc); + sym = find_pc_function (SYMBOL_VALUE_ADDRESS (msymbol)); if (sym != NULL) { const char *newsymname = SYMBOL_NATURAL_NAME (sym); diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c index 031ec52da02..703ca4db40a 100644 --- a/gdb/ppc-sysv-tdep.c +++ b/gdb/ppc-sysv-tdep.c @@ -1326,14 +1326,10 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, struct value *function, regcache_cooked_write_signed (regcache, tdep->ppc_lr_regnum, bp_addr); /* Use the func_addr to find the descriptor, and use that to find - the TOC. If we're calling via a function pointer, the pointer - itself identifies the descriptor. */ + the TOC. */ { - struct type *ftype = check_typedef (value_type (function)); - CORE_ADDR desc_addr = value_as_address (function); - - if (TYPE_CODE (ftype) == TYPE_CODE_PTR - || convert_code_addr_to_desc_addr (func_addr, &desc_addr)) + CORE_ADDR desc_addr; + if (convert_code_addr_to_desc_addr (func_addr, &desc_addr)) { /* The TOC is the second double word in the descriptor. */ CORE_ADDR toc = -- 2.47.2