diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2008-05-14 18:28:59 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2008-05-14 18:28:59 +0000 |
commit | 00d5f93a8942ad81582852f5d06314866cd85287 (patch) | |
tree | f3b5e5f26c27c05aa70552706ff804572a6606a0 /gdb/ppc-linux-tdep.c | |
parent | 2eaf8d2a141aefdad8ad7f61c9a9f84a38019044 (diff) | |
download | gdb-00d5f93a8942ad81582852f5d06314866cd85287.zip gdb-00d5f93a8942ad81582852f5d06314866cd85287.tar.gz gdb-00d5f93a8942ad81582852f5d06314866cd85287.tar.bz2 |
* ppc-linux-tdep.c (ppc_linux_convert_from_func_ptr_addr): Rename ...
(ppc64_linux_convert_from_func_ptr_addr): ... to this. No longer try
to handle ppc32 PLT entries.
(ppc_linux_init_abi): Install ppc64_linux_convert_from_func_ptr_addr
only on ppc64.
Diffstat (limited to 'gdb/ppc-linux-tdep.c')
-rw-r--r-- | gdb/ppc-linux-tdep.c | 53 |
1 files changed, 11 insertions, 42 deletions
diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c index d985687..e419e2e 100644 --- a/gdb/ppc-linux-tdep.c +++ b/gdb/ppc-linux-tdep.c @@ -556,7 +556,7 @@ ppc64_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) } -/* Support for convert_from_func_ptr_addr (ARCH, ADDR, TARG) on PPC +/* Support for convert_from_func_ptr_addr (ARCH, ADDR, TARG) on PPC64 GNU/Linux. Usually a function pointer's representation is simply the address @@ -568,12 +568,6 @@ ppc64_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) function, the second word is the TOC pointer (r2), and the third word is the static chain value. - For PPC32, there are two kinds of function pointers: non-secure and - secure. Non-secure function pointers point directly to the - function in a code section and thus need no translation. Secure - ones (from GCC's -msecure-plt option) are in a data section and - contain one word: the address of the function. - Throughout GDB it is currently assumed that a function pointer contains the address of the function, which is not easy to fix. In addition, the conversion of a function address to a function pointer would @@ -589,40 +583,15 @@ ppc64_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) random addresses such as occur when there is no symbol table. */ static CORE_ADDR -ppc_linux_convert_from_func_ptr_addr (struct gdbarch *gdbarch, - CORE_ADDR addr, - struct target_ops *targ) +ppc64_linux_convert_from_func_ptr_addr (struct gdbarch *gdbarch, + CORE_ADDR addr, + struct target_ops *targ) { - struct gdbarch_tdep *tdep; struct section_table *s = target_section_by_addr (targ, addr); - char *sect_name = NULL; - - if (!s) - return addr; - - tdep = gdbarch_tdep (gdbarch); - - switch (tdep->wordsize) - { - case 4: - sect_name = ".plt"; - break; - case 8: - sect_name = ".opd"; - break; - default: - internal_error (__FILE__, __LINE__, - _("failed internal consistency check")); - } /* Check if ADDR points to a function descriptor. */ - - /* NOTE: this depends on the coincidence that the address of a functions - entry point is contained in the first word of its function descriptor - for both PPC-64 and for PPC-32 with secure PLTs. */ - if ((strcmp (s->the_bfd_section->name, sect_name) == 0) - && s->the_bfd_section->flags & SEC_DATA) - return get_target_memory_unsigned (targ, addr, tdep->wordsize); + if (s && strcmp (s->the_bfd_section->name, ".opd") == 0) + return get_target_memory_unsigned (targ, addr, 8); return addr; } @@ -1025,11 +994,6 @@ ppc_linux_init_abi (struct gdbarch_info info, set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT); set_gdbarch_long_double_format (gdbarch, floatformats_ibm_long_double); - /* Handle PPC GNU/Linux 64-bit function pointers (which are really - function descriptors) and 32-bit secure PLT entries. */ - set_gdbarch_convert_from_func_ptr_addr - (gdbarch, ppc_linux_convert_from_func_ptr_addr); - /* Handle inferior calls during interrupted system calls. */ set_gdbarch_write_pc (gdbarch, ppc_linux_write_pc); @@ -1069,6 +1033,11 @@ ppc_linux_init_abi (struct gdbarch_info info, set_gdbarch_adjust_breakpoint_address (gdbarch, ppc64_sysv_abi_adjust_breakpoint_address); + /* Handle PPC GNU/Linux 64-bit function pointers (which are really + function descriptors). */ + set_gdbarch_convert_from_func_ptr_addr + (gdbarch, ppc64_linux_convert_from_func_ptr_addr); + /* Shared library handling. */ set_gdbarch_skip_trampoline_code (gdbarch, ppc64_skip_trampoline_code); set_solib_svr4_fetch_link_map_offsets |