From: "Marcin Kościelnicki" <koriakin@0x04.net>
To: palves@redhat.com
Cc: gdb-patches@sourceware.org, "Marcin Kościelnicki" <koriakin@0x04.net>
Subject: [PATCH] gdb/x86: Implement ax_pseudo_register_collect hook.
Date: Wed, 10 Feb 2016 14:27:00 -0000 [thread overview]
Message-ID: <1455114446-25583-1-git-send-email-koriakin@0x04.net> (raw)
In-Reply-To: <56BB4030.3040600@redhat.com>
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.
* gdb/i386-tdep.c (i386_pseudo_register_read_into_value): Remove
misleading comment.
(i386_pseudo_register_write): Ditto.
(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.
---
Fixed, misleading comments removed. OK to push now?
gdb/ChangeLog | 11 +++++++
gdb/amd64-tdep.c | 31 +++++++++++++++++++
gdb/i386-tdep.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++----
gdb/i386-tdep.h | 4 +++
4 files changed, 130 insertions(+), 6 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index fd7dd9d..c260834 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,16 @@
2016-02-10 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.
+ * gdb/i386-tdep.c (i386_pseudo_register_read_into_value): Remove
+ misleading comment.
+ (i386_pseudo_register_write): Ditto.
+ (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-10 Marcin KoÅcielnicki <koriakin@0x04.net>
+
* tracefile-tfile.c (tfile_fetch_registers): Use g packet order
instead of gdb order.
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index fae92b2..a62efde 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -455,6 +455,35 @@ amd64_pseudo_register_write (struct gdbarch *gdbarch,
i386_pseudo_register_write (gdbarch, regcache, regnum, buf);
}
+/* Implement the 'ax_pseudo_register_collect' gdbarch method. */
+
+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 +3026,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..db4cd0a 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -3419,9 +3419,6 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
}
else if (i386_byte_regnum_p (gdbarch, regnum))
{
- /* Check byte pseudo registers last since this function will
- be called from amd64_pseudo_register_read, which handles
- byte pseudo registers differently. */
int gpnum = regnum - tdep->al_regnum;
/* Extract (always little endian). We read both lower and
@@ -3584,9 +3581,6 @@ i386_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
}
else if (i386_byte_regnum_p (gdbarch, regnum))
{
- /* Check byte pseudo registers last since this function will
- be called from amd64_pseudo_register_read, which handles
- byte pseudo registers differently. */
int gpnum = regnum - tdep->al_regnum;
/* Read ... We read both lower and upper registers. */
@@ -3603,6 +3597,88 @@ i386_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
internal_error (__FILE__, __LINE__, _("invalid regnum"));
}
}
+
+/* Implement the 'ax_pseudo_register_collect' gdbarch method. */
+
+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))
+ {
+ 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 +8499,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
next prev parent reply other threads:[~2016-02-10 14:27 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 1/4] gdb.trace: Save XML " 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: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: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 ` [PATCH 5/6] gdb/x86: Implement ax_pseudo_register_collect hook Marcin Kościelnicki
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 ` Marcin Kościelnicki [this message]
2016-02-10 14:28 ` [PATCH] " 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=1455114446-25583-1-git-send-email-koriakin@0x04.net \
--to=koriakin@0x04.net \
--cc=gdb-patches@sourceware.org \
--cc=palves@redhat.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