Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Marcin Kościelnicki" <koriakin@0x04.net>
To: gdb-patches@sourceware.org
Cc: "Marcin Kościelnicki" <koriakin@0x04.net>
Subject: [PATCH 5/6] gdb/x86: Implement ax_pseudo_register_collect hook.
Date: Sat, 06 Feb 2016 20:54:00 -0000	[thread overview]
Message-ID: <1454792070-25410-1-git-send-email-koriakin@0x04.net> (raw)
In-Reply-To: <1454773157-31569-1-git-send-email-koriakin@0x04.net>

Makes "collect $ymm15" action work.

gdb/ChangeLog:

	* amd64-tdep.c (amd64_ax_pseudo_register_collect): New function.
	(amd64_init_abi): Fill ax_pseudo_register_collect hook.
	* i386-tdep.c (i386_ax_pseudo_register_collect): New function.
	(i386_gdbarch_init): Fill ax_pseudo_register_collect hook.
	* i386-tdep.h: Add i386_ax_pseudo_register_collect prototype.
---
 gdb/ChangeLog    |  8 ++++++
 gdb/amd64-tdep.c | 26 ++++++++++++++++++
 gdb/i386-tdep.c  | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 gdb/i386-tdep.h  |  4 +++
 4 files changed, 119 insertions(+)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 339f2d0..b3fda06 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
 2016-02-06  Marcin Kościelnicki  <koriakin@0x04.net>
 
+	* amd64-tdep.c (amd64_ax_pseudo_register_collect): New function.
+	(amd64_init_abi): Fill ax_pseudo_register_collect hook.
+	* i386-tdep.c (i386_ax_pseudo_register_collect): New function.
+	(i386_gdbarch_init): Fill ax_pseudo_register_collect hook.
+	* i386-tdep.h: Add i386_ax_pseudo_register_collect prototype.
+
+2016-02-06  Marcin Kościelnicki  <koriakin@0x04.net>
+
 	* tracefile-tfile.c (tfile_fetch_registers): Fix off-by-one in bounds
 	check.
 
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index fae92b2..d959ac2 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -455,6 +455,30 @@ amd64_pseudo_register_write (struct gdbarch *gdbarch,
     i386_pseudo_register_write (gdbarch, regcache, regnum, buf);
 }
 
+static int
+amd64_ax_pseudo_register_collect (struct gdbarch *gdbarch,
+				  struct agent_expr *ax, int regnum)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  if (i386_byte_regnum_p (gdbarch, regnum))
+    {
+      int gpnum = regnum - tdep->al_regnum;
+      if (gpnum >= AMD64_NUM_LOWER_BYTE_REGS)
+	ax_reg_mask (ax, gpnum - AMD64_NUM_LOWER_BYTE_REGS);
+      else
+	ax_reg_mask (ax, gpnum);
+      return 0;
+    }
+  else if (i386_dword_regnum_p (gdbarch, regnum))
+    {
+      int gpnum = regnum - tdep->eax_regnum;
+      ax_reg_mask (ax, gpnum);
+      return 0;
+    }
+  else
+    return i386_ax_pseudo_register_collect (gdbarch, ax, regnum);
+}
+
 \f
 
 /* Register classes as defined in the psABI.  */
@@ -2997,6 +3021,8 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 					  amd64_pseudo_register_read_value);
   set_gdbarch_pseudo_register_write (gdbarch,
 				     amd64_pseudo_register_write);
+  set_gdbarch_ax_pseudo_register_collect (gdbarch,
+					  amd64_ax_pseudo_register_collect);
 
   set_tdesc_pseudo_register_name (gdbarch, amd64_pseudo_register_name);
 
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index b706463..934c3ab 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -3603,6 +3603,85 @@ i386_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
 	internal_error (__FILE__, __LINE__, _("invalid regnum"));
     }
 }
+
+int
+i386_ax_pseudo_register_collect (struct gdbarch *gdbarch,
+				 struct agent_expr *ax, int regnum)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  if (i386_mmx_regnum_p (gdbarch, regnum))
+    {
+      /* MMX to FPU register mapping depends on current TOS.  Let's just
+	 not care and collect everything...  */
+      int i;
+      ax_reg_mask (ax, I387_FSTAT_REGNUM (tdep));
+      for (i = 0; i < 8; i++)
+	ax_reg_mask (ax, I387_ST0_REGNUM (tdep) + i);
+      return 0;
+    }
+  else if (i386_bnd_regnum_p (gdbarch, regnum))
+    {
+      regnum -= tdep->bnd0_regnum;
+      ax_reg_mask (ax, I387_BND0R_REGNUM (tdep) + regnum);
+      return 0;
+    }
+  else if (i386_k_regnum_p (gdbarch, regnum))
+    {
+      regnum -= tdep->k0_regnum;
+      ax_reg_mask (ax, tdep->k0_regnum + regnum);
+      return 0;
+    }
+  else if (i386_zmm_regnum_p (gdbarch, regnum))
+    {
+      regnum -= tdep->zmm0_regnum;
+      if (regnum < num_lower_zmm_regs)
+	{
+	  ax_reg_mask (ax, I387_XMM0_REGNUM (tdep) + regnum);
+	  ax_reg_mask (ax, tdep->ymm0h_regnum + regnum);
+	}
+      else
+	{
+	  ax_reg_mask (ax, I387_XMM16_REGNUM (tdep) + regnum
+			   - num_lower_zmm_regs);
+	  ax_reg_mask (ax, I387_YMM16H_REGNUM (tdep) + regnum
+			   - num_lower_zmm_regs);
+	}
+      ax_reg_mask (ax, tdep->zmm0h_regnum + regnum);
+      return 0;
+    }
+  else if (i386_ymm_regnum_p (gdbarch, regnum))
+    {
+      regnum -= tdep->ymm0_regnum;
+      ax_reg_mask (ax, I387_XMM0_REGNUM (tdep) + regnum);
+      ax_reg_mask (ax, tdep->ymm0h_regnum + regnum);
+      return 0;
+    }
+  else if (i386_ymm_avx512_regnum_p (gdbarch, regnum))
+    {
+      regnum -= tdep->ymm16_regnum;
+      ax_reg_mask (ax, I387_XMM16_REGNUM (tdep) + regnum);
+      ax_reg_mask (ax, tdep->ymm16h_regnum + regnum);
+      return 0;
+    }
+  else if (i386_word_regnum_p (gdbarch, regnum))
+    {
+      int gpnum = regnum - tdep->ax_regnum;
+      ax_reg_mask (ax, gpnum);
+      return 0;
+    }
+  else if (i386_byte_regnum_p (gdbarch, regnum))
+    {
+      /* Check byte pseudo registers last since this function will
+	 be called from amd64_ax_pseudo_register_collect, which handles
+	 byte pseudo registers differently.  */
+      int gpnum = regnum - tdep->al_regnum;
+      ax_reg_mask (ax, gpnum % 4);
+      return 0;
+    }
+  else
+    internal_error (__FILE__, __LINE__, _("invalid regnum"));
+  return 1;
+}
 \f
 
 /* Return the register number of the register allocated by GCC after
@@ -8423,6 +8502,8 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_pseudo_register_read_value (gdbarch,
 					  i386_pseudo_register_read_value);
   set_gdbarch_pseudo_register_write (gdbarch, i386_pseudo_register_write);
+  set_gdbarch_ax_pseudo_register_collect (gdbarch,
+					  i386_ax_pseudo_register_collect);
 
   set_tdesc_pseudo_register_type (gdbarch, i386_pseudo_register_type);
   set_tdesc_pseudo_register_name (gdbarch, i386_pseudo_register_name);
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
index 10d2772..770f59d 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -360,6 +360,10 @@ extern void i386_pseudo_register_write (struct gdbarch *gdbarch,
 					struct regcache *regcache,
 					int regnum, const gdb_byte *buf);
 
+extern int i386_ax_pseudo_register_collect (struct gdbarch *gdbarch,
+					    struct agent_expr *ax,
+					    int regnum);
+
 /* Segment selectors.  */
 #define I386_SEL_RPL	0x0003  /* Requester's Privilege Level mask.  */
 #define I386_SEL_UPL	0x0003	/* User Privilige Level.  */
-- 
2.7.0


  parent reply	other threads:[~2016-02-06 20:54 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-06 15:39 [PATCH 0/4] Save target description in tfile Marcin Kościelnicki
2016-02-06 15:39 ` [PATCH 3/4] gdb.trace: Use g packet order in tfile_fetch_registers Marcin Kościelnicki
2016-02-10 13:20   ` Pedro Alves
2016-02-10 13:21     ` Marcin Kościelnicki
2016-02-10 13:54       ` Pedro Alves
2016-02-10 14:12         ` [PATCH] " Marcin Kościelnicki
2016-02-10 14:21           ` Pedro Alves
2016-02-10 14:49             ` Marcin Kościelnicki
2016-02-06 15:39 ` [PATCH 2/4] gdb.trace: Read XML target description from tfile Marcin Kościelnicki
2016-02-10 13:02   ` Pedro Alves
2016-02-10 20:19     ` [PATCH 2/3] " Marcin Kościelnicki
2016-02-10 22:20       ` Pedro Alves
2016-02-10 22:35         ` Marcin Kościelnicki
2016-02-06 15:39 ` [PATCH 1/4] gdb.trace: Save XML target description in tfile Marcin Kościelnicki
2016-02-10 13:02   ` Pedro Alves
2016-02-10 20:18     ` [PATCH 1/3] " Marcin Kościelnicki
2016-02-10 22:20       ` Pedro Alves
2016-02-10 22:35         ` Marcin Kościelnicki
2016-02-11 19:02           ` Simon Marchi
2016-02-11 21:28             ` Sergio Durigan Junior
2016-02-11 22:31             ` Marcin Kościelnicki
2016-02-11 22:56             ` [PATCH] gdb: Fix build failure in xml-tdesc.c without expat Marcin Kościelnicki
2016-02-12 10:06               ` Pedro Alves
2016-02-12 10:10                 ` Marcin Kościelnicki
2016-02-12 10:19                   ` Pedro Alves
2016-02-12 10:21                     ` Marcin Kościelnicki
2016-02-06 15:47 ` [PATCH 4/4] gdb.trace: Fix off-by-one in tfile_fetch_registers Marcin Kościelnicki
2016-02-10 13:22   ` Pedro Alves
2016-02-10 13:53     ` Marcin Kościelnicki
2016-02-06 20:54 ` Marcin Kościelnicki [this message]
2016-02-06 20:54   ` [PATCH 6/6] gdb.trace: Add a testcase for tdesc in tfile Marcin Kościelnicki
2016-02-10 13:50     ` Pedro Alves
2016-02-11 10:14       ` [PATCH] " Marcin Kościelnicki
2016-02-11 13:00         ` Pedro Alves
2016-02-11 14:17           ` Marcin Kościelnicki
2016-02-12 18:32             ` Antoine Tremblay
2016-02-12 18:40               ` Marcin Kościelnicki
2016-02-12 18:49                 ` Antoine Tremblay
2016-02-12 18:53                   ` Marcin Kościelnicki
2016-02-12 18:57                     ` Antoine Tremblay
2016-02-12 19:47                       ` [PATCH] gdb.trace/tfile-avx.c: Change ymm15 to xmm15 for old gcc Marcin Kościelnicki
2016-02-12 19:57                         ` Pedro Alves
2016-02-12 21:34                           ` Marcin Kościelnicki
2016-02-10 13:31   ` [PATCH 5/6] gdb/x86: Implement ax_pseudo_register_collect hook Pedro Alves
2016-02-10 13:34     ` Marcin Kościelnicki
2016-02-10 13:50       ` Pedro Alves
2016-02-10 14:27         ` [PATCH] " Marcin Kościelnicki
2016-02-10 14:28           ` Pedro Alves
2016-02-10 14:49             ` Marcin Kościelnicki
2016-02-10 14:24 ` [PATCH 0/4] Save target description in tfile Pedro Alves
2016-02-10 14:25   ` Marcin Kościelnicki
2016-02-10 20:19   ` [PATCH 3/3] gdb/doc: Add documentation for tfile description section lines Marcin Kościelnicki
2016-02-10 22:20     ` Pedro Alves
2016-02-17  9:50       ` Marcin Kościelnicki
2016-02-17 15:37         ` Pedro Alves
2016-02-17 15:38           ` Pedro Alves
2016-02-17 15:59         ` Eli Zaretskii
2016-02-17 16:04           ` Marcin Kościelnicki
2016-02-17 16:05             ` Pedro Alves
2016-02-18  8:28               ` Marcin Kościelnicki
2016-02-11 17:36 ` [PATCH 0/4] Save target description in tfile Yao Qi
2016-02-12  1:49   ` Marcin Kościelnicki
2016-02-12 12:13     ` Yao Qi

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=1454792070-25410-1-git-send-email-koriakin@0x04.net \
    --to=koriakin@0x04.net \
    --cc=gdb-patches@sourceware.org \
    /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