Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Maxim Grigoriev <maxim@tensilica.com>
To: Ulrich Weigand <uweigand@de.ibm.com>
Cc: Markus Deuling <deuling@de.ibm.com>,
	  GDB Patches <gdb-patches@sourceware.org>
Subject: [commit] Get rid of current_gdbarch in xtensa
Date: Wed, 21 May 2008 22:27:00 -0000	[thread overview]
Message-ID: <48346B9E.2080800@hq.tensilica.com> (raw)
In-Reply-To: <200805201532.m4KFWNcS021488@d12av02.megacenter.de.ibm.com>

[-- Attachment #1: Type: text/plain, Size: 145 bytes --]

Getting rid of current_gdbarch and current_regcache in xtensa-tdep.c
Patch provided by Markus was updated according to suggestion from Ulrich.



[-- Attachment #2: Markus_Maxim.diff --]
[-- Type: text/x-patch, Size: 5810 bytes --]

2008-05-21 Markus Deuling  <deuling@de.ibm.com>
	   Maxim Grigoriev  <maxim2405@gmail.com>

	* xtensa-tdep.c (xtensa_read_register): Remove.
	(xtensa_frame_cache): Get rid of xtensa_read_register. Pass extra
	argument litbase to call0_frame_cache().
	(call0_track_op, call0_analyze_prologue)
	(call0_frame_cache): Use extra argument litbase.

Index: gdb/xtensa-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/xtensa-tdep.c,v
retrieving revision 1.26
diff -u -r1.26 xtensa-tdep.c
--- gdb/xtensa-tdep.c	16 May 2008 00:27:23 -0000	1.26
+++ gdb/xtensa-tdep.c	21 May 2008 18:10:54 -0000
@@ -211,15 +211,6 @@
   return 0;
 }
 
-static unsigned long
-xtensa_read_register (int regnum)
-{
-  ULONGEST value;
-
-  regcache_raw_read_unsigned (get_current_regcache (), regnum, &value);
-  return (unsigned long) value;
-}
-
 /* Return the type of a register.  Create a new type, if necessary.  */
 
 static struct ctype_cache
@@ -959,7 +950,7 @@
   CORE_ADDR base;	/* Stack pointer of this frame.  */
   CORE_ADDR pc;		/* PC at the entry point to the function.  */
   CORE_ADDR ra;		/* The raw return address (without CALLINC).  */
-  CORE_ADDR ps;		/* The PS register of the previous frame.  */
+  CORE_ADDR ps;		/* The PS register of this frame.  */
   CORE_ADDR prev_sp;	/* Stack Pointer of the previous frame.  */
   int call0;		/* It's a call0 framework (else windowed).  */
   union
@@ -1178,7 +1169,7 @@
 static void
 call0_frame_cache (struct frame_info *this_frame,
 		   xtensa_frame_cache_t *cache,
-		   CORE_ADDR pc);
+		   CORE_ADDR pc, CORE_ADDR litbase);
 
 static struct xtensa_frame_cache *
 xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
@@ -1186,7 +1177,6 @@
   xtensa_frame_cache_t *cache;
   CORE_ADDR ra, wb, ws, pc, sp, ps;
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  unsigned int ps_regnum = gdbarch_ps_regnum (gdbarch);
   unsigned int fp_regnum;
   char op1;
   int  windowed;
@@ -1194,14 +1184,14 @@
   if (*this_cache)
     return *this_cache;
 
-  windowed = windowing_enabled (xtensa_read_register (ps_regnum));
+  ps = get_frame_register_unsigned (this_frame, gdbarch_ps_regnum (gdbarch));
+  windowed = windowing_enabled (ps);
 
   /* Get pristine xtensa-frame.  */
   cache = xtensa_alloc_frame_cache (windowed);
   *this_cache = cache;
 
-  pc = get_frame_register_unsigned (this_frame,
-				    gdbarch_pc_regnum (gdbarch));
+  pc = get_frame_register_unsigned (this_frame, gdbarch_pc_regnum (gdbarch));
 
   if (windowed)
     {
@@ -1210,7 +1200,6 @@
 					gdbarch_tdep (gdbarch)->wb_regnum);
       ws = get_frame_register_unsigned (this_frame,
 					gdbarch_tdep (gdbarch)->ws_regnum);
-      ps = get_frame_register_unsigned (this_frame, ps_regnum);
 
       op1 = read_memory_integer (pc, 1);
       if (XTENSA_IS_ENTRY (gdbarch, op1))
@@ -1303,13 +1292,17 @@
 			     (gdbarch, gdbarch_tdep (gdbarch)->a0_base + 1,
 			      cache->wd.wb);
 
-	      cache->prev_sp = xtensa_read_register (regnum);
+	      cache->prev_sp = get_frame_register_unsigned (this_frame, regnum);
 	    }
 	}
     }
   else	/* Call0 framework.  */
     {
-      call0_frame_cache (this_frame, cache, pc);
+      unsigned int litbase_regnum = gdbarch_tdep (gdbarch)->litbase_regnum;
+      CORE_ADDR litbase = (litbase_regnum == -1)
+	? 0 : get_frame_register_unsigned (this_frame, litbase_regnum);
+
+      call0_frame_cache (this_frame, cache, pc, litbase);
       fp_regnum = cache->c0.fp_regnum;
     }
 
@@ -1981,9 +1974,9 @@
 static void
 call0_track_op (xtensa_c0reg_t dst[], xtensa_c0reg_t src[],
 		xtensa_insn_kind opclass, int nods, unsigned odv[],
-		CORE_ADDR pc, int spreg)
+		CORE_ADDR pc, CORE_ADDR litbase, int spreg)
 {
-  unsigned litbase, litaddr, litval;
+  unsigned litaddr, litval;
 
   switch (opclass)
     {
@@ -2033,10 +2026,6 @@
     case c0opc_l32r:
       /* 2 operands: dst, literal offset.  */
       gdb_assert (nods == 2);
-      /* litbase = xtensa_get_litbase (pc); can be also used.  */
-      litbase = (gdbarch_tdep (current_gdbarch)->litbase_regnum == -1)
-	? 0 : xtensa_read_register
-		(gdbarch_tdep (current_gdbarch)->litbase_regnum);
       litaddr = litbase & 1
 		  ? (litbase & ~1) + (signed)odv[1]
 		  : (pc + 3  + (signed)odv[1]) & ~3;
@@ -2093,7 +2082,7 @@
       because they begin with default assumptions that analysis may change.  */
 
 static CORE_ADDR
-call0_analyze_prologue (CORE_ADDR start, CORE_ADDR pc,
+call0_analyze_prologue (CORE_ADDR start, CORE_ADDR pc, CORE_ADDR litbase,
 			int nregs, xtensa_c0reg_t rt[], int *call0)
 {
   CORE_ADDR ia;		    /* Current insn address in prologue.  */
@@ -2285,7 +2274,7 @@
 	    }
 
 	  /* Track register movement and modification for this operation.  */
-	  call0_track_op (rt, rtmp, opclass, nods, odv, ia, 1);
+	  call0_track_op (rt, rtmp, opclass, nods, odv, ia, litbase, 1);
 	}
     }
 done:
@@ -2300,7 +2289,7 @@
 
 static void
 call0_frame_cache (struct frame_info *this_frame,
-		   xtensa_frame_cache_t *cache, CORE_ADDR pc)
+		   xtensa_frame_cache_t *cache, CORE_ADDR pc, CORE_ADDR litbase)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   CORE_ADDR start_pc;		/* The beginning of the function.  */
@@ -2313,7 +2302,7 @@
 
   if (find_pc_partial_function (pc, NULL, &start_pc, NULL))
     {
-      body_pc = call0_analyze_prologue (start_pc, pc, C0_NREGS,
+      body_pc = call0_analyze_prologue (start_pc, pc, litbase, C0_NREGS,
 					&cache->c0.c0_rt[0],
 					&cache->call0);
     }
@@ -2487,7 +2476,7 @@
     }
 
   /* No debug line info.  Analyze prologue for Call0 or simply skip ENTRY.  */
-  body_pc = call0_analyze_prologue(start_pc, 0, 0, NULL, NULL);
+  body_pc = call0_analyze_prologue(start_pc, 0, 0, 0, NULL, NULL);
   return body_pc != 0 ? body_pc : start_pc;
 }
 

  parent reply	other threads:[~2008-05-21 18:36 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-05-19 15:17 [patch] " Markus Deuling
2008-05-20 18:08 ` Ulrich Weigand
2008-05-20 22:15   ` Maxim Grigoriev
2008-05-20 22:23     ` Ulrich Weigand
2008-05-21 22:27   ` Maxim Grigoriev [this message]
2008-05-23 14:44     ` [commit] " Markus Deuling

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48346B9E.2080800@hq.tensilica.com \
    --to=maxim@tensilica.com \
    --cc=deuling@de.ibm.com \
    --cc=gdb-patches@sourceware.org \
    --cc=uweigand@de.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox