150 lines
10 KiB
Diff
150 lines
10 KiB
Diff
|
commit 084ee54552f6c35d740e8b9bc81a4fe8d8bb178b
|
|||
|
Author: Ulrich Weigand <ulrich.weigand@de.ibm.com>
|
|||
|
Date: Tue Feb 4 18:31:38 2014 +0100
|
|||
|
|
|||
|
PowerPC64 little-endian fixes: VSX tests and pseudo-regs
|
|||
|
|
|||
|
Many VSX test were failing on powerpc64le-linux, since -as opposed to the
|
|||
|
AltiVec tests- there never were little-endian versions of the test patterns.
|
|||
|
|
|||
|
This patch adds such patterns, along the lines of altivec-regs.exp.
|
|||
|
|
|||
|
In addition, there is an actual code change required: For those VSX
|
|||
|
registers that overlap a floating-point register, the FP register
|
|||
|
overlaps the most-significant half of the VSX register both on big-
|
|||
|
and little-endian systems. However, on little-endian systems, that
|
|||
|
half is stored at an offset of 8 bytes (not 0). This works already
|
|||
|
for the "real" FP registers, but current code gets it wrong for
|
|||
|
the "extended" pseudo FP register GDB generates for the second
|
|||
|
half of the VSX register bank.
|
|||
|
|
|||
|
This patch updates the corresponding pseudo read/write routines
|
|||
|
to take the appropriate offset into consideration.
|
|||
|
|
|||
|
gdb/ChangeLog:
|
|||
|
|
|||
|
* rs6000-tdep.c (efpr_pseudo_register_read): Use correct offset
|
|||
|
of the overlapped FP register within the VSX register on little-
|
|||
|
endian platforms.
|
|||
|
(efpr_pseudo_register_write): Likewise.
|
|||
|
|
|||
|
gdb/testsuite/ChangeLog:
|
|||
|
|
|||
|
* gdb.arch/vsx-regs.exp: Check target endianness. Provide variants
|
|||
|
of the test patterns for use on little-endian systems.
|
|||
|
|
|||
|
### a/gdb/ChangeLog
|
|||
|
### b/gdb/ChangeLog
|
|||
|
## -1,5 +1,12 @@
|
|||
|
2014-02-04 Ulrich Weigand <uweigand@de.ibm.com>
|
|||
|
|
|||
|
+ * rs6000-tdep.c (efpr_pseudo_register_read): Use correct offset
|
|||
|
+ of the overlapped FP register within the VSX register on little-
|
|||
|
+ endian platforms.
|
|||
|
+ (efpr_pseudo_register_write): Likewise.
|
|||
|
+
|
|||
|
+2014-02-04 Ulrich Weigand <uweigand@de.ibm.com>
|
|||
|
+
|
|||
|
* ppc-sysv-tdep.c (ppc64_sysv_abi_push_val): Use correct
|
|||
|
offset on little-endian when passing small structures.
|
|||
|
|
|||
|
--- a/gdb/rs6000-tdep.c
|
|||
|
+++ b/gdb/rs6000-tdep.c
|
|||
|
@@ -2779,10 +2779,12 @@ efpr_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
|
|||
|
{
|
|||
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|||
|
int reg_index = reg_nr - tdep->ppc_efpr0_regnum;
|
|||
|
+ int offset = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 0 : 8;
|
|||
|
|
|||
|
/* Read the portion that overlaps the VMX register. */
|
|||
|
- return regcache_raw_read_part (regcache, tdep->ppc_vr0_regnum + reg_index, 0,
|
|||
|
- register_size (gdbarch, reg_nr), buffer);
|
|||
|
+ return regcache_raw_read_part (regcache, tdep->ppc_vr0_regnum + reg_index,
|
|||
|
+ offset, register_size (gdbarch, reg_nr),
|
|||
|
+ buffer);
|
|||
|
}
|
|||
|
|
|||
|
/* Write method for POWER7 Extended FP pseudo-registers. */
|
|||
|
@@ -2792,10 +2794,12 @@ efpr_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
|
|||
|
{
|
|||
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|||
|
int reg_index = reg_nr - tdep->ppc_efpr0_regnum;
|
|||
|
+ int offset = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 0 : 8;
|
|||
|
|
|||
|
/* Write the portion that overlaps the VMX register. */
|
|||
|
- regcache_raw_write_part (regcache, tdep->ppc_vr0_regnum + reg_index, 0,
|
|||
|
- register_size (gdbarch, reg_nr), buffer);
|
|||
|
+ regcache_raw_write_part (regcache, tdep->ppc_vr0_regnum + reg_index,
|
|||
|
+ offset, register_size (gdbarch, reg_nr),
|
|||
|
+ buffer);
|
|||
|
}
|
|||
|
|
|||
|
static enum register_status
|
|||
|
### a/gdb/testsuite/ChangeLog
|
|||
|
### b/gdb/testsuite/ChangeLog
|
|||
|
## -1,5 +1,10 @@
|
|||
|
2014-02-04 Ulrich Weigand <uweigand@de.ibm.com>
|
|||
|
|
|||
|
+ * gdb.arch/vsx-regs.exp: Check target endianness. Provide variants
|
|||
|
+ of the test patterns for use on little-endian systems.
|
|||
|
+
|
|||
|
+2014-02-04 Ulrich Weigand <uweigand@de.ibm.com>
|
|||
|
+
|
|||
|
* gdb.arch/altivec-regs.exp: Use gdb_test_multiple for endian test.
|
|||
|
(decimal_vector): Fix for little-endian.
|
|||
|
|
|||
|
--- a/gdb/testsuite/gdb.arch/vsx-regs.exp
|
|||
|
+++ b/gdb/testsuite/gdb.arch/vsx-regs.exp
|
|||
|
@@ -58,19 +58,45 @@ if ![runto_main] then {
|
|||
|
gdb_suppress_tests
|
|||
|
}
|
|||
|
|
|||
|
+set endianness ""
|
|||
|
+set msg "detect endianness"
|
|||
|
+gdb_test_multiple "show endian" "$msg" {
|
|||
|
+ -re "(The target endianness is set automatically .currently )(big|little)( endian.*)$gdb_prompt $" {
|
|||
|
+ pass "$msg"
|
|||
|
+ set endianness $expect_out(2,string)
|
|||
|
+ }
|
|||
|
+ -re ".*$gdb_prompt $" {
|
|||
|
+ fail "$msg"
|
|||
|
+ }
|
|||
|
+}
|
|||
|
+
|
|||
|
# Data sets used throughout the test
|
|||
|
|
|||
|
-set vector_register1 ".uint128 = 0x3ff4cccccccccccc0000000000000000, v2_double = .0x1, 0x0., v4_float = .0x1, 0xf99999a0, 0x0, 0x0., v4_int32 = .0x3ff4cccc, 0xcccccccc, 0x0, 0x0., v8_int16 = .0x3ff4, 0xcccc, 0xcccc, 0xcccc, 0x0, 0x0, 0x0, 0x0., v16_int8 = .0x3f, 0xf4, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0.."
|
|||
|
+if {$endianness == "big"} {
|
|||
|
+ set vector_register1 ".uint128 = 0x3ff4cccccccccccc0000000000000000, v2_double = .0x1, 0x0., v4_float = .0x1, 0xf99999a0, 0x0, 0x0., v4_int32 = .0x3ff4cccc, 0xcccccccc, 0x0, 0x0., v8_int16 = .0x3ff4, 0xcccc, 0xcccc, 0xcccc, 0x0, 0x0, 0x0, 0x0., v16_int8 = .0x3f, 0xf4, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0.."
|
|||
|
+
|
|||
|
+ set vector_register1_vr ".uint128 = 0x3ff4cccccccccccc0000000100000001, v4_float = .0x1, 0xf99999a0, 0x0, 0x0., v4_int32 = .0x3ff4cccc, 0xcccccccc, 0x1, 0x1., v8_int16 = .0x3ff4, 0xcccc, 0xcccc, 0xcccc, 0x0, 0x1, 0x0, 0x1., v16_int8 = .0x3f, 0xf4, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1.."
|
|||
|
|
|||
|
-set vector_register1_vr ".uint128 = 0x3ff4cccccccccccc0000000100000001, v4_float = .0x1, 0xf99999a0, 0x0, 0x0., v4_int32 = .0x3ff4cccc, 0xcccccccc, 0x1, 0x1., v8_int16 = .0x3ff4, 0xcccc, 0xcccc, 0xcccc, 0x0, 0x1, 0x0, 0x1., v16_int8 = .0x3f, 0xf4, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1.."
|
|||
|
+ set vector_register2 "uint128 = 0xdeadbeefdeadbeefdeadbeefdeadbeef, v2_double = .0x1, 0x1., v4_float = .0x0, 0x0, 0x0, 0x0., v4_int32 = .0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef., v8_int16 = .0xdead, 0xbeef, 0xdead, 0xbeef, 0xdead, 0xbeef, 0xdead, 0xbeef., v16_int8 = .0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef.."
|
|||
|
|
|||
|
-set vector_register2 "uint128 = 0xdeadbeefdeadbeefdeadbeefdeadbeef, v2_double = .0x1, 0x1., v4_float = .0x0, 0x0, 0x0, 0x0., v4_int32 = .0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef., v8_int16 = .0xdead, 0xbeef, 0xdead, 0xbeef, 0xdead, 0xbeef, 0xdead, 0xbeef., v16_int8 = .0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef.."
|
|||
|
+ set vector_register2_vr "uint128 = 0xdeadbeefdeadbeefdeadbeefdeadbeef, v4_float = .0x0, 0x0, 0x0, 0x0., v4_int32 = .0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef., v8_int16 = .0xdead, 0xbeef, 0xdead, 0xbeef, 0xdead, 0xbeef, 0xdead, 0xbeef., v16_int8 = .0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef.."
|
|||
|
|
|||
|
-set vector_register2_vr "uint128 = 0xdeadbeefdeadbeefdeadbeefdeadbeef, v4_float = .0x0, 0x0, 0x0, 0x0., v4_int32 = .0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef., v8_int16 = .0xdead, 0xbeef, 0xdead, 0xbeef, 0xdead, 0xbeef, 0xdead, 0xbeef., v16_int8 = .0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef.."
|
|||
|
+ set vector_register3 ".uint128 = 0x00000001000000010000000100000001, v2_double = .0x0, 0x0., v4_float = .0x0, 0x0, 0x0, 0x0., v4_int32 = .0x1, 0x1, 0x1, 0x1., v8_int16 = .0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1., v16_int8 = .0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1.."
|
|||
|
+
|
|||
|
+ set vector_register3_vr ".uint128 = 0x00000001000000010000000100000001, v4_float = .0x0, 0x0, 0x0, 0x0., v4_int32 = .0x1, 0x1, 0x1, 0x1., v8_int16 = .0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1., v16_int8 = .0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1.."
|
|||
|
+} else {
|
|||
|
+ set vector_register1 ".uint128 = 0x3ff4cccccccccccc0000000000000000, v2_double = .0x0, 0x1., v4_float = .0x0, 0x0, 0xf99999a0, 0x1., v4_int32 = .0x0, 0x0, 0xcccccccc, 0x3ff4cccc., v8_int16 = .0x0, 0x0, 0x0, 0x0, 0xcccc, 0xcccc, 0xcccc, 0x3ff4., v16_int8 = .0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xf4, 0x3f.."
|
|||
|
|
|||
|
-set vector_register3 ".uint128 = 0x00000001000000010000000100000001, v2_double = .0x0, 0x0., v4_float = .0x0, 0x0, 0x0, 0x0., v4_int32 = .0x1, 0x1, 0x1, 0x1., v8_int16 = .0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1., v16_int8 = .0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1.."
|
|||
|
+ set vector_register1_vr ".uint128 = 0x3ff4cccccccccccc0000000100000001, v4_float = .0x0, 0x0, 0xf99999a0, 0x1., v4_int32 = .0x1, 0x1, 0xcccccccc, 0x3ff4cccc., v8_int16 = .0x1, 0x0, 0x1, 0x0, 0xcccc, 0xcccc, 0xcccc, 0x3ff4., v16_int8 = .0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xf4, 0x3f.."
|
|||
|
|
|||
|
-set vector_register3_vr ".uint128 = 0x00000001000000010000000100000001, v4_float = .0x0, 0x0, 0x0, 0x0., v4_int32 = .0x1, 0x1, 0x1, 0x1., v8_int16 = .0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1., v16_int8 = .0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1.."
|
|||
|
+ set vector_register2 "uint128 = 0xdeadbeefdeadbeefdeadbeefdeadbeef, v2_double = .0x1, 0x1., v4_float = .0x0, 0x0, 0x0, 0x0., v4_int32 = .0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef., v8_int16 = .0xbeef, 0xdead, 0xbeef, 0xdead, 0xbeef, 0xdead, 0xbeef, 0xdead., v16_int8 = .0xef, 0xbe, 0xad, 0xde, 0xef, 0xbe, 0xad, 0xde, 0xef, 0xbe, 0xad, 0xde, 0xef, 0xbe, 0xad, 0xde.."
|
|||
|
+
|
|||
|
+ set vector_register2_vr "uint128 = 0xdeadbeefdeadbeefdeadbeefdeadbeef, v4_float = .0x0, 0x0, 0x0, 0x0., v4_int32 = .0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef., v8_int16 = .0xbeef, 0xdead, 0xbeef, 0xdead, 0xbeef, 0xdead, 0xbeef, 0xdead., v16_int8 = .0xef, 0xbe, 0xad, 0xde, 0xef, 0xbe, 0xad, 0xde, 0xef, 0xbe, 0xad, 0xde, 0xef, 0xbe, 0xad, 0xde.."
|
|||
|
+
|
|||
|
+ set vector_register3 ".uint128 = 0x00000001000000010000000100000001, v2_double = .0x0, 0x0., v4_float = .0x0, 0x0, 0x0, 0x0., v4_int32 = .0x1, 0x1, 0x1, 0x1., v8_int16 = .0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0., v16_int8 = .0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0.."
|
|||
|
+
|
|||
|
+ set vector_register3_vr ".uint128 = 0x00000001000000010000000100000001, v4_float = .0x0, 0x0, 0x0, 0x0., v4_int32 = .0x1, 0x1, 0x1, 0x1., v8_int16 = .0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0., v16_int8 = .0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0.."
|
|||
|
+}
|
|||
|
|
|||
|
set float_register ".raw 0xdeadbeefdeadbeef."
|
|||
|
|