From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15650 invoked by alias); 7 May 2007 22:24:56 -0000 Received: (qmail 15636 invoked by uid 22791); 7 May 2007 22:24:52 -0000 X-Spam-Check-By: sourceware.org Received: from mtagate4.de.ibm.com (HELO mtagate4.de.ibm.com) (195.212.29.153) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 07 May 2007 22:24:46 +0000 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate4.de.ibm.com (8.13.8/8.13.8) with ESMTP id l47MOi3r044124 for ; Mon, 7 May 2007 22:24:44 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v8.3) with ESMTP id l47MOhfA3723422 for ; Tue, 8 May 2007 00:24:43 +0200 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id l47MOh0H023288 for ; Tue, 8 May 2007 00:24:43 +0200 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with SMTP id l47MOhOw023285 for ; Tue, 8 May 2007 00:24:43 +0200 Message-Id: <200705072224.l47MOhOw023285@d12av02.megacenter.de.ibm.com> Received: by tuxmaker.boeblingen.de.ibm.com (sSMTP sendmail emulation); Tue, 8 May 2007 00:24:43 +0200 Subject: [rfc] [1/4] SPU overlay support: New gdbarch_overlay_update routine To: gdb-patches@sourceware.org Date: Mon, 07 May 2007 22:24:00 -0000 From: "Ulrich Weigand" X-Mailer: ELM [version 2.5 PL2] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-05/txt/msg00093.txt.bz2 Hello, on spu-elf we have code overlays, but the structure of the overlay table used by the overlay manager is different from the "simple" overlay manager implemented in GDB. To enable SPU overlay support, this patch adds a new gdbarch function that allows to install platform-specific "overlay_update" routines to handle those details. According to the overlays.exp test case, only the (obsolete) d10v and m32r targets support overlays. Thus I've installed the existing "simple" overlay manager for the m32r target only. If this is incorrect, it could be added to other targets as well. Or should we have the gdbarch function default always to simple_overlay_update? Tested on spu-elf (together with the next patch). Any comments? I plan to commit this in a couple of days ... Bye, Ulrich ChangeLog: * gdbarch.sh (overlay_update): New gdbarch function. (struct obj_section): Add forward declaration. * gdbarch.c, gdbarch.h: Regenerate. * symfile.c (simple_overlay_update): Make global. (target_overlay_update): Remove variable. (overlay_is_mapped): Call gdbarch_overlay_update instead of target_overlay_update. (overlay_load_command): Likewise. * symfile.h (struct obj_section): Add forward declaration. (simple_overlay_update): Add prototype. * m32r-tdep.c (m32r_gdbarch_init): Install simple_overlay_update. diff -urNp gdb-orig/gdb/gdbarch.c gdb-head/gdb/gdbarch.c --- gdb-orig/gdb/gdbarch.c 2007-05-07 22:32:46.148712110 +0200 +++ gdb-head/gdb/gdbarch.c 2007-05-07 22:27:45.389355926 +0200 @@ -238,6 +238,7 @@ struct gdbarch int vtable_function_descriptors; int vbit_in_delta; gdbarch_skip_permanent_breakpoint_ftype *skip_permanent_breakpoint; + gdbarch_overlay_update_ftype *overlay_update; }; @@ -366,6 +367,7 @@ struct gdbarch startup_gdbarch = 0, /* vtable_function_descriptors */ 0, /* vbit_in_delta */ 0, /* skip_permanent_breakpoint */ + 0, /* overlay_update */ /* startup_gdbarch() */ }; @@ -621,6 +623,7 @@ verify_gdbarch (struct gdbarch *current_ /* Skip verify of vtable_function_descriptors, invalid_p == 0 */ /* Skip verify of vbit_in_delta, invalid_p == 0 */ /* Skip verify of skip_permanent_breakpoint, has predicate */ + /* Skip verify of overlay_update, has predicate */ buf = ui_file_xstrdup (log, &dummy); make_cleanup (xfree, buf); if (strlen (buf) > 0) @@ -1249,6 +1252,12 @@ gdbarch_dump (struct gdbarch *current_gd fprintf_unfiltered (file, "gdbarch_dump: osabi = %s\n", paddr_d (current_gdbarch->osabi)); + fprintf_unfiltered (file, + "gdbarch_dump: gdbarch_overlay_update_p() = %d\n", + gdbarch_overlay_update_p (current_gdbarch)); + fprintf_unfiltered (file, + "gdbarch_dump: overlay_update = <0x%lx>\n", + (long) current_gdbarch->overlay_update); #ifdef PC_REGNUM fprintf_unfiltered (file, "gdbarch_dump: PC_REGNUM # %s\n", @@ -3674,6 +3683,30 @@ set_gdbarch_skip_permanent_breakpoint (s gdbarch->skip_permanent_breakpoint = skip_permanent_breakpoint; } +int +gdbarch_overlay_update_p (struct gdbarch *gdbarch) +{ + gdb_assert (gdbarch != NULL); + return gdbarch->overlay_update != NULL; +} + +void +gdbarch_overlay_update (struct gdbarch *gdbarch, struct obj_section *osect) +{ + gdb_assert (gdbarch != NULL); + gdb_assert (gdbarch->overlay_update != NULL); + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_overlay_update called\n"); + gdbarch->overlay_update (osect); +} + +void +set_gdbarch_overlay_update (struct gdbarch *gdbarch, + gdbarch_overlay_update_ftype overlay_update) +{ + gdbarch->overlay_update = overlay_update; +} + /* Keep a registry of per-architecture data-pointers required by GDB modules. */ diff -urNp gdb-orig/gdb/gdbarch.h gdb-head/gdb/gdbarch.h --- gdb-orig/gdb/gdbarch.h 2007-05-07 22:32:46.158710671 +0200 +++ gdb-head/gdb/gdbarch.h 2007-05-07 22:27:25.633138830 +0200 @@ -42,6 +42,7 @@ struct ui_file; struct frame_info; struct value; struct objfile; +struct obj_section; struct minimal_symbol; struct regcache; struct reggroup; @@ -1376,6 +1377,14 @@ typedef void (gdbarch_skip_permanent_bre extern void gdbarch_skip_permanent_breakpoint (struct gdbarch *gdbarch, struct regcache *regcache); extern void set_gdbarch_skip_permanent_breakpoint (struct gdbarch *gdbarch, gdbarch_skip_permanent_breakpoint_ftype *skip_permanent_breakpoint); +/* Refresh overlay mapped state for section OSECT. */ + +extern int gdbarch_overlay_update_p (struct gdbarch *gdbarch); + +typedef void (gdbarch_overlay_update_ftype) (struct obj_section *osect); +extern void gdbarch_overlay_update (struct gdbarch *gdbarch, struct obj_section *osect); +extern void set_gdbarch_overlay_update (struct gdbarch *gdbarch, gdbarch_overlay_update_ftype *overlay_update); + extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch); diff -urNp gdb-orig/gdb/gdbarch.sh gdb-head/gdb/gdbarch.sh --- gdb-orig/gdb/gdbarch.sh 2007-05-07 22:32:46.168709233 +0200 +++ gdb-head/gdb/gdbarch.sh 2007-05-07 22:27:15.888077084 +0200 @@ -685,6 +685,9 @@ v::int:vbit_in_delta:::0:0::0 # Advance PC to next instruction in order to skip a permanent breakpoint. F::void:skip_permanent_breakpoint:struct regcache *regcache:regcache + +# Refresh overlay mapped state for section OSECT. +F::void:overlay_update:struct obj_section *osect:osect EOF } @@ -787,6 +790,7 @@ struct ui_file; struct frame_info; struct value; struct objfile; +struct obj_section; struct minimal_symbol; struct regcache; struct reggroup; diff -urNp gdb-orig/gdb/m32r-tdep.c gdb-head/gdb/m32r-tdep.c --- gdb-orig/gdb/m32r-tdep.c 2007-05-07 22:32:46.174708370 +0200 +++ gdb-head/gdb/m32r-tdep.c 2007-05-07 22:26:30.301718277 +0200 @@ -963,6 +963,9 @@ m32r_gdbarch_init (struct gdbarch_info i /* Hook in the default unwinders. */ frame_unwind_append_sniffer (gdbarch, m32r_frame_sniffer); + /* Support simple overlay manager. */ + set_gdbarch_overlay_update (gdbarch, simple_overlay_update); + return gdbarch; } diff -urNp gdb-orig/gdb/symfile.c gdb-head/gdb/symfile.c --- gdb-orig/gdb/symfile.c 2007-05-07 22:32:46.199704774 +0200 +++ gdb-head/gdb/symfile.c 2007-05-07 22:32:57.284839784 +0200 @@ -3042,10 +3042,6 @@ init_psymbol_list (struct objfile *objfi enum overlay_debugging_state overlay_debugging = ovly_off; int overlay_cache_invalid = 0; /* True if need to refresh mapped state */ -/* Target vector for refreshing overlay mapped state */ -static void simple_overlay_update (struct obj_section *); -void (*target_overlay_update) (struct obj_section *) = simple_overlay_update; - /* Function: section_is_overlay (SECTION) Returns true if SECTION has VMA not equal to LMA, ie. SECTION is loaded at an address different from where it will "run". */ @@ -3099,9 +3095,9 @@ overlay_is_mapped (struct obj_section *o case ovly_off: return 0; /* overlay debugging off */ case ovly_auto: /* overlay debugging automatic */ - /* Unles there is a target_overlay_update function, + /* Unles there is a gdbarch_overlay_update function, there's really nothing useful to do here (can't really go auto) */ - if (target_overlay_update) + if (gdbarch_overlay_update_p (current_gdbarch)) { if (overlay_cache_invalid) { @@ -3109,7 +3105,7 @@ overlay_is_mapped (struct obj_section *o overlay_cache_invalid = 0; } if (osect->ovly_mapped == -1) - (*target_overlay_update) (osect); + gdbarch_overlay_update (current_gdbarch, osect); } /* fall thru to manual case */ case ovly_on: /* overlay debugging manual */ @@ -3462,8 +3458,8 @@ overlay_off_command (char *args, int fro static void overlay_load_command (char *args, int from_tty) { - if (target_overlay_update) - (*target_overlay_update) (NULL); + if (gdbarch_overlay_update_p (current_gdbarch)) + gdbarch_overlay_update (current_gdbarch, NULL); else error (_("This target does not know how to read its overlay state.")); } @@ -3487,7 +3483,7 @@ overlay_command (char *args, int from_tt This is GDB's default target overlay layer. It works with the minimal overlay manager supplied as an example by Cygnus. The - entry point is via a function pointer "target_overlay_update", + entry point is via a function pointer "gdbarch_overlay_update", so targets that use a different runtime overlay manager can substitute their own overlay_update function and take over the function pointer. @@ -3690,7 +3686,7 @@ simple_overlay_update_1 (struct obj_sect If a cached entry can't be found or the cache isn't valid, then re-read the entire cache, and go ahead and update all sections. */ -static void +void simple_overlay_update (struct obj_section *osect) { struct objfile *objfile; diff -urNp gdb-orig/gdb/symfile.h gdb-head/gdb/symfile.h --- gdb-orig/gdb/symfile.h 2007-05-07 22:32:46.205703911 +0200 +++ gdb-head/gdb/symfile.h 2007-05-07 22:26:30.342712380 +0200 @@ -29,6 +29,7 @@ /* Opaque declarations. */ struct section_table; struct objfile; +struct obj_section; struct obstack; struct block; @@ -306,6 +307,9 @@ extern void symbol_file_add_main (char * /* Clear GDB symbol tables. */ extern void symbol_file_clear (int from_tty); +/* Default overlay update function. */ +extern void simple_overlay_update (struct obj_section *); + extern bfd_byte *symfile_relocate_debug_section (bfd *abfd, asection *sectp, bfd_byte * buf); -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE Ulrich.Weigand@de.ibm.com