From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28268 invoked by alias); 11 Jun 2003 13:21:05 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 28230 invoked from network); 11 Jun 2003 13:21:04 -0000 Received: from unknown (HELO zenia.home) (12.223.225.216) by sources.redhat.com with SMTP; 11 Jun 2003 13:21:04 -0000 Received: by zenia.home (Postfix, from userid 5433) id 3DC732101B; Wed, 11 Jun 2003 08:22:18 -0500 (EST) To: gdb-patches@sources.redhat.com Subject: [ppc64-linux] gdbarch hook to find true execution entry point From: Jim Blandy Date: Wed, 11 Jun 2003 13:21:00 -0000 Message-ID: User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2003-06/txt/msg00362.txt.bz2 2003-06-11 Jim Blandy * gdbarch.sh (gdbarch_bfd_entry_point): New gdbarch method. * arch-utils.c (generic_bfd_entry_point): New function. * arch-utils.h (generic_bfd_entry_point): New declaration. * gdbarch.c, gdbarch.h: Regenerated. * solib-svr4.c (enable_break): Call it, instead of accessing tmp_bfd->start_address directly. Index: gdb/gdbarch.sh =================================================================== RCS file: /cvs/src/src/gdb/gdbarch.sh,v retrieving revision 1.237 diff -c -r1.237 gdbarch.sh *** gdb/gdbarch.sh 17 May 2003 05:59:58 -0000 1.237 --- gdb/gdbarch.sh 11 Jun 2003 13:16:31 -0000 *************** *** 654,659 **** --- 654,664 ---- f:2:TARGET_PRINT_INSN:int:print_insn:bfd_vma vma, disassemble_info *info:vma, info:::legacy_print_insn::0 f:2:SKIP_TRAMPOLINE_CODE:CORE_ADDR:skip_trampoline_code:CORE_ADDR pc:pc:::generic_skip_trampoline_code::0 + # The actual code address at which ABFD would begin execution. Note + # that on some architectures (like 64-bit PowerPC Linux), + # bfd_get_start_address actually points to a function descriptor, not + # the start function's entry point itself. + m:1::CORE_ADDR:bfd_entry_point:bfd *abfd:abfd:::generic_bfd_entry_point::0 # For SVR4 shared libraries, each call goes through a small piece of # trampoline code in the ".plt" section. IN_SOLIB_CALL_TRAMPOLINE evaluates Index: gdb/arch-utils.c =================================================================== RCS file: /cvs/src/src/gdb/arch-utils.c,v retrieving revision 1.83.4.1 diff -c -r1.83.4.1 arch-utils.c *** gdb/arch-utils.c 11 Jun 2003 06:40:14 -0000 1.83.4.1 --- gdb/arch-utils.c 11 Jun 2003 13:16:26 -0000 *************** *** 375,380 **** --- 375,386 ---- return 0; } + CORE_ADDR + generic_bfd_entry_point (struct gdbarch *gdbarch, bfd *abfd) + { + return bfd_get_start_address (abfd); + } + /* Legacy version of target_virtual_frame_pointer(). Assumes that there is an DEPRECATED_FP_REGNUM and that it is the same, cooked or raw. */ Index: gdb/arch-utils.h =================================================================== RCS file: /cvs/src/src/gdb/arch-utils.h,v retrieving revision 1.46.4.1 diff -c -r1.46.4.1 arch-utils.h *** gdb/arch-utils.h 11 Jun 2003 06:40:14 -0000 1.46.4.1 --- gdb/arch-utils.h 11 Jun 2003 13:16:26 -0000 *************** *** 89,94 **** --- 89,98 ---- being passed */ extern int frame_num_args_unknown (struct frame_info *fi); + /* Return the start address of ABFD. This is exactly like + bfd_get_start_address, except that it's a gdbarch function. */ + extern CORE_ADDR generic_bfd_entry_point (struct gdbarch *gdbarch, bfd *abfd); + /* The following DEPRECATED interfaces are for pre- multi-arch legacy targets. */ Index: gdb/gdbarch.c =================================================================== RCS file: /cvs/src/src/gdb/gdbarch.c,v retrieving revision 1.216 diff -c -r1.216 gdbarch.c *** gdb/gdbarch.c 17 May 2003 05:59:58 -0000 1.216 --- gdb/gdbarch.c 11 Jun 2003 13:16:28 -0000 *************** *** 263,268 **** --- 263,269 ---- gdbarch_software_single_step_ftype *software_single_step; gdbarch_print_insn_ftype *print_insn; gdbarch_skip_trampoline_code_ftype *skip_trampoline_code; + gdbarch_bfd_entry_point_ftype *bfd_entry_point; gdbarch_in_solib_call_trampoline_ftype *in_solib_call_trampoline; gdbarch_in_solib_return_trampoline_ftype *in_solib_return_trampoline; gdbarch_pc_in_sigtramp_ftype *pc_in_sigtramp; *************** *** 429,434 **** --- 430,436 ---- 0, 0, 0, + generic_bfd_entry_point, 0, 0, 0, *************** *** 555,560 **** --- 557,563 ---- current_gdbarch->smash_text_address = core_addr_identity; current_gdbarch->print_insn = legacy_print_insn; current_gdbarch->skip_trampoline_code = generic_skip_trampoline_code; + current_gdbarch->bfd_entry_point = generic_bfd_entry_point; current_gdbarch->in_solib_call_trampoline = generic_in_solib_call_trampoline; current_gdbarch->in_solib_return_trampoline = generic_in_solib_return_trampoline; current_gdbarch->pc_in_sigtramp = legacy_pc_in_sigtramp; *************** *** 745,750 **** --- 748,754 ---- /* Skip verify of software_single_step, has predicate */ /* Skip verify of print_insn, invalid_p == 0 */ /* Skip verify of skip_trampoline_code, invalid_p == 0 */ + /* Skip verify of bfd_entry_point, invalid_p == 0 */ /* Skip verify of in_solib_call_trampoline, invalid_p == 0 */ /* Skip verify of in_solib_return_trampoline, invalid_p == 0 */ /* Skip verify of pc_in_sigtramp, invalid_p == 0 */ *************** *** 788,793 **** --- 792,801 ---- GDB_MULTI_ARCH); if (GDB_MULTI_ARCH) fprintf_unfiltered (file, + "gdbarch_dump: bfd_entry_point = 0x%08lx\n", + (long) current_gdbarch->bfd_entry_point); + if (GDB_MULTI_ARCH) + fprintf_unfiltered (file, "gdbarch_dump: gdbarch_frame_align_p() = %d\n", gdbarch_frame_align_p (current_gdbarch)); if (GDB_MULTI_ARCH) *************** *** 5330,5335 **** --- 5338,5362 ---- gdbarch_skip_trampoline_code_ftype skip_trampoline_code) { gdbarch->skip_trampoline_code = skip_trampoline_code; + } + + CORE_ADDR + gdbarch_bfd_entry_point (struct gdbarch *gdbarch, bfd *abfd) + { + gdb_assert (gdbarch != NULL); + if (gdbarch->bfd_entry_point == 0) + internal_error (__FILE__, __LINE__, + "gdbarch: gdbarch_bfd_entry_point invalid"); + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_bfd_entry_point called\n"); + return gdbarch->bfd_entry_point (gdbarch, abfd); + } + + void + set_gdbarch_bfd_entry_point (struct gdbarch *gdbarch, + gdbarch_bfd_entry_point_ftype bfd_entry_point) + { + gdbarch->bfd_entry_point = bfd_entry_point; } int Index: gdb/gdbarch.h =================================================================== RCS file: /cvs/src/src/gdb/gdbarch.h,v retrieving revision 1.185 diff -c -r1.185 gdbarch.h *** gdb/gdbarch.h 17 May 2003 05:59:58 -0000 1.185 --- gdb/gdbarch.h 11 Jun 2003 13:16:29 -0000 *************** *** 2831,2836 **** --- 2831,2845 ---- #endif #endif + /* The actual code address at which ABFD would begin execution. Note + that on some architectures (like 64-bit PowerPC Linux), + bfd_get_start_address actually points to a function descriptor, not + the start function's entry point itself. */ + + typedef CORE_ADDR (gdbarch_bfd_entry_point_ftype) (struct gdbarch *gdbarch, bfd *abfd); + extern CORE_ADDR gdbarch_bfd_entry_point (struct gdbarch *gdbarch, bfd *abfd); + extern void set_gdbarch_bfd_entry_point (struct gdbarch *gdbarch, gdbarch_bfd_entry_point_ftype *bfd_entry_point); + /* For SVR4 shared libraries, each call goes through a small piece of trampoline code in the ".plt" section. IN_SOLIB_CALL_TRAMPOLINE evaluates to nonzero if we are currently stopped in one of these. */ Index: gdb/solib-svr4.c =================================================================== RCS file: /cvs/src/src/gdb/solib-svr4.c,v retrieving revision 1.32.8.2 diff -c -r1.32.8.2 solib-svr4.c *** gdb/solib-svr4.c 11 Jun 2003 13:00:34 -0000 1.32.8.2 --- gdb/solib-svr4.c 11 Jun 2003 13:16:32 -0000 *************** *** 1022,1028 **** the current pc (which should point at the entry point for the dynamic linker) and subtracting the offset of the entry point. */ if (!load_addr_found) ! load_addr = read_pc () - tmp_bfd->start_address; /* Record the relocated start and end address of the dynamic linker text and plt section for svr4_in_dynsym_resolve_code. */ --- 1022,1029 ---- the current pc (which should point at the entry point for the dynamic linker) and subtracting the offset of the entry point. */ if (!load_addr_found) ! load_addr = (read_pc () ! - generic_bfd_entry_point (current_gdbarch, tmp_bfd)); /* Record the relocated start and end address of the dynamic linker text and plt section for svr4_in_dynsym_resolve_code. */