From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31808 invoked by alias); 16 Nov 2001 21:24:15 -0000 Mailing-List: contact gdb-patches-help@sourceware.cygnus.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 31771 invoked from network); 16 Nov 2001 21:24:09 -0000 Received: from unknown (HELO nevyn.them.org) (128.2.145.6) by sourceware.cygnus.com with SMTP; 16 Nov 2001 21:24:09 -0000 Received: from drow by nevyn.them.org with local (Exim 3.32 #1 (Debian)) id 164qTH-000810-00 for ; Fri, 16 Nov 2001 16:24:23 -0500 Date: Wed, 07 Nov 2001 07:32:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sources.redhat.com Subject: [rfa] Mips heuristic_proc_desc vs. the stack pointer. Message-ID: <20011116162423.A30736@nevyn.them.org> Mail-Followup-To: gdb-patches@sources.redhat.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.23i X-SW-Source: 2001-11/txt/msg00099.txt.bz2 As HJ noticed, we try to read the stack pointer in heuristic_proc_desc. I'm not sure why this normally works and fails with linuxthread support, but I'm convinced it's sometimes wrong. If we are called from after_prologue(), the stack pointer has nothing to do with the function we're trying to generate a desc for. We shouldn't try to read it in this case. The uses of it in *_heuristic_proc_desc are harmless. Is this OK, Andrew? -- Daniel Jacobowitz Carnegie Mellon University MontaVista Software Debian GNU/Linux Developer 2001-11-16 Daniel Jacobowitz * mips-tdep.c (find_proc_desc): Add read_sp argument. Update all callers. (heuristic_proc_desc): Likewise. Do not read SP if read_sp == 0. Index: mips-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/mips-tdep.c,v retrieving revision 1.60 diff -u -p -r1.60 mips-tdep.c --- mips-tdep.c 2001/10/15 18:18:29 1.60 +++ mips-tdep.c 2001/11/16 21:18:23 @@ -239,7 +240,7 @@ int gdb_print_insn_mips (bfd_vma, disass static void mips_print_register (int, int); static mips_extra_func_info_t -heuristic_proc_desc (CORE_ADDR, CORE_ADDR, struct frame_info *); +heuristic_proc_desc (CORE_ADDR, CORE_ADDR, struct frame_info *, int); static CORE_ADDR heuristic_proc_start (CORE_ADDR); @@ -252,7 +253,7 @@ static void mips_show_processor_type_com static void reinit_frame_cache_sfunc (char *, int, struct cmd_list_element *); static mips_extra_func_info_t -find_proc_desc (CORE_ADDR pc, struct frame_info *next_frame); +find_proc_desc (CORE_ADDR pc, struct frame_info *next_frame, int read_sp); static CORE_ADDR after_prologue (CORE_ADDR pc, mips_extra_func_info_t proc_desc); @@ -562,7 +563,7 @@ after_prologue (CORE_ADDR pc, CORE_ADDR func_addr, func_end; if (!proc_desc) - proc_desc = find_proc_desc (pc, NULL); + proc_desc = find_proc_desc (pc, NULL, 0); if (proc_desc) { @@ -1858,10 +1859,15 @@ restart: static mips_extra_func_info_t heuristic_proc_desc (CORE_ADDR start_pc, CORE_ADDR limit_pc, - struct frame_info *next_frame) + struct frame_info *next_frame, int read_sp) { - CORE_ADDR sp = read_next_frame_reg (next_frame, SP_REGNUM); + CORE_ADDR sp; + if (read_sp) + sp = read_next_frame_reg (next_frame, SP_REGNUM); + else + sp = 0; + if (start_pc == 0) return NULL; memset (&temp_proc_desc, '\0', sizeof (temp_proc_desc)); @@ -1919,7 +1925,7 @@ non_heuristic_proc_desc (CORE_ADDR pc, C static mips_extra_func_info_t -find_proc_desc (CORE_ADDR pc, struct frame_info *next_frame) +find_proc_desc (CORE_ADDR pc, struct frame_info *next_frame, int read_sp) { mips_extra_func_info_t proc_desc; CORE_ADDR startaddr; @@ -1951,7 +1957,7 @@ find_proc_desc (CORE_ADDR pc, struct fra { mips_extra_func_info_t found_heuristic = heuristic_proc_desc (PROC_LOW_ADDR (proc_desc), - pc, next_frame); + pc, next_frame, read_sp); if (found_heuristic) proc_desc = found_heuristic; } @@ -1975,7 +1981,7 @@ find_proc_desc (CORE_ADDR pc, struct fra startaddr = heuristic_proc_start (pc); proc_desc = - heuristic_proc_desc (startaddr, pc, next_frame); + heuristic_proc_desc (startaddr, pc, next_frame, read_sp); } return proc_desc; } @@ -2007,7 +2013,7 @@ mips_frame_chain (struct frame_info *fra saved_pc = tmp; /* Look up the procedure descriptor for this PC. */ - proc_desc = find_proc_desc (saved_pc, frame); + proc_desc = find_proc_desc (saved_pc, frame, 1); if (!proc_desc) return 0; @@ -2033,7 +2039,7 @@ mips_init_extra_frame_info (int fromleaf /* Use proc_desc calculated in frame_chain */ mips_extra_func_info_t proc_desc = - fci->next ? cached_proc_desc : find_proc_desc (fci->pc, fci->next); + fci->next ? cached_proc_desc : find_proc_desc (fci->pc, fci->next, 1); fci->extra_info = (struct frame_extra_info *) frame_obstack_alloc (sizeof (struct frame_extra_info));