[s390x] Backport arch12 support and other s390x fixes (RH BZ 1420304).
This commit is contained in:
parent
99b34dc784
commit
4f1de05c3f
62
gdb-rhbz1420304-s390x-01of35.patch
Normal file
62
gdb-rhbz1420304-s390x-01of35.patch
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
commit d7ab4911f8aa3e1cd06ece40f74d0b4a532d6a10
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Mon May 8 19:10:42 2017 +0200
|
||||||
|
|
||||||
|
S/390: Fix ifunc missing runtime reloc
|
||||||
|
|
||||||
|
This fixes a problem with a missing R_390_64 reloc against .data for a
|
||||||
|
function pointer to an ifunc function.
|
||||||
|
|
||||||
|
No regressions on s390x.
|
||||||
|
|
||||||
|
Pushed to mainline.
|
||||||
|
|
||||||
|
bfd/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-08 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* elf-s390-common.c: Don't check non_got_ref flag.
|
||||||
|
* elf32-s390.c (elf_s390_relocate_section): Likewise.
|
||||||
|
* elf64-s390.c (elf_s390_relocate_section): Likewise.
|
||||||
|
|
||||||
|
--- a/bfd/elf-s390-common.c
|
||||||
|
+++ b/bfd/elf-s390-common.c
|
||||||
|
@@ -161,9 +161,7 @@ keep:
|
||||||
|
h->type = STT_FUNC;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* We need dynamic relocation for STT_GNU_IFUNC symbol only when
|
||||||
|
- there is a non-GOT reference in a shared object. */
|
||||||
|
- if (!bfd_link_pic (info) || !h->non_got_ref)
|
||||||
|
+ if (!bfd_link_pic (info))
|
||||||
|
*head = NULL;
|
||||||
|
|
||||||
|
/* Finally, allocate space. */
|
||||||
|
--- a/bfd/elf32-s390.c
|
||||||
|
+++ b/bfd/elf32-s390.c
|
||||||
|
@@ -2774,7 +2774,7 @@ elf_s390_relocate_section (bfd *output_bfd,
|
||||||
|
&& s390_is_ifunc_symbol_p (h)
|
||||||
|
&& h->def_regular)
|
||||||
|
{
|
||||||
|
- if (!bfd_link_pic (info) || !h->non_got_ref)
|
||||||
|
+ if (!bfd_link_pic (info))
|
||||||
|
{
|
||||||
|
/* For a non-shared object STT_GNU_IFUNC symbol must
|
||||||
|
go through PLT. */
|
||||||
|
--- a/bfd/elf64-s390.c
|
||||||
|
+++ b/bfd/elf64-s390.c
|
||||||
|
@@ -2737,10 +2737,11 @@ elf_s390_relocate_section (bfd *output_bfd,
|
||||||
|
&& s390_is_ifunc_symbol_p (h)
|
||||||
|
&& h->def_regular)
|
||||||
|
{
|
||||||
|
- if (!bfd_link_pic (info) || !h->non_got_ref)
|
||||||
|
+ if (!bfd_link_pic (info))
|
||||||
|
{
|
||||||
|
- /* For a non-shared object STT_GNU_IFUNC symbol must
|
||||||
|
- go through PLT. */
|
||||||
|
+ /* For a non-shared object the symbol will not
|
||||||
|
+ change. Hence we can write the address of the
|
||||||
|
+ target IPLT slot now. */
|
||||||
|
relocation = (htab->elf.iplt->output_section->vma
|
||||||
|
+ htab->elf.iplt->output_offset
|
||||||
|
+ h ->plt.offset);
|
43
gdb-rhbz1420304-s390x-02of35.patch
Normal file
43
gdb-rhbz1420304-s390x-02of35.patch
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
commit a0a110b0dd5077373c4102d1502130eb159c366b
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Wed May 17 12:39:39 2017 +0200
|
||||||
|
|
||||||
|
S/390: Fix arch level of pckmo instruction.
|
||||||
|
|
||||||
|
Fix wrong architecture level of PCKMO instruction.
|
||||||
|
|
||||||
|
Committed to mainline.
|
||||||
|
|
||||||
|
opcodes/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-17 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* s390-opc.txt: PCKMO change arch level to z196.
|
||||||
|
|
||||||
|
gas/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-17 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* testsuite/gas/s390/zarch-z10.d: Remove pckmo.
|
||||||
|
* testsuite/gas/s390/zarch-z10.s: Remove pckmo.
|
||||||
|
* testsuite/gas/s390/zarch-z196.d: Add pckmo.
|
||||||
|
* testsuite/gas/s390/zarch-z196.s: Add pckmo.
|
||||||
|
|
||||||
|
--- a/opcodes/s390-opc.txt
|
||||||
|
+++ b/opcodes/s390-opc.txt
|
||||||
|
@@ -976,7 +976,6 @@ b286 qsi S_RD "query sampling information" z10 zarch
|
||||||
|
b2e0 scctr RRE_RR "set cpu counter" z10 zarch
|
||||||
|
b2e1 spctr RRE_RR "set peripheral counter" z10 zarch
|
||||||
|
b280 lpp S_RD "load program parameter" z10 zarch
|
||||||
|
-b928 pckmo RRE_00 "perform cryptographic key management operation" z10 zarch
|
||||||
|
|
||||||
|
# The new instructions of the IBM zEnterprise z196
|
||||||
|
b9c8 ahhhr RRF_R0RR2 "add high high" z196 zarch
|
||||||
|
@@ -1116,6 +1115,7 @@ b92a kmf RRE_RR "cipher message with CFB" z196 zarch
|
||||||
|
b92b kmo RRE_RR "cipher message with OFB" z196 zarch
|
||||||
|
b92c pcc RRE_00 "perform cryptographic computation" z196 zarch
|
||||||
|
b92d kmctr RRF_R0RR "cipher message with counter" z196 zarch
|
||||||
|
+b928 pckmo RRE_00 "perform cryptographic key management operation" z196 zarch
|
||||||
|
|
||||||
|
# The new instructions of the IBM zEnterprise EC12
|
||||||
|
b2ec etnd RRE_R0 "extract transaction nesting depth" zEC12 zarch htm
|
52
gdb-rhbz1420304-s390x-03of35.patch
Normal file
52
gdb-rhbz1420304-s390x-03of35.patch
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
commit bfcfbe611b4d7e650236f8b8ba7d0706cfe6a0b7
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Mon May 29 12:33:15 2017 +0200
|
||||||
|
|
||||||
|
S/390: Remove optional operand flag.
|
||||||
|
|
||||||
|
The per operand optional flag hasn't been used for quite some time.
|
||||||
|
Cleanup some remains.
|
||||||
|
|
||||||
|
include/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* opcode/s390.h: Remove S390_OPERAND_OPTIONAL.
|
||||||
|
|
||||||
|
gas/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* config/tc-s390.c (md_gather_operands): Remove code dealing with
|
||||||
|
S390_OPERAND_OPTIONAL.
|
||||||
|
|
||||||
|
--- a/include/opcode/s390.h
|
||||||
|
+++ b/include/opcode/s390.h
|
||||||
|
@@ -156,21 +156,17 @@ extern const struct s390_operand s390_operands[];
|
||||||
|
/* This operand is a length. */
|
||||||
|
#define S390_OPERAND_LENGTH 0x200
|
||||||
|
|
||||||
|
-/* This operand is optional. Only a single operand at the end of
|
||||||
|
- the instruction may be optional. */
|
||||||
|
-#define S390_OPERAND_OPTIONAL 0x400
|
||||||
|
-
|
||||||
|
/* The operand needs to be a valid GP or FP register pair. */
|
||||||
|
-#define S390_OPERAND_REG_PAIR 0x800
|
||||||
|
+#define S390_OPERAND_REG_PAIR 0x400
|
||||||
|
|
||||||
|
/* This operand names a vector register. The disassembler uses this
|
||||||
|
to print register names with a leading 'v'. */
|
||||||
|
-#define S390_OPERAND_VR 0x1000
|
||||||
|
+#define S390_OPERAND_VR 0x800
|
||||||
|
|
||||||
|
-#define S390_OPERAND_CP16 0x2000
|
||||||
|
+#define S390_OPERAND_CP16 0x1000
|
||||||
|
|
||||||
|
-#define S390_OPERAND_OR1 0x4000
|
||||||
|
-#define S390_OPERAND_OR2 0x8000
|
||||||
|
-#define S390_OPERAND_OR8 0x10000
|
||||||
|
+#define S390_OPERAND_OR1 0x2000
|
||||||
|
+#define S390_OPERAND_OR2 0x4000
|
||||||
|
+#define S390_OPERAND_OR8 0x8000
|
||||||
|
|
||||||
|
#endif /* S390_H */
|
97
gdb-rhbz1420304-s390x-04of35.patch
Normal file
97
gdb-rhbz1420304-s390x-04of35.patch
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
commit a09f2586017aeed82fa07c8bfea6c75859295bd9
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Mon May 29 12:34:56 2017 +0200
|
||||||
|
|
||||||
|
S/390: Improve error checking for optional operands
|
||||||
|
|
||||||
|
So far we only had an instruction flag which made an arbitrary number
|
||||||
|
of operands optional. This limits error checking capabilities for
|
||||||
|
instructions marked that way. With this patch the optparm flag only
|
||||||
|
allows a single optional parameter and another one is added (optparm2)
|
||||||
|
allowing 2 optional arguments. Hopefully we won't need more than that
|
||||||
|
in the future. So far there will be only a single use of optparm2.
|
||||||
|
|
||||||
|
gas/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* config/tc-s390.c (md_gather_operands): Support new optparm2
|
||||||
|
instruction flag.
|
||||||
|
|
||||||
|
include/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* opcode/s390.h: Add new instruction flags optparm2.
|
||||||
|
|
||||||
|
opcodes/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* s390-dis.c (s390_print_insn_with_opcode): Support new optparm2
|
||||||
|
instruction flag.
|
||||||
|
* s390-mkopc.c (main): Recognize the new instruction flag when
|
||||||
|
parsing instruction list.
|
||||||
|
|
||||||
|
--- a/include/opcode/s390.h
|
||||||
|
+++ b/include/opcode/s390.h
|
||||||
|
@@ -48,10 +48,11 @@ enum s390_opcode_cpu_val
|
||||||
|
|
||||||
|
/* Instruction specific flags. */
|
||||||
|
#define S390_INSTR_FLAG_OPTPARM 0x1
|
||||||
|
+#define S390_INSTR_FLAG_OPTPARM2 0x2
|
||||||
|
|
||||||
|
-#define S390_INSTR_FLAG_HTM 0x2
|
||||||
|
-#define S390_INSTR_FLAG_VX 0x4
|
||||||
|
-#define S390_INSTR_FLAG_FACILITY_MASK 0x6
|
||||||
|
+#define S390_INSTR_FLAG_HTM 0x4
|
||||||
|
+#define S390_INSTR_FLAG_VX 0x8
|
||||||
|
+#define S390_INSTR_FLAG_FACILITY_MASK 0xc
|
||||||
|
|
||||||
|
/* The opcode table is an array of struct s390_opcode. */
|
||||||
|
|
||||||
|
--- a/opcodes/s390-dis.c
|
||||||
|
+++ b/opcodes/s390-dis.c
|
||||||
|
@@ -206,11 +206,20 @@ s390_print_insn_with_opcode (bfd_vma memaddr,
|
||||||
|
|
||||||
|
/* For instructions with a last optional operand don't print it
|
||||||
|
if zero. */
|
||||||
|
- if ((opcode->flags & S390_INSTR_FLAG_OPTPARM)
|
||||||
|
+ if ((opcode->flags & (S390_INSTR_FLAG_OPTPARM | S390_INSTR_FLAG_OPTPARM2))
|
||||||
|
&& val.u == 0
|
||||||
|
&& opindex[1] == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ if ((opcode->flags & S390_INSTR_FLAG_OPTPARM2)
|
||||||
|
+ && val.u == 0 && opindex[1] != 0 && opindex[2] == 0)
|
||||||
|
+ {
|
||||||
|
+ union operand_value next_op_val =
|
||||||
|
+ s390_extract_operand (buffer, s390_operands + opindex[1]);
|
||||||
|
+ if (next_op_val.u == 0)
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (flags & S390_OPERAND_GPR)
|
||||||
|
info->fprintf_func (info->stream, "%c%%r%u", separator, val.u);
|
||||||
|
else if (flags & S390_OPERAND_FPR)
|
||||||
|
--- a/opcodes/s390-mkopc.c
|
||||||
|
+++ b/opcodes/s390-mkopc.c
|
||||||
|
@@ -411,12 +411,16 @@ main (void)
|
||||||
|
&& (str[7] == 0 || str[7] == ',')) {
|
||||||
|
flag_bits |= S390_INSTR_FLAG_OPTPARM;
|
||||||
|
str += 7;
|
||||||
|
+ } else if (strncmp (str, "optparm2", 8) == 0
|
||||||
|
+ && (str[8] == 0 || str[8] == ',')) {
|
||||||
|
+ flag_bits |= S390_INSTR_FLAG_OPTPARM2;
|
||||||
|
+ str += 8;
|
||||||
|
} else if (strncmp (str, "htm", 3) == 0
|
||||||
|
- && (str[3] == 0 || str[3] == ',')) {
|
||||||
|
+ && (str[3] == 0 || str[3] == ',')) {
|
||||||
|
flag_bits |= S390_INSTR_FLAG_HTM;
|
||||||
|
str += 3;
|
||||||
|
} else if (strncmp (str, "vx", 2) == 0
|
||||||
|
- && (str[2] == 0 || str[2] == ',')) {
|
||||||
|
+ && (str[2] == 0 || str[2] == ',')) {
|
||||||
|
flag_bits |= S390_INSTR_FLAG_VX;
|
||||||
|
str += 2;
|
||||||
|
} else {
|
58
gdb-rhbz1420304-s390x-05of35.patch
Normal file
58
gdb-rhbz1420304-s390x-05of35.patch
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
commit ffc61c5de1a5a89e3e37fb9376725c32a839c34d
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Mon May 29 12:36:57 2017 +0200
|
||||||
|
|
||||||
|
S/390: Add ipte/idte variants with optional operands
|
||||||
|
|
||||||
|
This patch adds missing variants of ipte and idte instructions added with later CPU
|
||||||
|
generations.
|
||||||
|
|
||||||
|
ipte got an optional operand with z196 and another one with zEC12.
|
||||||
|
idte got an optional operand with zEC12
|
||||||
|
|
||||||
|
opcodes/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* s390-opc.c: Add new idte/ipte variants.
|
||||||
|
* s390-opc.txt: Likewise.
|
||||||
|
|
||||||
|
gas/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* testsuite/gas/s390/zarch-z196.d: Add new idte/ipte variants.
|
||||||
|
* testsuite/gas/s390/zarch-z196.s: Likewise.
|
||||||
|
* testsuite/gas/s390/zarch-zEC12.d: Likewise.
|
||||||
|
* testsuite/gas/s390/zarch-zEC12.s: Likewise.
|
||||||
|
|
||||||
|
--- a/opcodes/s390-opc.c
|
||||||
|
+++ b/opcodes/s390-opc.c
|
||||||
|
@@ -355,7 +355,7 @@ const struct s390_operand s390_operands[] =
|
||||||
|
#define INSTR_RRF_FEUFEFE 4, { FE_24,FE_16,FE_28,U4_20,0,0 } /* e.g. qaxtr */
|
||||||
|
#define INSTR_RRF_FUFF2 4, { F_24,F_28,F_16,U4_20,0,0 } /* e.g. adtra */
|
||||||
|
#define INSTR_RRF_FEUFEFE2 4, { FE_24,FE_28,FE_16,U4_20,0,0 } /* e.g. axtra */
|
||||||
|
-#define INSTR_RRF_RURR 4, { R_24,R_28,R_16,U4_20,0,0 } /* e.g. .insn */
|
||||||
|
+#define INSTR_RRF_RURR 4, { R_24,R_28,R_16,U4_20,0,0 } /* e.g. ipte */
|
||||||
|
#define INSTR_RRF_RURR2 4, { R_24,R_16,R_28,U4_20,0,0 } /* e.g. lptea */
|
||||||
|
#define INSTR_RRF_R0RR 4, { R_24,R_16,R_28,0,0,0 } /* e.g. idte */
|
||||||
|
#define INSTR_RRF_R0RR2 4, { R_24,R_28,R_16,0,0,0 } /* e.g. ark */
|
||||||
|
--- a/opcodes/s390-opc.txt
|
||||||
|
+++ b/opcodes/s390-opc.txt
|
||||||
|
@@ -1116,6 +1116,7 @@ b92b kmo RRE_RR "cipher message with OFB" z196 zarch
|
||||||
|
b92c pcc RRE_00 "perform cryptographic computation" z196 zarch
|
||||||
|
b92d kmctr RRF_R0RR "cipher message with counter" z196 zarch
|
||||||
|
b928 pckmo RRE_00 "perform cryptographic key management operation" z196 zarch
|
||||||
|
+b221 ipte RRF_R0RR2 "invalidate page table entry" z196 zarch optparm
|
||||||
|
|
||||||
|
# The new instructions of the IBM zEnterprise EC12
|
||||||
|
b2ec etnd RRE_R0 "extract transaction nesting depth" zEC12 zarch htm
|
||||||
|
@@ -1143,6 +1144,8 @@ ed00000000aa cdzt RSL_LRDFU "convert from zoned long" zEC12 zarch
|
||||||
|
ed00000000ab cxzt RSL_LRDFEU "convert from zoned extended" zEC12 zarch
|
||||||
|
ed00000000a8 czdt RSL_LRDFU "convert to zoned long" zEC12 zarch
|
||||||
|
ed00000000a9 czxt RSL_LRDFEU "convert to zoned extended" zEC12 zarch
|
||||||
|
+b98e idte RRF_RURR2 "invalidate dat table entry" zEC12 zarch optparm
|
||||||
|
+b221 ipte RRF_RURR "invalidate page table entry" zEC12 zarch optparm2
|
||||||
|
|
||||||
|
# The new instructions of IBM z13
|
||||||
|
|
31
gdb-rhbz1420304-s390x-06of35.patch
Normal file
31
gdb-rhbz1420304-s390x-06of35.patch
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
commit 67aa8be4cb43cd94bc322fed8bdba48b3c8719c4
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Mon May 29 12:38:11 2017 +0200
|
||||||
|
|
||||||
|
S/390: Add missing operand to tb instruction
|
||||||
|
|
||||||
|
gas/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* testsuite/gas/s390/esa-g5.d: Add missing operand to tb
|
||||||
|
instruction.
|
||||||
|
* testsuite/gas/s390/esa-g5.s: Likewise.
|
||||||
|
|
||||||
|
opcodes/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* s390-opc.txt: Add missing operand to tb instruction.
|
||||||
|
|
||||||
|
--- a/opcodes/s390-opc.txt
|
||||||
|
+++ b/opcodes/s390-opc.txt
|
||||||
|
@@ -228,7 +228,7 @@ b246 stura RRE_RR "store using real address" g5 esa,zarch
|
||||||
|
2f swr RR_FF "subtract unnormalized (long)" g5 esa,zarch
|
||||||
|
37 sxr RR_FEFE "subtract normalized (ext.)" g5 esa,zarch
|
||||||
|
b24c tar RRE_AR "test access" g5 esa,zarch
|
||||||
|
-b22c tb RRE_0R "test block" g5 esa,zarch
|
||||||
|
+b22c tb RRE_RR "test block" g5 esa,zarch
|
||||||
|
91 tm SI_URD "test under mask" g5 esa,zarch
|
||||||
|
b236 tpi S_RD "test pending interruption" g5 esa,zarch
|
||||||
|
e501 tprot SSE_RDRD "test protection" g5 esa,zarch
|
53
gdb-rhbz1420304-s390x-07of35.patch
Normal file
53
gdb-rhbz1420304-s390x-07of35.patch
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
commit ca87ae741fe9c8aad9db1afbf109dc070d0168cf
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Mon May 29 12:38:42 2017 +0200
|
||||||
|
|
||||||
|
S/390: Fix instruction types of csdtr and csxtr
|
||||||
|
|
||||||
|
opcodes/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* s390-opc.c: Add new instruction types RRF_0URF and RRF_0UREFE.
|
||||||
|
* s390-opc.txt: Fix instruction typs of csdtr and csxtr.
|
||||||
|
|
||||||
|
gas/ChangeLog:
|
||||||
|
|
||||||
|
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* testsuite/gas/s390/zarch-z9-ec.d: Adjust csdtr and csxtr.
|
||||||
|
* testsuite/gas/s390/zarch-z9-ec.s: Likewise.
|
||||||
|
|
||||||
|
--- a/opcodes/s390-opc.c
|
||||||
|
+++ b/opcodes/s390-opc.c
|
||||||
|
@@ -374,6 +374,8 @@ const struct s390_operand s390_operands[] =
|
||||||
|
#define INSTR_RRF_U0RER 4, { RE_24,R_28,U4_16,0,0,0 } /* e.g. trte */
|
||||||
|
#define INSTR_RRF_U0RERE 4, { RE_24,RE_28,U4_16,0,0,0 } /* e.g. cu24 */
|
||||||
|
#define INSTR_RRF_00RR 4, { R_24,R_28,0,0,0,0 } /* e.g. clrtne */
|
||||||
|
+#define INSTR_RRF_0URF 4, { R_24,F_28,U4_20,0,0,0 } /* e.g. csdtr */
|
||||||
|
+#define INSTR_RRF_0UREFE 4, { RE_24,FE_28,U4_20,0,0,0 } /* e.g. csxtr */
|
||||||
|
#define INSTR_RRF_UUFR 4, { F_24,U4_16,R_28,U4_20,0,0 } /* e.g. cdgtra */
|
||||||
|
#define INSTR_RRF_UUFER 4, { FE_24,U4_16,R_28,U4_20,0,0 } /* e.g. cxfbra */
|
||||||
|
#define INSTR_RRF_UURF 4, { R_24,U4_16,F_28,U4_20,0,0 } /* e.g. cgdtra */
|
||||||
|
@@ -590,6 +592,8 @@ const struct s390_operand s390_operands[] =
|
||||||
|
#define MASK_RRF_U0RER { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||||
|
#define MASK_RRF_U0RERE { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 }
|
||||||
|
#define MASK_RRF_00RR { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }
|
||||||
|
+#define MASK_RRF_0URF { 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00 }
|
||||||
|
+#define MASK_RRF_0UREFE { 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00 }
|
||||||
|
#define MASK_RRF_UUFR { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||||
|
#define MASK_RRF_UUFER { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||||
|
#define MASK_RRF_UURF { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
|
||||||
|
--- a/opcodes/s390-opc.txt
|
||||||
|
+++ b/opcodes/s390-opc.txt
|
||||||
|
@@ -817,8 +817,8 @@ b3f2 cdutr RRE_FR "convert from unsigned bcd to long dfp" z9-ec zarch
|
||||||
|
b3fa cxutr RRE_FER "convert from unsigned bcd to extended dfp" z9-ec zarch
|
||||||
|
b3e1 cgdtr RRF_U0RF "convert from long dfp to fixed" z9-ec zarch
|
||||||
|
b3e9 cgxtr RRF_U0RFE "convert from extended dfp to fixed" z9-ec zarch
|
||||||
|
-b3e3 csdtr RRE_RF "convert from long dfp to signed bcd" z9-ec zarch
|
||||||
|
-b3eb csxtr RRE_RFE "convert from extended dfp to signed bcd" z9-ec zarch
|
||||||
|
+b3e3 csdtr RRF_0URF "convert from long dfp to signed bcd" z9-ec zarch
|
||||||
|
+b3eb csxtr RRF_0UREFE "convert from extended dfp to signed bcd" z9-ec zarch
|
||||||
|
b3e2 cudtr RRE_RF "convert from long dfp to unsigned bcd" z9-ec zarch
|
||||||
|
b3ea cuxtr RRE_RFE "convert from extended dfp to unsigned bcd" z9-ec zarch
|
||||||
|
b3d1 ddtr RRR_F0FF "divide long dfp" z9-ec zarch
|
76
gdb-rhbz1420304-s390x-08of35.patch
Normal file
76
gdb-rhbz1420304-s390x-08of35.patch
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
commit 19fb31c0060f646a9f84be1a84ed1bea04e7ed57
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Thu Jun 1 13:46:15 2017 +0200
|
||||||
|
|
||||||
|
S/390: idte/ipte fixes
|
||||||
|
|
||||||
|
Later CPU generations added optional operands to the ipte/idte
|
||||||
|
instructions. I've added these with:
|
||||||
|
https://sourceware.org/ml/binutils/2017-05/msg00316.html ... but
|
||||||
|
supported the optional operands only with the specific hardware
|
||||||
|
levels. However, it is more useful to have the optional operands
|
||||||
|
already in the first versions. Of course they need to be zero there.
|
||||||
|
|
||||||
|
Regression-tested with on s390 and s390x. Committed to mainline.
|
||||||
|
|
||||||
|
Bye,
|
||||||
|
|
||||||
|
-Andreas-
|
||||||
|
|
||||||
|
opcodes/ChangeLog:
|
||||||
|
|
||||||
|
2017-06-01 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* s390-opc.txt: Support the optional parameters with the first
|
||||||
|
versions of ipte/idte.
|
||||||
|
|
||||||
|
gas/ChangeLog:
|
||||||
|
|
||||||
|
2017-06-01 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* testsuite/gas/s390/esa-g5.d: Add ipte tests.
|
||||||
|
* testsuite/gas/s390/esa-g5.s: Likewise.
|
||||||
|
* testsuite/gas/s390/zarch-z196.d: Remove ipte tests.
|
||||||
|
* testsuite/gas/s390/zarch-z196.s: Likewise.
|
||||||
|
* testsuite/gas/s390/zarch-z990.d: Add idte tests.
|
||||||
|
* testsuite/gas/s390/zarch-z990.s: Likewise.
|
||||||
|
* testsuite/gas/s390/zarch-zEC12.d: Remove ipte/idte tests.
|
||||||
|
* testsuite/gas/s390/zarch-zEC12.s: Likewise.
|
||||||
|
|
||||||
|
--- a/opcodes/s390-opc.txt
|
||||||
|
+++ b/opcodes/s390-opc.txt
|
||||||
|
@@ -79,7 +79,7 @@ b224 iac RRE_R0 "insert address space control" g5 esa,zarch
|
||||||
|
bf icm RS_RURD "insert characters under mask" g5 esa,zarch
|
||||||
|
b20b ipk S_00 "insert PSW key" g5 esa,zarch
|
||||||
|
b222 ipm RRE_R0 "insert program mask" g5 esa,zarch
|
||||||
|
-b221 ipte RRE_RR "invalidate page table entry" g5 esa,zarch
|
||||||
|
+b221 ipte RRF_RURR "invalidate page table entry" g5 esa,zarch optparm2
|
||||||
|
b229 iske RRE_RR "insert storage key extended" g5 esa,zarch
|
||||||
|
b223 ivsk RRE_RR "insert virtual storage key" g5 esa,zarch
|
||||||
|
58 l RX_RRRD "load" g5 esa,zarch
|
||||||
|
@@ -700,7 +700,7 @@ eb000000008f clclu RSY_RRRD "compare logical long unicode with long offset" z990
|
||||||
|
eb0000000096 lmh RSY_RRRD "load multiple high" z990 zarch
|
||||||
|
# new z990 instructions
|
||||||
|
b98a cspg RRE_RR "compare and swap and purge" z990 zarch
|
||||||
|
-b98e idte RRF_R0RR "invalidate dat table entry" z990 zarch
|
||||||
|
+b98e idte RRF_RURR2 "invalidate dat table entry" z990 zarch optparm
|
||||||
|
b33e madr RRF_F0FF "multiply and add long hfp" z990 esa,zarch
|
||||||
|
ed000000003e mad RXF_FRRDF "multiply and add long hfp" z990 esa,zarch
|
||||||
|
b32e maer RRF_F0FF "multiply and add short hfp" z990 esa,zarch
|
||||||
|
@@ -1116,7 +1116,6 @@ b92b kmo RRE_RR "cipher message with OFB" z196 zarch
|
||||||
|
b92c pcc RRE_00 "perform cryptographic computation" z196 zarch
|
||||||
|
b92d kmctr RRF_R0RR "cipher message with counter" z196 zarch
|
||||||
|
b928 pckmo RRE_00 "perform cryptographic key management operation" z196 zarch
|
||||||
|
-b221 ipte RRF_R0RR2 "invalidate page table entry" z196 zarch optparm
|
||||||
|
|
||||||
|
# The new instructions of the IBM zEnterprise EC12
|
||||||
|
b2ec etnd RRE_R0 "extract transaction nesting depth" zEC12 zarch htm
|
||||||
|
@@ -1144,8 +1143,6 @@ ed00000000aa cdzt RSL_LRDFU "convert from zoned long" zEC12 zarch
|
||||||
|
ed00000000ab cxzt RSL_LRDFEU "convert from zoned extended" zEC12 zarch
|
||||||
|
ed00000000a8 czdt RSL_LRDFU "convert to zoned long" zEC12 zarch
|
||||||
|
ed00000000a9 czxt RSL_LRDFEU "convert to zoned extended" zEC12 zarch
|
||||||
|
-b98e idte RRF_RURR2 "invalidate dat table entry" zEC12 zarch optparm
|
||||||
|
-b221 ipte RRF_RURR "invalidate page table entry" zEC12 zarch optparm2
|
||||||
|
|
||||||
|
# The new instructions of IBM z13
|
||||||
|
|
123
gdb-rhbz1420304-s390x-09of35.patch
Normal file
123
gdb-rhbz1420304-s390x-09of35.patch
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
commit 3704e3589d3d187fbf76e688388b1a92fd627c8d
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Fri Jun 9 11:19:01 2017 +0200
|
||||||
|
|
||||||
|
S/390: Return with an error for broken tls rewrites
|
||||||
|
|
||||||
|
bfd/ChangeLog:
|
||||||
|
|
||||||
|
2017-06-12 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* elf32-s390.c (elf_s390_relocate_section): Return false in case
|
||||||
|
the rewriting fails.
|
||||||
|
* elf64-s390.c (elf_s390_relocate_section): Likewise.
|
||||||
|
|
||||||
|
--- a/bfd/elf32-s390.c
|
||||||
|
+++ b/bfd/elf32-s390.c
|
||||||
|
@@ -3231,7 +3231,6 @@ elf_s390_relocate_section (bfd *output_bfd,
|
||||||
|
unsigned int insn, ry;
|
||||||
|
|
||||||
|
insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
|
||||||
|
- ry = 0;
|
||||||
|
if ((insn & 0xff00f000) == 0x58000000)
|
||||||
|
/* l %rx,0(%ry,0) -> lr %rx,%ry + bcr 0,0 */
|
||||||
|
ry = (insn & 0x000f0000);
|
||||||
|
@@ -3245,7 +3244,10 @@ elf_s390_relocate_section (bfd *output_bfd,
|
||||||
|
/* l %rx,0(%r12,%ry) -> lr %rx,%ry + bcr 0,0 */
|
||||||
|
ry = (insn & 0x0000f000) << 4;
|
||||||
|
else
|
||||||
|
- invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ {
|
||||||
|
+ invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
insn = 0x18000700 | (insn & 0x00f00000) | ry;
|
||||||
|
bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
|
||||||
|
}
|
||||||
|
@@ -3258,7 +3260,10 @@ elf_s390_relocate_section (bfd *output_bfd,
|
||||||
|
if ((insn & 0xff000fff) != 0x4d000000 &&
|
||||||
|
(insn & 0xffff0000) != 0xc0e50000 &&
|
||||||
|
(insn & 0xff000000) != 0x0d000000)
|
||||||
|
- invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ {
|
||||||
|
+ invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
|
||||||
|
{
|
||||||
|
if ((insn & 0xff000000) == 0x0d000000)
|
||||||
|
@@ -3287,7 +3292,10 @@ elf_s390_relocate_section (bfd *output_bfd,
|
||||||
|
/* If basr is used in the pic case to invoke
|
||||||
|
_tls_get_offset, something went wrong before. */
|
||||||
|
if ((insn & 0xff000000) == 0x0d000000)
|
||||||
|
- invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ {
|
||||||
|
+ invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if ((insn & 0xff000000) == 0x4d000000)
|
||||||
|
{
|
||||||
|
@@ -3317,7 +3325,10 @@ elf_s390_relocate_section (bfd *output_bfd,
|
||||||
|
if ((insn & 0xff000fff) != 0x4d000000 &&
|
||||||
|
(insn & 0xffff0000) != 0xc0e50000 &&
|
||||||
|
(insn & 0xff000000) != 0x0d000000)
|
||||||
|
- invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ {
|
||||||
|
+ invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if ((insn & 0xff000000) == 0x0d000000)
|
||||||
|
{
|
||||||
|
--- a/bfd/elf64-s390.c
|
||||||
|
+++ b/bfd/elf64-s390.c
|
||||||
|
@@ -3197,8 +3197,10 @@ elf_s390_relocate_section (bfd *output_bfd,
|
||||||
|
insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
|
||||||
|
insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
|
||||||
|
if (insn1 != 0x0004)
|
||||||
|
- invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
- ry = 0;
|
||||||
|
+ {
|
||||||
|
+ invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
if ((insn0 & 0xff00f000) == 0xe3000000)
|
||||||
|
/* lg %rx,0(%ry,0) -> sllg %rx,%ry,0 */
|
||||||
|
ry = (insn0 & 0x000f0000);
|
||||||
|
@@ -3212,7 +3214,10 @@ elf_s390_relocate_section (bfd *output_bfd,
|
||||||
|
/* lg %rx,0(%r12,%ry) -> sllg %rx,%ry,0 */
|
||||||
|
ry = (insn0 & 0x0000f000) << 4;
|
||||||
|
else
|
||||||
|
- invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ {
|
||||||
|
+ invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
insn0 = 0xeb000000 | (insn0 & 0x00f00000) | ry;
|
||||||
|
insn1 = 0x000d;
|
||||||
|
bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
|
||||||
|
@@ -3226,7 +3231,10 @@ elf_s390_relocate_section (bfd *output_bfd,
|
||||||
|
insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
|
||||||
|
insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
|
||||||
|
if ((insn0 & 0xffff0000) != 0xc0e50000)
|
||||||
|
- invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ {
|
||||||
|
+ invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
|
||||||
|
{
|
||||||
|
/* GD->LE transition.
|
||||||
|
@@ -3253,7 +3261,10 @@ elf_s390_relocate_section (bfd *output_bfd,
|
||||||
|
insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
|
||||||
|
insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
|
||||||
|
if ((insn0 & 0xffff0000) != 0xc0e50000)
|
||||||
|
- invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ {
|
||||||
|
+ invalid_tls_insn (input_bfd, input_section, rel);
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
/* LD->LE transition.
|
||||||
|
brasl %r14,__tls_get_addr@plt -> brcl 0,. */
|
||||||
|
insn0 = 0xc0040000;
|
270
gdb-rhbz1420304-s390x-10of35.patch
Normal file
270
gdb-rhbz1420304-s390x-10of35.patch
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
commit 0567c9861e113a573cc905002a59cb1bc3d78450
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:25 2017 +0200
|
||||||
|
|
||||||
|
Add test for modifiable DWARF locations
|
||||||
|
|
||||||
|
This adds a test for read/write access to variables with various types of
|
||||||
|
DWARF locations. It uses register- and memory locations and composite
|
||||||
|
locations with register- and memory pieces.
|
||||||
|
|
||||||
|
Since the new test calls gdb_test_no_output with commands that contain
|
||||||
|
braces, it is necessary for string_to_regexp to quote braces as well.
|
||||||
|
This was not done before.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
* gdb.dwarf2/var-access.c: New file.
|
||||||
|
* gdb.dwarf2/var-access.exp: New test.
|
||||||
|
* lib/gdb-utils.exp (string_to_regexp): Quote braces as well.
|
||||||
|
|
||||||
|
### a/gdb/testsuite/ChangeLog
|
||||||
|
### b/gdb/testsuite/ChangeLog
|
||||||
|
## -1,3 +1,9 @@
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
+ * gdb.dwarf2/var-access.c: New file.
|
||||||
|
+ * gdb.dwarf2/var-access.exp: New test.
|
||||||
|
+ * lib/gdb-utils.exp (string_to_regexp): Quote braces as well.
|
||||||
|
+
|
||||||
|
2017-06-12 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
* gdb.dwarf2/formdata16.exp: Add tests.
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gdb/testsuite/gdb.dwarf2/var-access.c
|
||||||
|
@@ -0,0 +1,25 @@
|
||||||
|
+/* This testcase is part of GDB, the GNU debugger.
|
||||||
|
+
|
||||||
|
+ Copyright 2017 Free Software Foundation, Inc.
|
||||||
|
+
|
||||||
|
+ This program is free software; you can redistribute it and/or modify
|
||||||
|
+ it under the terms of the GNU General Public License as published by
|
||||||
|
+ the Free Software Foundation; either version 3 of the License, or
|
||||||
|
+ (at your option) any later version.
|
||||||
|
+
|
||||||
|
+ This program is distributed in the hope that it will be useful,
|
||||||
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+ You should have received a copy of the GNU General Public License
|
||||||
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
+
|
||||||
|
+char buf[] = {0, 1, 2, 3, 4, 5, 6, 7};
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+main (void)
|
||||||
|
+{
|
||||||
|
+ asm volatile ("main_label: .globl main_label");
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gdb/testsuite/gdb.dwarf2/var-access.exp
|
||||||
|
@@ -0,0 +1,197 @@
|
||||||
|
+# Copyright 2017 Free Software Foundation, Inc.
|
||||||
|
+
|
||||||
|
+# This program is free software; you can redistribute it and/or modify
|
||||||
|
+# it under the terms of the GNU General Public License as published by
|
||||||
|
+# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
+# (at your option) any later version.
|
||||||
|
+#
|
||||||
|
+# This program is distributed in the hope that it will be useful,
|
||||||
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+# GNU General Public License for more details.
|
||||||
|
+#
|
||||||
|
+# You should have received a copy of the GNU General Public License
|
||||||
|
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
+
|
||||||
|
+# Test reading/writing variables with non-trivial DWARF locations. In
|
||||||
|
+# particular the test uses register- and memory locations as well as
|
||||||
|
+# composite locations with register- and memory pieces.
|
||||||
|
+
|
||||||
|
+load_lib dwarf.exp
|
||||||
|
+
|
||||||
|
+# This test can only be run on targets which support DWARF-2 and use gas.
|
||||||
|
+if {![dwarf2_support]} {
|
||||||
|
+ return 0
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+# Choose suitable integer registers for the test.
|
||||||
|
+
|
||||||
|
+set dwarf_regnum {0 1}
|
||||||
|
+
|
||||||
|
+if { [istarget "aarch64*-*-*"] } {
|
||||||
|
+ set regname {x0 x1}
|
||||||
|
+} elseif { [istarget "arm*-*-*"]
|
||||||
|
+ || [istarget "s390*-*-*" ]
|
||||||
|
+ || [istarget "powerpc*-*-*"]
|
||||||
|
+ || [istarget "rs6000*-*-aix*"] } {
|
||||||
|
+ set regname {r0 r1}
|
||||||
|
+} elseif { [istarget "i?86-*-*"] } {
|
||||||
|
+ set regname {eax edx}
|
||||||
|
+} elseif { [istarget "x86_64-*-*"] } {
|
||||||
|
+ set regname {rax rdx}
|
||||||
|
+} else {
|
||||||
|
+ verbose "Skipping tests for accessing DWARF-described variables."
|
||||||
|
+ return
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+standard_testfile .c ${gdb_test_file_name}-dw.S
|
||||||
|
+
|
||||||
|
+# Make some DWARF for the test.
|
||||||
|
+
|
||||||
|
+set asm_file [standard_output_file $srcfile2]
|
||||||
|
+Dwarf::assemble $asm_file {
|
||||||
|
+ global srcdir subdir srcfile
|
||||||
|
+ global dwarf_regnum regname
|
||||||
|
+
|
||||||
|
+ set buf_var [gdb_target_symbol buf]
|
||||||
|
+
|
||||||
|
+ cu {} {
|
||||||
|
+ DW_TAG_compile_unit {
|
||||||
|
+ {DW_AT_name var-pieces-dw.c}
|
||||||
|
+ {DW_AT_comp_dir /tmp}
|
||||||
|
+ } {
|
||||||
|
+ declare_labels char_type_label
|
||||||
|
+ declare_labels int_type_label short_type_label
|
||||||
|
+ declare_labels array_a8_label struct_s_label
|
||||||
|
+
|
||||||
|
+ # char
|
||||||
|
+ char_type_label: base_type {
|
||||||
|
+ {name "char"}
|
||||||
|
+ {encoding @DW_ATE_unsigned_char}
|
||||||
|
+ {byte_size 1 DW_FORM_sdata}
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ # int
|
||||||
|
+ int_type_label: base_type {
|
||||||
|
+ {name "int"}
|
||||||
|
+ {encoding @DW_ATE_signed}
|
||||||
|
+ {byte_size 4 DW_FORM_sdata}
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ # char [8]
|
||||||
|
+ array_a8_label: array_type {
|
||||||
|
+ {type :$char_type_label}
|
||||||
|
+ } {
|
||||||
|
+ subrange_type {
|
||||||
|
+ {type :$int_type_label}
|
||||||
|
+ {upper_bound 7 DW_FORM_udata}
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ # struct s { char a, b, c, d; };
|
||||||
|
+ struct_s_label: structure_type {
|
||||||
|
+ {name "s"}
|
||||||
|
+ {byte_size 4 DW_FORM_sdata}
|
||||||
|
+ } {
|
||||||
|
+ member {
|
||||||
|
+ {name "a"}
|
||||||
|
+ {type :$char_type_label}
|
||||||
|
+ {data_member_location 0 DW_FORM_udata}
|
||||||
|
+ }
|
||||||
|
+ member {
|
||||||
|
+ {name "b"}
|
||||||
|
+ {type :$char_type_label}
|
||||||
|
+ {data_member_location 1 DW_FORM_udata}
|
||||||
|
+ }
|
||||||
|
+ member {
|
||||||
|
+ {name "c"}
|
||||||
|
+ {type :$char_type_label}
|
||||||
|
+ {data_member_location 2 DW_FORM_udata}
|
||||||
|
+ }
|
||||||
|
+ member {
|
||||||
|
+ {name "d"}
|
||||||
|
+ {type :$char_type_label}
|
||||||
|
+ {data_member_location 3 DW_FORM_udata}
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ DW_TAG_subprogram {
|
||||||
|
+ {MACRO_AT_func { main ${srcdir}/${subdir}/${srcfile} }}
|
||||||
|
+ {DW_AT_external 1 flag}
|
||||||
|
+ } {
|
||||||
|
+ # Simple memory location.
|
||||||
|
+ DW_TAG_variable {
|
||||||
|
+ {name "a"}
|
||||||
|
+ {type :$array_a8_label}
|
||||||
|
+ {location {
|
||||||
|
+ addr $buf_var
|
||||||
|
+ } SPECIAL_expr}
|
||||||
|
+ }
|
||||||
|
+ # Memory pieces: two bytes from &buf[2], and two bytes
|
||||||
|
+ # from &buf[0].
|
||||||
|
+ DW_TAG_variable {
|
||||||
|
+ {name "s1"}
|
||||||
|
+ {type :$struct_s_label}
|
||||||
|
+ {location {
|
||||||
|
+ addr $buf_var
|
||||||
|
+ plus_uconst 2
|
||||||
|
+ piece 2
|
||||||
|
+ addr $buf_var
|
||||||
|
+ piece 2
|
||||||
|
+ } SPECIAL_expr}
|
||||||
|
+ }
|
||||||
|
+ # Register- and memory pieces: one byte each from r0,
|
||||||
|
+ # &buf[4], r1, and &buf[5].
|
||||||
|
+ DW_TAG_variable {
|
||||||
|
+ {name "s2"}
|
||||||
|
+ {type :$struct_s_label}
|
||||||
|
+ {location {
|
||||||
|
+ regx [lindex $dwarf_regnum 0]
|
||||||
|
+ piece 1
|
||||||
|
+ addr "$buf_var + 4"
|
||||||
|
+ piece 1
|
||||||
|
+ regx [lindex $dwarf_regnum 1]
|
||||||
|
+ piece 1
|
||||||
|
+ addr "$buf_var + 5"
|
||||||
|
+ piece 1
|
||||||
|
+ } SPECIAL_expr}
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+if { [prepare_for_testing ${testfile}.exp ${testfile} \
|
||||||
|
+ [list $srcfile $asm_file] {nodebug}] } {
|
||||||
|
+ return -1
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+if ![runto_main] {
|
||||||
|
+ return -1
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+# Byte-aligned memory pieces.
|
||||||
|
+gdb_test "print/d s1" " = \\{a = 2, b = 3, c = 0, d = 1\\}" \
|
||||||
|
+ "s1 == re-ordered buf"
|
||||||
|
+gdb_test_no_output "set var s1.a = 63"
|
||||||
|
+gdb_test "print/d s1" " = \\{a = 63, b = 3, c = 0, d = 1\\}" \
|
||||||
|
+ "verify s1.a"
|
||||||
|
+gdb_test "print/d a" " = \\{0, 1, 63, 3, 4, 5, 6, 7\\}" \
|
||||||
|
+ "verify s1.a through a"
|
||||||
|
+
|
||||||
|
+# Byte-aligned register- and memory pieces.
|
||||||
|
+gdb_test_no_output "set var \$[lindex $regname 0] = 81" \
|
||||||
|
+ "init reg for s2.a"
|
||||||
|
+gdb_test_no_output "set var \$[lindex $regname 1] = 28" \
|
||||||
|
+ "init reg for s2.c"
|
||||||
|
+gdb_test "print/d s2" " = \\{a = 81, b = 4, c = 28, d = 5\\}" \
|
||||||
|
+ "initialized s2 from mem and regs"
|
||||||
|
+gdb_test_no_output "set var s2.c += s2.a + s2.b - s2.d"
|
||||||
|
+gdb_test "print/d s2" " = \\{a = 81, b = 4, c = 108, d = 5\\}" \
|
||||||
|
+ "verify s2.c"
|
||||||
|
+gdb_test "print/d \$[lindex $regname 1]" " = 108" \
|
||||||
|
+ "verify s2.c through reg"
|
||||||
|
+gdb_test_no_output "set var s2 = {191, 73, 231, 123}" \
|
||||||
|
+ "re-initialize s2"
|
||||||
|
+gdb_test "print/d s2" " = \\{a = 191, b = 73, c = 231, d = 123\\}" \
|
||||||
|
+ "verify re-initialized s2"
|
||||||
|
--- a/gdb/testsuite/lib/gdb-utils.exp
|
||||||
|
+++ b/gdb/testsuite/lib/gdb-utils.exp
|
||||||
|
@@ -34,6 +34,6 @@ proc gdb_init_commands {} {
|
||||||
|
|
||||||
|
proc string_to_regexp {str} {
|
||||||
|
set result $str
|
||||||
|
- regsub -all {[]*+.|()^$\[\\]} $str {\\&} result
|
||||||
|
+ regsub -all {[]*+.|(){}^$\[\\]} $str {\\&} result
|
||||||
|
return $result
|
||||||
|
}
|
106
gdb-rhbz1420304-s390x-11of35.patch
Normal file
106
gdb-rhbz1420304-s390x-11of35.patch
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
commit d5d1163eff2415a01895f1cff8bbee32b3f0ab66
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:26 2017 +0200
|
||||||
|
|
||||||
|
write_pieced_value: Fix size capping logic
|
||||||
|
|
||||||
|
A field f in a structure composed of DWARF pieces may be located in
|
||||||
|
multiple pieces, where the first and last of those may contain bits from
|
||||||
|
other fields as well. So when writing to f, the beginning of the first
|
||||||
|
and the end of the last of those pieces may have to be skipped. But the
|
||||||
|
logic in write_pieced_value for handling one of those pieces is flawed
|
||||||
|
when the first and last piece are the same, i.e., f is contained in a
|
||||||
|
single piece:
|
||||||
|
|
||||||
|
< - - - - - - - - - piece_size - - - - - - - - - ->
|
||||||
|
+-------------------------------------------------+
|
||||||
|
| skipped_bits | f_bits | / / / / / / / / / / |
|
||||||
|
+-------------------------------------------------+
|
||||||
|
|
||||||
|
The current logic determines the size of the sub-piece to operate on by
|
||||||
|
limiting the piece size to the bit size of f and then subtracting the
|
||||||
|
skipped bits:
|
||||||
|
|
||||||
|
min (piece_size, f_bits) - skipped_bits
|
||||||
|
|
||||||
|
Instead of:
|
||||||
|
|
||||||
|
min (piece_size - skipped_bits, f_bits)
|
||||||
|
|
||||||
|
So the resulting sub-piece size is corrupted, leading to wrong handling of
|
||||||
|
this piece in write_pieced_value.
|
||||||
|
|
||||||
|
Note that the same bug was already found in read_pieced_value and fixed
|
||||||
|
there (but not in write_pieced_value), see PR 15391.
|
||||||
|
|
||||||
|
This patch swaps the calculations, bringing them into the same (correct)
|
||||||
|
order as in read_pieced_value.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* dwarf2loc.c (write_pieced_value): Fix order of calculations for
|
||||||
|
size capping.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
* gdb.dwarf2/var-pieces.exp: Add test case for modifying a
|
||||||
|
variable at nonzero offset.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,3 +1,8 @@
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
+ * dwarf2loc.c (write_pieced_value): Fix order of calculations for
|
||||||
|
+ size capping.
|
||||||
|
+
|
||||||
|
2017-06-13 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
|
* mips-linux-nat.c: Move include features/mips*-linux.c to
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -1964,8 +1964,6 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
bits_to_skip -= this_size_bits;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
- if (this_size_bits > type_len - offset)
|
||||||
|
- this_size_bits = type_len - offset;
|
||||||
|
if (bits_to_skip > 0)
|
||||||
|
{
|
||||||
|
dest_offset_bits = bits_to_skip;
|
||||||
|
@@ -1978,6 +1976,8 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
dest_offset_bits = 0;
|
||||||
|
source_offset_bits = offset;
|
||||||
|
}
|
||||||
|
+ if (this_size_bits > type_len - offset)
|
||||||
|
+ this_size_bits = type_len - offset;
|
||||||
|
|
||||||
|
this_size = (this_size_bits + source_offset_bits % 8 + 7) / 8;
|
||||||
|
source_offset = source_offset_bits / 8;
|
||||||
|
### a/gdb/testsuite/ChangeLog
|
||||||
|
### b/gdb/testsuite/ChangeLog
|
||||||
|
## -1,5 +1,10 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * gdb.dwarf2/var-pieces.exp: Add test case for modifying a
|
||||||
|
+ variable at nonzero offset.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* gdb.dwarf2/var-access.c: New file.
|
||||||
|
* gdb.dwarf2/var-access.exp: New test.
|
||||||
|
* lib/gdb-utils.exp (string_to_regexp): Quote braces as well.
|
||||||
|
--- a/gdb/testsuite/gdb.dwarf2/var-access.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.dwarf2/var-access.exp
|
||||||
|
@@ -178,6 +178,11 @@ gdb_test "print/d s1" " = \\{a = 63, b = 3, c = 0, d = 1\\}" \
|
||||||
|
"verify s1.a"
|
||||||
|
gdb_test "print/d a" " = \\{0, 1, 63, 3, 4, 5, 6, 7\\}" \
|
||||||
|
"verify s1.a through a"
|
||||||
|
+gdb_test_no_output "set var s1.b = 42"
|
||||||
|
+gdb_test "print/d s1" " = \\{a = 63, b = 42, c = 0, d = 1\\}" \
|
||||||
|
+ "verify s1.b"
|
||||||
|
+gdb_test "print/d a" " = \\{0, 1, 63, 42, 4, 5, 6, 7\\}" \
|
||||||
|
+ "verify s1.b through a"
|
||||||
|
|
||||||
|
# Byte-aligned register- and memory pieces.
|
||||||
|
gdb_test_no_output "set var \$[lindex $regname 0] = 81" \
|
189
gdb-rhbz1420304-s390x-12of35.patch
Normal file
189
gdb-rhbz1420304-s390x-12of35.patch
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
commit e93523245b704bc126705620969b4736b00350c5
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:26 2017 +0200
|
||||||
|
|
||||||
|
PR gdb/21226: Take DWARF stack value pieces from LSB end
|
||||||
|
|
||||||
|
When taking a DW_OP_piece or DW_OP_bit_piece from a DW_OP_stack_value, the
|
||||||
|
existing logic always takes the piece from the lowest-addressed end, which
|
||||||
|
is wrong on big-endian targets. The DWARF standard states that the
|
||||||
|
"DW_OP_bit_piece operation describes a sequence of bits using the least
|
||||||
|
significant bits of that value", and this also matches the current logic
|
||||||
|
in GCC. For instance, the GCC guality test case pr54970.c fails on s390x
|
||||||
|
because of this.
|
||||||
|
|
||||||
|
This fix adjusts the piece accordingly on big-endian targets. It is
|
||||||
|
assumed that:
|
||||||
|
|
||||||
|
* DW_OP_piece shall take the piece from the LSB end as well;
|
||||||
|
|
||||||
|
* pieces reaching outside the stack value bits are considered undefined,
|
||||||
|
and a zero value can be used instead.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
PR gdb/21226
|
||||||
|
* dwarf2loc.c (read_pieced_value): Anchor stack value pieces at
|
||||||
|
the LSB end, independent of endianness.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
PR gdb/21226
|
||||||
|
* gdb.dwarf2/nonvar-access.exp: Add checks for verifying that
|
||||||
|
stack value pieces are taken from the LSB end.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,11 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ PR gdb/21226
|
||||||
|
+ * dwarf2loc.c (read_pieced_value): Anchor stack value pieces at
|
||||||
|
+ the LSB end, independent of endianness.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* dwarf2loc.c (write_pieced_value): Fix order of calculations for
|
||||||
|
size capping.
|
||||||
|
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -1858,6 +1858,10 @@ read_pieced_value (struct value *v)
|
||||||
|
if (unavail)
|
||||||
|
mark_value_bits_unavailable (v, offset, this_size_bits);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ copy_bitwise (contents, dest_offset_bits,
|
||||||
|
+ intermediate_buffer, source_offset_bits % 8,
|
||||||
|
+ this_size_bits, bits_big_endian);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -1866,26 +1870,30 @@ read_pieced_value (struct value *v)
|
||||||
|
p->v.mem.in_stack_memory,
|
||||||
|
p->v.mem.addr + source_offset,
|
||||||
|
buffer.data (), this_size);
|
||||||
|
+ copy_bitwise (contents, dest_offset_bits,
|
||||||
|
+ intermediate_buffer, source_offset_bits % 8,
|
||||||
|
+ this_size_bits, bits_big_endian);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DWARF_VALUE_STACK:
|
||||||
|
{
|
||||||
|
- size_t n = this_size;
|
||||||
|
+ struct objfile *objfile = dwarf2_per_cu_objfile (c->per_cu);
|
||||||
|
+ struct gdbarch *objfile_gdbarch = get_objfile_arch (objfile);
|
||||||
|
+ ULONGEST stack_value_size_bits
|
||||||
|
+ = 8 * TYPE_LENGTH (value_type (p->v.value));
|
||||||
|
|
||||||
|
- if (n > c->addr_size - source_offset)
|
||||||
|
- n = (c->addr_size >= source_offset
|
||||||
|
- ? c->addr_size - source_offset
|
||||||
|
- : 0);
|
||||||
|
- if (n == 0)
|
||||||
|
- {
|
||||||
|
- /* Nothing. */
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- const gdb_byte *val_bytes = value_contents_all (p->v.value);
|
||||||
|
+ /* Use zeroes if piece reaches beyond stack value. */
|
||||||
|
+ if (p->size > stack_value_size_bits)
|
||||||
|
+ break;
|
||||||
|
|
||||||
|
- intermediate_buffer = val_bytes + source_offset;
|
||||||
|
- }
|
||||||
|
+ /* Piece is anchored at least significant bit end. */
|
||||||
|
+ if (gdbarch_byte_order (objfile_gdbarch) == BFD_ENDIAN_BIG)
|
||||||
|
+ source_offset_bits += stack_value_size_bits - p->size;
|
||||||
|
+
|
||||||
|
+ copy_bitwise (contents, dest_offset_bits,
|
||||||
|
+ value_contents_all (p->v.value),
|
||||||
|
+ source_offset_bits,
|
||||||
|
+ this_size_bits, bits_big_endian);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -1899,6 +1907,10 @@ read_pieced_value (struct value *v)
|
||||||
|
: 0);
|
||||||
|
if (n != 0)
|
||||||
|
intermediate_buffer = p->v.literal.data + source_offset;
|
||||||
|
+
|
||||||
|
+ copy_bitwise (contents, dest_offset_bits,
|
||||||
|
+ intermediate_buffer, source_offset_bits % 8,
|
||||||
|
+ this_size_bits, bits_big_endian);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -1915,12 +1927,6 @@ read_pieced_value (struct value *v)
|
||||||
|
internal_error (__FILE__, __LINE__, _("invalid location type"));
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (p->location != DWARF_VALUE_OPTIMIZED_OUT
|
||||||
|
- && p->location != DWARF_VALUE_IMPLICIT_POINTER)
|
||||||
|
- copy_bitwise (contents, dest_offset_bits,
|
||||||
|
- intermediate_buffer, source_offset_bits % 8,
|
||||||
|
- this_size_bits, bits_big_endian);
|
||||||
|
-
|
||||||
|
offset += this_size_bits;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
### a/gdb/testsuite/ChangeLog
|
||||||
|
### b/gdb/testsuite/ChangeLog
|
||||||
|
## -1,5 +1,11 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ PR gdb/21226
|
||||||
|
+ * gdb.dwarf2/nonvar-access.exp: Add checks for verifying that
|
||||||
|
+ stack value pieces are taken from the LSB end.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* gdb.dwarf2/var-pieces.exp: Add test case for modifying a
|
||||||
|
variable at nonzero offset.
|
||||||
|
|
||||||
|
--- a/gdb/testsuite/gdb.dwarf2/nonvar-access.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.dwarf2/nonvar-access.exp
|
||||||
|
@@ -128,14 +128,26 @@ Dwarf::assemble $asm_file {
|
||||||
|
{name def_t}
|
||||||
|
{type :$struct_t_label}
|
||||||
|
{location {
|
||||||
|
- const1u 0
|
||||||
|
+ const2s -184
|
||||||
|
stack_value
|
||||||
|
bit_piece 9 0
|
||||||
|
- const1s -1
|
||||||
|
+ const4u 1752286
|
||||||
|
stack_value
|
||||||
|
bit_piece 23 0
|
||||||
|
} SPECIAL_expr}
|
||||||
|
}
|
||||||
|
+ # Composite location with some empty pieces.
|
||||||
|
+ DW_TAG_variable {
|
||||||
|
+ {name part_def_a}
|
||||||
|
+ {type :$array_a9_label}
|
||||||
|
+ {location {
|
||||||
|
+ piece 3
|
||||||
|
+ const4u 0xf1927314
|
||||||
|
+ stack_value
|
||||||
|
+ piece 4
|
||||||
|
+ piece 2
|
||||||
|
+ } SPECIAL_expr}
|
||||||
|
+ }
|
||||||
|
# Implicit location: immediate value.
|
||||||
|
DW_TAG_variable {
|
||||||
|
{name def_implicit_s}
|
||||||
|
@@ -221,9 +233,12 @@ gdb_test "print/x *implicit_b_ptr" " = $val"
|
||||||
|
|
||||||
|
# Byte-aligned fields, pieced together from DWARF stack values.
|
||||||
|
gdb_test "print def_s" " = \\{a = 0, b = -1\\}"
|
||||||
|
+switch $endian { big {set val 0x92} little {set val 0x73} }
|
||||||
|
+gdb_test "print/x part_def_a\[4\]" " = $val"
|
||||||
|
+gdb_test "print/x part_def_a\[8\]" " = <optimized out>"
|
||||||
|
|
||||||
|
# Non-byte-aligned fields, pieced together from DWARF stack values.
|
||||||
|
-gdb_test "print def_t" " = \\{a = 0, b = -1\\}"
|
||||||
|
+gdb_test "print def_t" " = \\{a = -184, b = 1752286\\}"
|
||||||
|
|
||||||
|
# Simple variable without location.
|
||||||
|
gdb_test "print undef_int" " = <optimized out>"
|
72
gdb-rhbz1420304-s390x-13of35.patch
Normal file
72
gdb-rhbz1420304-s390x-13of35.patch
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
commit 805acca042afed8e8431c92ab031167b03475676
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:26 2017 +0200
|
||||||
|
|
||||||
|
gdb/testsuite: Add "get_endianness" convenience proc
|
||||||
|
|
||||||
|
The test suite contains multiple instances of determining the target's
|
||||||
|
endianness with GDB's "show endian" command. This patch replaces these by
|
||||||
|
an invocation of a new convenience proc 'get_endianness'.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
* lib/gdb.exp (get_endianness): New proc.
|
||||||
|
* gdb.arch/aarch64-fp.exp: Use it.
|
||||||
|
* gdb.arch/altivec-regs.exp: Likewise.
|
||||||
|
* gdb.arch/e500-regs.exp: Likewise.
|
||||||
|
* gdb.arch/vsx-regs.exp: Likewise.
|
||||||
|
* gdb.base/dump.exp: Likewise.
|
||||||
|
* gdb.base/funcargs.exp: Likewise.
|
||||||
|
* gdb.base/gnu_vector.exp: Likewise.
|
||||||
|
* gdb.dwarf2/formdata16.exp: Likewise.
|
||||||
|
* gdb.dwarf2/implptrpiece.exp: Likewise.
|
||||||
|
* gdb.dwarf2/nonvar-access.exp: Likewise.
|
||||||
|
* gdb.python/py-inferior.exp: Likewise.
|
||||||
|
* gdb.trace/unavailable-dwarf-piece.exp: Likewise.
|
||||||
|
|
||||||
|
### a/gdb/testsuite/ChangeLog
|
||||||
|
### b/gdb/testsuite/ChangeLog
|
||||||
|
## -1,5 +1,21 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * lib/gdb.exp (get_endianness): New proc.
|
||||||
|
+ * gdb.arch/aarch64-fp.exp: Use it.
|
||||||
|
+ * gdb.arch/altivec-regs.exp: Likewise.
|
||||||
|
+ * gdb.arch/e500-regs.exp: Likewise.
|
||||||
|
+ * gdb.arch/vsx-regs.exp: Likewise.
|
||||||
|
+ * gdb.base/dump.exp: Likewise.
|
||||||
|
+ * gdb.base/funcargs.exp: Likewise.
|
||||||
|
+ * gdb.base/gnu_vector.exp: Likewise.
|
||||||
|
+ * gdb.dwarf2/formdata16.exp: Likewise.
|
||||||
|
+ * gdb.dwarf2/implptrpiece.exp: Likewise.
|
||||||
|
+ * gdb.dwarf2/nonvar-access.exp: Likewise.
|
||||||
|
+ * gdb.python/py-inferior.exp: Likewise.
|
||||||
|
+ * gdb.trace/unavailable-dwarf-piece.exp: Likewise.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
PR gdb/21226
|
||||||
|
* gdb.dwarf2/nonvar-access.exp: Add checks for verifying that
|
||||||
|
stack value pieces are taken from the LSB end.
|
||||||
|
--- a/gdb/testsuite/lib/gdb.exp
|
||||||
|
+++ b/gdb/testsuite/lib/gdb.exp
|
||||||
|
@@ -5671,6 +5671,19 @@ proc set_remotetimeout { timeout } {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+# Get the target's current endianness and return it.
|
||||||
|
+proc get_endianness { } {
|
||||||
|
+ global gdb_prompt
|
||||||
|
+
|
||||||
|
+ gdb_test_multiple "show endian" "determine endianness" {
|
||||||
|
+ -re ".* (little|big) endian.*\r\n$gdb_prompt $" {
|
||||||
|
+ # Pass silently.
|
||||||
|
+ return $expect_out(1,string)
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return "little"
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
# ROOT and FULL are file names. Returns the relative path from ROOT
|
||||||
|
# to FULL. Note that FULL must be in a subdirectory of ROOT.
|
||||||
|
# For example, given ROOT = /usr/bin and FULL = /usr/bin/ls, this
|
70
gdb-rhbz1420304-s390x-14of35.patch
Normal file
70
gdb-rhbz1420304-s390x-14of35.patch
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
commit af547a9614969e1d1ea6fcec6b59cd77a606380f
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:27 2017 +0200
|
||||||
|
|
||||||
|
read/write_pieced_value: Respect value parent's offset
|
||||||
|
|
||||||
|
In the case of targeting a bit-field, read_pieced_value and
|
||||||
|
write_pieced_value calculate the number of bits preceding the bit-field
|
||||||
|
without considering the relative offset of the value's parent. This is
|
||||||
|
relevant for a structure variable like this:
|
||||||
|
|
||||||
|
struct s {
|
||||||
|
uint64_t foo;
|
||||||
|
struct {
|
||||||
|
uint32_t bar;
|
||||||
|
uint32_t bf : 10; /* <-- target bit-field */
|
||||||
|
} baz;
|
||||||
|
} s;
|
||||||
|
|
||||||
|
In this scenario, if 'val' is a GDB value representing s.baz.bf,
|
||||||
|
val->parent represents the whole s.baz structure, and the following holds:
|
||||||
|
|
||||||
|
- value_offset (val) == sizeof s.baz.bar == 4
|
||||||
|
- value_offset (val->parent) == sizeof s.foo == 8
|
||||||
|
|
||||||
|
The current logic would only use value_offset(val), resulting in the wrong
|
||||||
|
offset into the target value. This is fixed.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* dwarf2loc.c (read_pieced_value): Respect parent value's offset
|
||||||
|
when targeting a bit-field.
|
||||||
|
(write_pieced_value): Likewise.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,11 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * dwarf2loc.c (read_pieced_value): Respect parent value's offset
|
||||||
|
+ when targeting a bit-field.
|
||||||
|
+ (write_pieced_value): Likewise.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* dwarf2loc.c (struct piece_closure) <addr_size>: Remove field.
|
||||||
|
(allocate_piece_closure): Drop addr_size parameter.
|
||||||
|
(dwarf2_evaluate_loc_desc_full): Adjust call to
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -1776,7 +1776,8 @@ read_pieced_value (struct value *v)
|
||||||
|
bits_to_skip = 8 * value_offset (v);
|
||||||
|
if (value_bitsize (v))
|
||||||
|
{
|
||||||
|
- bits_to_skip += value_bitpos (v);
|
||||||
|
+ bits_to_skip += (8 * value_offset (value_parent (v))
|
||||||
|
+ + value_bitpos (v));
|
||||||
|
type_len = value_bitsize (v);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
@@ -1946,7 +1947,8 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
bits_to_skip = 8 * value_offset (to);
|
||||||
|
if (value_bitsize (to))
|
||||||
|
{
|
||||||
|
- bits_to_skip += value_bitpos (to);
|
||||||
|
+ bits_to_skip += (8 * value_offset (value_parent (to))
|
||||||
|
+ + value_bitpos (to));
|
||||||
|
type_len = value_bitsize (to);
|
||||||
|
}
|
||||||
|
else
|
40
gdb-rhbz1420304-s390x-15of35.patch
Normal file
40
gdb-rhbz1420304-s390x-15of35.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
commit cdaac320fd62bff75562aaa3e466494dc72dd175
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:27 2017 +0200
|
||||||
|
|
||||||
|
write_pieced_value: Fix copy/paste error in size calculation
|
||||||
|
|
||||||
|
In write_pieced_value, the number of bytes containing a portion of the
|
||||||
|
bit-field in a given piece is calculated with the wrong starting offset;
|
||||||
|
thus the result may be off by one. This bug was probably introduced when
|
||||||
|
copying this logic from read_pieced_value. Fix it.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* dwarf2loc.c (write_pieced_value): Fix copy/paste error in the
|
||||||
|
calculation of this_size.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,10 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * dwarf2loc.c (write_pieced_value): Fix copy/paste error in the
|
||||||
|
+ calculation of this_size.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* dwarf2loc.c (read_pieced_value): Respect parent value's offset
|
||||||
|
when targeting a bit-field.
|
||||||
|
(write_pieced_value): Likewise.
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -1983,7 +1983,7 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
if (this_size_bits > type_len - offset)
|
||||||
|
this_size_bits = type_len - offset;
|
||||||
|
|
||||||
|
- this_size = (this_size_bits + source_offset_bits % 8 + 7) / 8;
|
||||||
|
+ this_size = (this_size_bits + dest_offset_bits % 8 + 7) / 8;
|
||||||
|
source_offset = source_offset_bits / 8;
|
||||||
|
dest_offset = dest_offset_bits / 8;
|
||||||
|
if (dest_offset_bits % 8 == 0 && source_offset_bits % 8 == 0)
|
42
gdb-rhbz1420304-s390x-16of35.patch
Normal file
42
gdb-rhbz1420304-s390x-16of35.patch
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
commit f1cc987420d9d2489eb453bd1c87139666cbe7fd
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:27 2017 +0200
|
||||||
|
|
||||||
|
write_pieced_value: Include transfer size in byte-wise check
|
||||||
|
|
||||||
|
In write_pieced_value, when checking whether the data can be transferred
|
||||||
|
byte-wise, the current logic verifies the source- and destination offsets
|
||||||
|
to be byte-aligned, but not the transfer size. This is fixed.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* dwarf2loc.c (write_pieced_value): Include transfer size in
|
||||||
|
byte-wise check.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,10 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * dwarf2loc.c (write_pieced_value): Include transfer size in
|
||||||
|
+ byte-wise check.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* dwarf2loc.c (write_pieced_value): Fix copy/paste error in the
|
||||||
|
calculation of this_size.
|
||||||
|
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -1986,7 +1986,10 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
this_size = (this_size_bits + dest_offset_bits % 8 + 7) / 8;
|
||||||
|
source_offset = source_offset_bits / 8;
|
||||||
|
dest_offset = dest_offset_bits / 8;
|
||||||
|
- if (dest_offset_bits % 8 == 0 && source_offset_bits % 8 == 0)
|
||||||
|
+
|
||||||
|
+ /* Check whether the data can be transferred byte-wise. */
|
||||||
|
+ if (dest_offset_bits % 8 == 0 && source_offset_bits % 8 == 0
|
||||||
|
+ && this_size_bits % 8 == 0)
|
||||||
|
{
|
||||||
|
source_buffer = contents + source_offset;
|
||||||
|
need_bitwise = 0;
|
42
gdb-rhbz1420304-s390x-17of35.patch
Normal file
42
gdb-rhbz1420304-s390x-17of35.patch
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
commit 07c9ca3bd8e6f83bcec49c922b52422c538f60f7
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:28 2017 +0200
|
||||||
|
|
||||||
|
write_pieced_value: Fix buffer offset for memory pieces
|
||||||
|
|
||||||
|
In write_pieced_value, when transferring the data to target memory via a
|
||||||
|
buffer, the bit offset within the target value is not reduced to its
|
||||||
|
sub-byte fraction before using it as a bit offset into the buffer. This
|
||||||
|
is fixed.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* dwarf2loc.c (write_pieced_value): In DWARF_VALUE_MEMORY,
|
||||||
|
truncate full bytes from dest_offset_bits before using it as an
|
||||||
|
offset into the buffer.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,11 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * dwarf2loc.c (write_pieced_value): In DWARF_VALUE_MEMORY,
|
||||||
|
+ truncate full bytes from dest_offset_bits before using it as an
|
||||||
|
+ offset into the buffer.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* dwarf2loc.c (write_pieced_value): Include transfer size in
|
||||||
|
byte-wise check.
|
||||||
|
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -2058,7 +2058,7 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
read_memory (p->v.mem.addr + dest_offset, buffer.data (), 1);
|
||||||
|
read_memory (p->v.mem.addr + dest_offset + this_size - 1,
|
||||||
|
&buffer[this_size - 1], 1);
|
||||||
|
- copy_bitwise (buffer.data (), dest_offset_bits,
|
||||||
|
+ copy_bitwise (buffer.data (), dest_offset_bits % 8,
|
||||||
|
contents, source_offset_bits,
|
||||||
|
this_size_bits,
|
||||||
|
bits_big_endian);
|
166
gdb-rhbz1420304-s390x-18of35.patch
Normal file
166
gdb-rhbz1420304-s390x-18of35.patch
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
commit 359b19bb24d048750aa5367ad56a33267300d1a8
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:28 2017 +0200
|
||||||
|
|
||||||
|
write_pieced_value: Transfer least significant bits into bit-field
|
||||||
|
|
||||||
|
On big-endian targets, when targeting a bit-field, write_pieced_value
|
||||||
|
currently transfers the source value's *most* significant bits to the
|
||||||
|
target value, instead of its least significant bits. This is fixed.
|
||||||
|
|
||||||
|
In particular the fix adjusts the initial value of 'offset', which can now
|
||||||
|
potentially be nonzero. Thus the variable 'type_len' is renamed to
|
||||||
|
'max_offset', to avoid confusion. And for consistency, the affected logic
|
||||||
|
that was mirrored in read_pieced_value is changed there in the same way.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* dwarf2loc.c (write_pieced_value): When writing to a bit-field,
|
||||||
|
transfer the source value's least significant bits, instead of its
|
||||||
|
lowest-addressed ones. Rename type_len to max_offset.
|
||||||
|
(read_pieced_value): Mirror above changes to write_pieced_value as
|
||||||
|
applicable.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,13 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * dwarf2loc.c (write_pieced_value): When writing to a bit-field,
|
||||||
|
+ transfer the source value's least significant bits, instead of its
|
||||||
|
+ lowest-addressed ones. Rename type_len to max_offset.
|
||||||
|
+ (read_pieced_value): Mirror above changes to write_pieced_value as
|
||||||
|
+ applicable.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* dwarf2loc.c (write_pieced_value): In DWARF_VALUE_MEMORY,
|
||||||
|
truncate full bytes from dest_offset_bits before using it as an
|
||||||
|
offset into the buffer.
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -1756,12 +1756,11 @@ static void
|
||||||
|
read_pieced_value (struct value *v)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
- long offset = 0;
|
||||||
|
+ LONGEST offset = 0, max_offset;
|
||||||
|
ULONGEST bits_to_skip;
|
||||||
|
gdb_byte *contents;
|
||||||
|
struct piece_closure *c
|
||||||
|
= (struct piece_closure *) value_computed_closure (v);
|
||||||
|
- size_t type_len;
|
||||||
|
size_t buffer_size = 0;
|
||||||
|
std::vector<gdb_byte> buffer;
|
||||||
|
int bits_big_endian
|
||||||
|
@@ -1778,12 +1777,12 @@ read_pieced_value (struct value *v)
|
||||||
|
{
|
||||||
|
bits_to_skip += (8 * value_offset (value_parent (v))
|
||||||
|
+ value_bitpos (v));
|
||||||
|
- type_len = value_bitsize (v);
|
||||||
|
+ max_offset = value_bitsize (v);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- type_len = 8 * TYPE_LENGTH (value_type (v));
|
||||||
|
+ max_offset = 8 * TYPE_LENGTH (value_type (v));
|
||||||
|
|
||||||
|
- for (i = 0; i < c->n_pieces && offset < type_len; i++)
|
||||||
|
+ for (i = 0; i < c->n_pieces && offset < max_offset; i++)
|
||||||
|
{
|
||||||
|
struct dwarf_expr_piece *p = &c->pieces[i];
|
||||||
|
size_t this_size, this_size_bits;
|
||||||
|
@@ -1798,20 +1797,13 @@ read_pieced_value (struct value *v)
|
||||||
|
bits_to_skip -= this_size_bits;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
- if (bits_to_skip > 0)
|
||||||
|
- {
|
||||||
|
- dest_offset_bits = 0;
|
||||||
|
- source_offset_bits = bits_to_skip;
|
||||||
|
- this_size_bits -= bits_to_skip;
|
||||||
|
- bits_to_skip = 0;
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- dest_offset_bits = offset;
|
||||||
|
- source_offset_bits = 0;
|
||||||
|
- }
|
||||||
|
- if (this_size_bits > type_len - offset)
|
||||||
|
- this_size_bits = type_len - offset;
|
||||||
|
+ source_offset_bits = bits_to_skip;
|
||||||
|
+ this_size_bits -= bits_to_skip;
|
||||||
|
+ bits_to_skip = 0;
|
||||||
|
+ dest_offset_bits = offset;
|
||||||
|
+
|
||||||
|
+ if (this_size_bits > max_offset - offset)
|
||||||
|
+ this_size_bits = max_offset - offset;
|
||||||
|
|
||||||
|
this_size = (this_size_bits + source_offset_bits % 8 + 7) / 8;
|
||||||
|
source_offset = source_offset_bits / 8;
|
||||||
|
@@ -1932,12 +1924,11 @@ static void
|
||||||
|
write_pieced_value (struct value *to, struct value *from)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
- long offset = 0;
|
||||||
|
ULONGEST bits_to_skip;
|
||||||
|
+ LONGEST offset = 0, max_offset;
|
||||||
|
const gdb_byte *contents;
|
||||||
|
struct piece_closure *c
|
||||||
|
= (struct piece_closure *) value_computed_closure (to);
|
||||||
|
- size_t type_len;
|
||||||
|
size_t buffer_size = 0;
|
||||||
|
std::vector<gdb_byte> buffer;
|
||||||
|
int bits_big_endian
|
||||||
|
@@ -1949,12 +1940,20 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
{
|
||||||
|
bits_to_skip += (8 * value_offset (value_parent (to))
|
||||||
|
+ value_bitpos (to));
|
||||||
|
- type_len = value_bitsize (to);
|
||||||
|
- }
|
||||||
|
+ /* Use the least significant bits of FROM. */
|
||||||
|
+ if (gdbarch_byte_order (get_type_arch (value_type (from)))
|
||||||
|
+ == BFD_ENDIAN_BIG)
|
||||||
|
+ {
|
||||||
|
+ max_offset = 8 * TYPE_LENGTH (value_type (from));
|
||||||
|
+ offset = max_offset - value_bitsize (to);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ max_offset = value_bitsize (to);
|
||||||
|
+ }
|
||||||
|
else
|
||||||
|
- type_len = 8 * TYPE_LENGTH (value_type (to));
|
||||||
|
+ max_offset = 8 * TYPE_LENGTH (value_type (to));
|
||||||
|
|
||||||
|
- for (i = 0; i < c->n_pieces && offset < type_len; i++)
|
||||||
|
+ for (i = 0; i < c->n_pieces && offset < max_offset; i++)
|
||||||
|
{
|
||||||
|
struct dwarf_expr_piece *p = &c->pieces[i];
|
||||||
|
size_t this_size_bits, this_size;
|
||||||
|
@@ -1968,20 +1967,13 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
bits_to_skip -= this_size_bits;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
- if (bits_to_skip > 0)
|
||||||
|
- {
|
||||||
|
- dest_offset_bits = bits_to_skip;
|
||||||
|
- source_offset_bits = 0;
|
||||||
|
- this_size_bits -= bits_to_skip;
|
||||||
|
- bits_to_skip = 0;
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- dest_offset_bits = 0;
|
||||||
|
- source_offset_bits = offset;
|
||||||
|
- }
|
||||||
|
- if (this_size_bits > type_len - offset)
|
||||||
|
- this_size_bits = type_len - offset;
|
||||||
|
+ dest_offset_bits = bits_to_skip;
|
||||||
|
+ this_size_bits -= bits_to_skip;
|
||||||
|
+ bits_to_skip = 0;
|
||||||
|
+ source_offset_bits = offset;
|
||||||
|
+
|
||||||
|
+ if (this_size_bits > max_offset - offset)
|
||||||
|
+ this_size_bits = max_offset - offset;
|
||||||
|
|
||||||
|
this_size = (this_size_bits + dest_offset_bits % 8 + 7) / 8;
|
||||||
|
source_offset = source_offset_bits / 8;
|
142
gdb-rhbz1420304-s390x-19of35.patch
Normal file
142
gdb-rhbz1420304-s390x-19of35.patch
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
commit 3bf310110722b03d9ff9c4f34f5920a9be2878d0
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:29 2017 +0200
|
||||||
|
|
||||||
|
Add DWARF piece test cases for bit-field access
|
||||||
|
|
||||||
|
This verifies some of the previous fixes to the logic in
|
||||||
|
write_pieced_value when accessing bit-fields.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
* gdb.dwarf2/var-access.exp: Add tests for accessing bit-fields
|
||||||
|
located in one or more DWARF pieces.
|
||||||
|
|
||||||
|
### a/gdb/testsuite/ChangeLog
|
||||||
|
### b/gdb/testsuite/ChangeLog
|
||||||
|
## -1,5 +1,10 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * gdb.dwarf2/var-access.exp: Add tests for accessing bit-fields
|
||||||
|
+ located in one or more DWARF pieces.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* lib/gdb.exp (get_endianness): New proc.
|
||||||
|
* gdb.arch/aarch64-fp.exp: Use it.
|
||||||
|
* gdb.arch/altivec-regs.exp: Likewise.
|
||||||
|
--- a/gdb/testsuite/gdb.dwarf2/var-access.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.dwarf2/var-access.exp
|
||||||
|
@@ -62,7 +62,8 @@ Dwarf::assemble $asm_file {
|
||||||
|
} {
|
||||||
|
declare_labels char_type_label
|
||||||
|
declare_labels int_type_label short_type_label
|
||||||
|
- declare_labels array_a8_label struct_s_label
|
||||||
|
+ declare_labels array_a8_label struct_s_label struct_t_label
|
||||||
|
+ declare_labels struct_st_label
|
||||||
|
|
||||||
|
# char
|
||||||
|
char_type_label: base_type {
|
||||||
|
@@ -115,6 +116,51 @@ Dwarf::assemble $asm_file {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ # struct t { int u, x:9, y:13, z:10; };
|
||||||
|
+ struct_t_label: structure_type {
|
||||||
|
+ {name "t"}
|
||||||
|
+ {byte_size 8 DW_FORM_sdata}
|
||||||
|
+ } {
|
||||||
|
+ member {
|
||||||
|
+ {name "u"}
|
||||||
|
+ {type :$int_type_label}
|
||||||
|
+ }
|
||||||
|
+ member {
|
||||||
|
+ {name "x"}
|
||||||
|
+ {type :$int_type_label}
|
||||||
|
+ {data_member_location 4 DW_FORM_udata}
|
||||||
|
+ {bit_size 9 DW_FORM_udata}
|
||||||
|
+ }
|
||||||
|
+ member {
|
||||||
|
+ {name "y"}
|
||||||
|
+ {type :$int_type_label}
|
||||||
|
+ {data_bit_offset 41 DW_FORM_udata}
|
||||||
|
+ {bit_size 13 DW_FORM_udata}
|
||||||
|
+ }
|
||||||
|
+ member {
|
||||||
|
+ {name "z"}
|
||||||
|
+ {type :$int_type_label}
|
||||||
|
+ {data_bit_offset 54 DW_FORM_udata}
|
||||||
|
+ {bit_size 10 DW_FORM_udata}
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ # struct st { struct s s; struct t t; };
|
||||||
|
+ struct_st_label: structure_type {
|
||||||
|
+ {name "st"}
|
||||||
|
+ {byte_size 12 DW_FORM_udata}
|
||||||
|
+ } {
|
||||||
|
+ member {
|
||||||
|
+ {name "s"}
|
||||||
|
+ {type :$struct_s_label}
|
||||||
|
+ }
|
||||||
|
+ member {
|
||||||
|
+ {name "t"}
|
||||||
|
+ {type :$struct_t_label}
|
||||||
|
+ {data_member_location 4 DW_FORM_udata}
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
DW_TAG_subprogram {
|
||||||
|
{MACRO_AT_func { main ${srcdir}/${subdir}/${srcfile} }}
|
||||||
|
{DW_AT_external 1 flag}
|
||||||
|
@@ -156,6 +202,19 @@ Dwarf::assemble $asm_file {
|
||||||
|
piece 1
|
||||||
|
} SPECIAL_expr}
|
||||||
|
}
|
||||||
|
+ # Memory pieces for bitfield access: 8 bytes optimized
|
||||||
|
+ # out, 3 bytes from &buf[3], and 1 byte from &buf[1].
|
||||||
|
+ DW_TAG_variable {
|
||||||
|
+ {name "st1"}
|
||||||
|
+ {type :$struct_st_label}
|
||||||
|
+ {location {
|
||||||
|
+ piece 8
|
||||||
|
+ addr "$buf_var + 3"
|
||||||
|
+ piece 3
|
||||||
|
+ addr "$buf_var + 1"
|
||||||
|
+ piece 1
|
||||||
|
+ } SPECIAL_expr}
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -170,6 +229,9 @@ if ![runto_main] {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
+# Determine byte order.
|
||||||
|
+set endian [get_endianness]
|
||||||
|
+
|
||||||
|
# Byte-aligned memory pieces.
|
||||||
|
gdb_test "print/d s1" " = \\{a = 2, b = 3, c = 0, d = 1\\}" \
|
||||||
|
"s1 == re-ordered buf"
|
||||||
|
@@ -200,3 +262,20 @@ gdb_test_no_output "set var s2 = {191, 73, 231, 123}" \
|
||||||
|
"re-initialize s2"
|
||||||
|
gdb_test "print/d s2" " = \\{a = 191, b = 73, c = 231, d = 123\\}" \
|
||||||
|
"verify re-initialized s2"
|
||||||
|
+
|
||||||
|
+# Unaligned bitfield access through byte-aligned pieces.
|
||||||
|
+gdb_test_no_output "set var a = { 0 }"
|
||||||
|
+gdb_test_no_output "set var st1.t.x = -7"
|
||||||
|
+gdb_test_no_output "set var st1.t.z = 340"
|
||||||
|
+gdb_test_no_output "set var st1.t.y = 1234"
|
||||||
|
+gdb_test "print st1.t" " = \\{u = <optimized out>, x = -7, y = 1234, z = 340\\}" \
|
||||||
|
+ "verify st1.t"
|
||||||
|
+switch $endian {
|
||||||
|
+ little {set val "0x55, 0x0, 0xf9, 0xa5, 0x9"}
|
||||||
|
+ big {set val "0x54, 0x0, 0xfc, 0x93, 0x49"}
|
||||||
|
+}
|
||||||
|
+# | -- | z:2-9 | -- | x:0-7 | x:8 y:0-6 | y:7-12 z:0-1 | -- | -- |
|
||||||
|
+# \_______________________________________________/
|
||||||
|
+# val
|
||||||
|
+gdb_test "print/x a" " = \\{0x0, ${val}, 0x0, 0x0\\}" \
|
||||||
|
+ "verify st1 through a"
|
74
gdb-rhbz1420304-s390x-20of35.patch
Normal file
74
gdb-rhbz1420304-s390x-20of35.patch
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
commit 840989c113433c069f54872d7e051e1572202326
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:30 2017 +0200
|
||||||
|
|
||||||
|
read/write_pieced_value: Drop 'buffer_size' variable
|
||||||
|
|
||||||
|
When the variable 'buffer_size' in read_pieced_value and
|
||||||
|
write_pieced_value was introduced, it was needed for tracking the buffer's
|
||||||
|
allocated size. Now that the buffer's data type has been changed to a
|
||||||
|
std::vector, the variable is no longer necessary; so remove it.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* dwarf2loc.c (read_pieced_value): Remove buffer_size variable.
|
||||||
|
(write_pieced_value): Likewise.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,10 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * dwarf2loc.c (read_pieced_value): Remove buffer_size variable.
|
||||||
|
+ (write_pieced_value): Likewise.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* dwarf2loc.c (write_pieced_value): When writing to a bit-field,
|
||||||
|
transfer the source value's least significant bits, instead of its
|
||||||
|
lowest-addressed ones. Rename type_len to max_offset.
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -1761,7 +1761,6 @@ read_pieced_value (struct value *v)
|
||||||
|
gdb_byte *contents;
|
||||||
|
struct piece_closure *c
|
||||||
|
= (struct piece_closure *) value_computed_closure (v);
|
||||||
|
- size_t buffer_size = 0;
|
||||||
|
std::vector<gdb_byte> buffer;
|
||||||
|
int bits_big_endian
|
||||||
|
= gdbarch_bits_big_endian (get_type_arch (value_type (v)));
|
||||||
|
@@ -1806,12 +1805,8 @@ read_pieced_value (struct value *v)
|
||||||
|
this_size_bits = max_offset - offset;
|
||||||
|
|
||||||
|
this_size = (this_size_bits + source_offset_bits % 8 + 7) / 8;
|
||||||
|
+ buffer.reserve (this_size);
|
||||||
|
source_offset = source_offset_bits / 8;
|
||||||
|
- if (buffer_size < this_size)
|
||||||
|
- {
|
||||||
|
- buffer_size = this_size;
|
||||||
|
- buffer.reserve (buffer_size);
|
||||||
|
- }
|
||||||
|
intermediate_buffer = buffer.data ();
|
||||||
|
|
||||||
|
/* Copy from the source to DEST_BUFFER. */
|
||||||
|
@@ -1929,7 +1924,6 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
const gdb_byte *contents;
|
||||||
|
struct piece_closure *c
|
||||||
|
= (struct piece_closure *) value_computed_closure (to);
|
||||||
|
- size_t buffer_size = 0;
|
||||||
|
std::vector<gdb_byte> buffer;
|
||||||
|
int bits_big_endian
|
||||||
|
= gdbarch_bits_big_endian (get_type_arch (value_type (to)));
|
||||||
|
@@ -1988,11 +1982,7 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
- if (buffer_size < this_size)
|
||||||
|
- {
|
||||||
|
- buffer_size = this_size;
|
||||||
|
- buffer.reserve (buffer_size);
|
||||||
|
- }
|
||||||
|
+ buffer.reserve (this_size);
|
||||||
|
source_buffer = buffer.data ();
|
||||||
|
need_bitwise = 1;
|
||||||
|
}
|
227
gdb-rhbz1420304-s390x-21of35.patch
Normal file
227
gdb-rhbz1420304-s390x-21of35.patch
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
commit 03c8af18d1a8f359fd023696848bda488119da60
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:30 2017 +0200
|
||||||
|
|
||||||
|
Fix handling of DWARF register pieces on big-endian targets
|
||||||
|
|
||||||
|
For big-endian targets the logic in read/write_pieced_value tries to take
|
||||||
|
a register piece from the LSB end. This requires offsets and sizes to be
|
||||||
|
adjusted accordingly, and that's where the current implementation has some
|
||||||
|
issues:
|
||||||
|
|
||||||
|
* The formulas for recalculating the bit- and byte-offsets into the
|
||||||
|
register are wrong. They just happen to yield correct results if
|
||||||
|
everything is byte-aligned and the piece's last byte belongs to the
|
||||||
|
given value.
|
||||||
|
|
||||||
|
* After recalculating the bit offset into the register, the number of
|
||||||
|
bytes to be copied from the register is not recalculated. Of course
|
||||||
|
this does not matter if everything (particularly the piece size) is
|
||||||
|
byte-aligned.
|
||||||
|
|
||||||
|
These issues are fixed. The size calculation is performed with a new
|
||||||
|
helper function bits_to_bytes().
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* dwarf2loc.c (bits_to_bytes): New function.
|
||||||
|
(read_pieced_value): Fix offset calculations for register pieces
|
||||||
|
on big-endian targets.
|
||||||
|
(write_pieced_value): Likewise.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
* gdb.dwarf2/var-access.exp: Add test for non-byte-aligned
|
||||||
|
register pieces.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,12 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * dwarf2loc.c (bits_to_bytes): New function.
|
||||||
|
+ (read_pieced_value): Fix offset calculations for register pieces
|
||||||
|
+ on big-endian targets.
|
||||||
|
+ (write_pieced_value): Likewise.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* dwarf2loc.c (read_pieced_value): Remove buffer_size variable.
|
||||||
|
(write_pieced_value): Likewise.
|
||||||
|
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -1752,6 +1752,15 @@ copy_bitwise_tests (void)
|
||||||
|
|
||||||
|
#endif /* GDB_SELF_TEST */
|
||||||
|
|
||||||
|
+/* Return the number of bytes overlapping a contiguous chunk of N_BITS
|
||||||
|
+ bits whose first bit is located at bit offset START. */
|
||||||
|
+
|
||||||
|
+static size_t
|
||||||
|
+bits_to_bytes (ULONGEST start, ULONGEST n_bits)
|
||||||
|
+{
|
||||||
|
+ return (start % 8 + n_bits + 7) / 8;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
read_pieced_value (struct value *v)
|
||||||
|
{
|
||||||
|
@@ -1804,7 +1813,7 @@ read_pieced_value (struct value *v)
|
||||||
|
if (this_size_bits > max_offset - offset)
|
||||||
|
this_size_bits = max_offset - offset;
|
||||||
|
|
||||||
|
- this_size = (this_size_bits + source_offset_bits % 8 + 7) / 8;
|
||||||
|
+ this_size = bits_to_bytes (source_offset_bits, this_size_bits);
|
||||||
|
buffer.reserve (this_size);
|
||||||
|
source_offset = source_offset_bits / 8;
|
||||||
|
intermediate_buffer = buffer.data ();
|
||||||
|
@@ -1817,20 +1826,20 @@ read_pieced_value (struct value *v)
|
||||||
|
struct frame_info *frame = frame_find_by_id (c->frame_id);
|
||||||
|
struct gdbarch *arch = get_frame_arch (frame);
|
||||||
|
int gdb_regnum = dwarf_reg_to_regnum_or_error (arch, p->v.regno);
|
||||||
|
+ ULONGEST reg_bits = 8 * register_size (arch, gdb_regnum);
|
||||||
|
int optim, unavail;
|
||||||
|
- LONGEST reg_offset = source_offset;
|
||||||
|
|
||||||
|
if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
|
||||||
|
- && this_size < register_size (arch, gdb_regnum))
|
||||||
|
+ && p->size < reg_bits)
|
||||||
|
{
|
||||||
|
/* Big-endian, and we want less than full size. */
|
||||||
|
- reg_offset = register_size (arch, gdb_regnum) - this_size;
|
||||||
|
- /* We want the lower-order THIS_SIZE_BITS of the bytes
|
||||||
|
- we extract from the register. */
|
||||||
|
- source_offset_bits += 8 * this_size - this_size_bits;
|
||||||
|
+ source_offset_bits += reg_bits - p->size;
|
||||||
|
}
|
||||||
|
+ this_size = bits_to_bytes (source_offset_bits, this_size_bits);
|
||||||
|
+ buffer.reserve (this_size);
|
||||||
|
|
||||||
|
- if (!get_frame_register_bytes (frame, gdb_regnum, reg_offset,
|
||||||
|
+ if (!get_frame_register_bytes (frame, gdb_regnum,
|
||||||
|
+ source_offset_bits / 8,
|
||||||
|
this_size, buffer.data (),
|
||||||
|
&optim, &unavail))
|
||||||
|
{
|
||||||
|
@@ -1844,7 +1853,7 @@ read_pieced_value (struct value *v)
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_bitwise (contents, dest_offset_bits,
|
||||||
|
- intermediate_buffer, source_offset_bits % 8,
|
||||||
|
+ buffer.data (), source_offset_bits % 8,
|
||||||
|
this_size_bits, bits_big_endian);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
@@ -1969,7 +1978,7 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
if (this_size_bits > max_offset - offset)
|
||||||
|
this_size_bits = max_offset - offset;
|
||||||
|
|
||||||
|
- this_size = (this_size_bits + dest_offset_bits % 8 + 7) / 8;
|
||||||
|
+ this_size = bits_to_bytes (dest_offset_bits, this_size_bits);
|
||||||
|
source_offset = source_offset_bits / 8;
|
||||||
|
dest_offset = dest_offset_bits / 8;
|
||||||
|
|
||||||
|
@@ -1994,20 +2003,25 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
struct frame_info *frame = frame_find_by_id (c->frame_id);
|
||||||
|
struct gdbarch *arch = get_frame_arch (frame);
|
||||||
|
int gdb_regnum = dwarf_reg_to_regnum_or_error (arch, p->v.regno);
|
||||||
|
- int reg_offset = dest_offset;
|
||||||
|
+ ULONGEST reg_bits = 8 * register_size (arch, gdb_regnum);
|
||||||
|
|
||||||
|
if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
|
||||||
|
- && this_size <= register_size (arch, gdb_regnum))
|
||||||
|
+ && p->size <= reg_bits)
|
||||||
|
{
|
||||||
|
/* Big-endian, and we want less than full size. */
|
||||||
|
- reg_offset = register_size (arch, gdb_regnum) - this_size;
|
||||||
|
+ dest_offset_bits += reg_bits - p->size;
|
||||||
|
}
|
||||||
|
+ this_size = bits_to_bytes (dest_offset_bits, this_size_bits);
|
||||||
|
+ buffer.reserve (this_size);
|
||||||
|
|
||||||
|
- if (need_bitwise)
|
||||||
|
+ if (dest_offset_bits % 8 != 0 || this_size_bits % 8 != 0)
|
||||||
|
{
|
||||||
|
+ /* Data is copied non-byte-aligned into the register.
|
||||||
|
+ Need some bits from original register value. */
|
||||||
|
int optim, unavail;
|
||||||
|
|
||||||
|
- if (!get_frame_register_bytes (frame, gdb_regnum, reg_offset,
|
||||||
|
+ if (!get_frame_register_bytes (frame, gdb_regnum,
|
||||||
|
+ dest_offset_bits / 8,
|
||||||
|
this_size, buffer.data (),
|
||||||
|
&optim, &unavail))
|
||||||
|
{
|
||||||
|
@@ -2022,14 +2036,14 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
"bitfield; containing word "
|
||||||
|
"is unavailable"));
|
||||||
|
}
|
||||||
|
- copy_bitwise (buffer.data (), dest_offset_bits,
|
||||||
|
- contents, source_offset_bits,
|
||||||
|
- this_size_bits,
|
||||||
|
- bits_big_endian);
|
||||||
|
}
|
||||||
|
|
||||||
|
- put_frame_register_bytes (frame, gdb_regnum, reg_offset,
|
||||||
|
- this_size, source_buffer);
|
||||||
|
+ copy_bitwise (buffer.data (), dest_offset_bits % 8,
|
||||||
|
+ contents, source_offset_bits,
|
||||||
|
+ this_size_bits, bits_big_endian);
|
||||||
|
+ put_frame_register_bytes (frame, gdb_regnum,
|
||||||
|
+ dest_offset_bits / 8,
|
||||||
|
+ this_size, buffer.data ());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DWARF_VALUE_MEMORY:
|
||||||
|
### a/gdb/testsuite/ChangeLog
|
||||||
|
### b/gdb/testsuite/ChangeLog
|
||||||
|
## -1,5 +1,10 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * gdb.dwarf2/var-access.exp: Add test for non-byte-aligned
|
||||||
|
+ register pieces.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* gdb.dwarf2/var-access.exp: Add tests for accessing bit-fields
|
||||||
|
located in one or more DWARF pieces.
|
||||||
|
|
||||||
|
--- a/gdb/testsuite/gdb.dwarf2/var-access.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.dwarf2/var-access.exp
|
||||||
|
@@ -215,6 +215,19 @@ Dwarf::assemble $asm_file {
|
||||||
|
piece 1
|
||||||
|
} SPECIAL_expr}
|
||||||
|
}
|
||||||
|
+ # Register pieces for bitfield access: 4 bytes optimized
|
||||||
|
+ # out, 3 bytes from r0, and 1 byte from r1.
|
||||||
|
+ DW_TAG_variable {
|
||||||
|
+ {name "t2"}
|
||||||
|
+ {type :$struct_t_label}
|
||||||
|
+ {location {
|
||||||
|
+ piece 4
|
||||||
|
+ regx [lindex $dwarf_regnum 0]
|
||||||
|
+ piece 3
|
||||||
|
+ regx [lindex $dwarf_regnum 1]
|
||||||
|
+ piece 1
|
||||||
|
+ } SPECIAL_expr}
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -279,3 +292,15 @@ switch $endian {
|
||||||
|
# val
|
||||||
|
gdb_test "print/x a" " = \\{0x0, ${val}, 0x0, 0x0\\}" \
|
||||||
|
"verify st1 through a"
|
||||||
|
+
|
||||||
|
+switch $endian { big {set val 0x7ffc} little {set val 0x3ffe00} }
|
||||||
|
+gdb_test_no_output "set var \$[lindex $regname 0] = $val" \
|
||||||
|
+ "init t2, first piece"
|
||||||
|
+gdb_test_no_output "set var \$[lindex $regname 1] = 0" \
|
||||||
|
+ "init t2, second piece"
|
||||||
|
+gdb_test "print/d t2" " = \\{u = <optimized out>, x = 0, y = -1, z = 0\\}" \
|
||||||
|
+ "initialized t2 from regs"
|
||||||
|
+gdb_test_no_output "set var t2.y = 2641"
|
||||||
|
+gdb_test_no_output "set var t2.z = -400"
|
||||||
|
+gdb_test_no_output "set var t2.x = 200"
|
||||||
|
+gdb_test "print t2.x + t2.y + t2.z" " = 2441"
|
220
gdb-rhbz1420304-s390x-22of35.patch
Normal file
220
gdb-rhbz1420304-s390x-22of35.patch
Normal file
@ -0,0 +1,220 @@
|
|||||||
|
commit 242d31ab7c3901e02bd68c1824d1d3610e02562b
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:30 2017 +0200
|
||||||
|
|
||||||
|
read/write_pieced_value: Improve logic for buffer allocation
|
||||||
|
|
||||||
|
So far the main loop in read_pieced_value and write_pieced_value is
|
||||||
|
structured like this:
|
||||||
|
|
||||||
|
(1) Prepare a buffer and some variables we may need;
|
||||||
|
|
||||||
|
(2) depending on the DWARF piece type to be handled, use the buffer and
|
||||||
|
the prepared variables, ignore them, or even recalculate them.
|
||||||
|
|
||||||
|
This approach reduces readability and may also lead to unnecessary copying
|
||||||
|
of data. This patch moves the preparations to the places where sufficient
|
||||||
|
information is available and removes some of the variables involved.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* dwarf2loc.c (read_pieced_value): Move the buffer allocation and
|
||||||
|
some other preparations to the places where sufficient information
|
||||||
|
is available.
|
||||||
|
(write_pieced_value): Likewise.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,12 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * dwarf2loc.c (read_pieced_value): Move the buffer allocation and
|
||||||
|
+ some other preparations to the places where sufficient information
|
||||||
|
+ is available.
|
||||||
|
+ (write_pieced_value): Likewise.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* dwarf2loc.c (bits_to_bytes): New function.
|
||||||
|
(read_pieced_value): Fix offset calculations for register pieces
|
||||||
|
on big-endian targets.
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -1794,8 +1794,7 @@ read_pieced_value (struct value *v)
|
||||||
|
{
|
||||||
|
struct dwarf_expr_piece *p = &c->pieces[i];
|
||||||
|
size_t this_size, this_size_bits;
|
||||||
|
- long dest_offset_bits, source_offset_bits, source_offset;
|
||||||
|
- const gdb_byte *intermediate_buffer;
|
||||||
|
+ long dest_offset_bits, source_offset_bits;
|
||||||
|
|
||||||
|
/* Compute size, source, and destination offsets for copying, in
|
||||||
|
bits. */
|
||||||
|
@@ -1813,11 +1812,6 @@ read_pieced_value (struct value *v)
|
||||||
|
if (this_size_bits > max_offset - offset)
|
||||||
|
this_size_bits = max_offset - offset;
|
||||||
|
|
||||||
|
- this_size = bits_to_bytes (source_offset_bits, this_size_bits);
|
||||||
|
- buffer.reserve (this_size);
|
||||||
|
- source_offset = source_offset_bits / 8;
|
||||||
|
- intermediate_buffer = buffer.data ();
|
||||||
|
-
|
||||||
|
/* Copy from the source to DEST_BUFFER. */
|
||||||
|
switch (p->location)
|
||||||
|
{
|
||||||
|
@@ -1843,13 +1837,11 @@ read_pieced_value (struct value *v)
|
||||||
|
this_size, buffer.data (),
|
||||||
|
&optim, &unavail))
|
||||||
|
{
|
||||||
|
- /* Just so garbage doesn't ever shine through. */
|
||||||
|
- memset (buffer.data (), 0, this_size);
|
||||||
|
-
|
||||||
|
if (optim)
|
||||||
|
mark_value_bits_optimized_out (v, offset, this_size_bits);
|
||||||
|
if (unavail)
|
||||||
|
mark_value_bits_unavailable (v, offset, this_size_bits);
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_bitwise (contents, dest_offset_bits,
|
||||||
|
@@ -1859,12 +1851,15 @@ read_pieced_value (struct value *v)
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DWARF_VALUE_MEMORY:
|
||||||
|
+ this_size = bits_to_bytes (source_offset_bits, this_size_bits);
|
||||||
|
+ buffer.reserve (this_size);
|
||||||
|
+
|
||||||
|
read_value_memory (v, offset,
|
||||||
|
p->v.mem.in_stack_memory,
|
||||||
|
- p->v.mem.addr + source_offset,
|
||||||
|
+ p->v.mem.addr + source_offset_bits / 8,
|
||||||
|
buffer.data (), this_size);
|
||||||
|
copy_bitwise (contents, dest_offset_bits,
|
||||||
|
- intermediate_buffer, source_offset_bits % 8,
|
||||||
|
+ buffer.data (), source_offset_bits % 8,
|
||||||
|
this_size_bits, bits_big_endian);
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -1892,18 +1887,18 @@ read_pieced_value (struct value *v)
|
||||||
|
|
||||||
|
case DWARF_VALUE_LITERAL:
|
||||||
|
{
|
||||||
|
- size_t n = this_size;
|
||||||
|
+ ULONGEST literal_size_bits = 8 * p->v.literal.length;
|
||||||
|
+ size_t n = this_size_bits;
|
||||||
|
|
||||||
|
- if (n > p->v.literal.length - source_offset)
|
||||||
|
- n = (p->v.literal.length >= source_offset
|
||||||
|
- ? p->v.literal.length - source_offset
|
||||||
|
- : 0);
|
||||||
|
- if (n != 0)
|
||||||
|
- intermediate_buffer = p->v.literal.data + source_offset;
|
||||||
|
+ /* Cut off at the end of the implicit value. */
|
||||||
|
+ if (source_offset_bits >= literal_size_bits)
|
||||||
|
+ break;
|
||||||
|
+ if (n > literal_size_bits - source_offset_bits)
|
||||||
|
+ n = literal_size_bits - source_offset_bits;
|
||||||
|
|
||||||
|
copy_bitwise (contents, dest_offset_bits,
|
||||||
|
- intermediate_buffer, source_offset_bits % 8,
|
||||||
|
- this_size_bits, bits_big_endian);
|
||||||
|
+ p->v.literal.data, source_offset_bits,
|
||||||
|
+ n, bits_big_endian);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -1960,9 +1955,7 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
{
|
||||||
|
struct dwarf_expr_piece *p = &c->pieces[i];
|
||||||
|
size_t this_size_bits, this_size;
|
||||||
|
- long dest_offset_bits, source_offset_bits, dest_offset, source_offset;
|
||||||
|
- int need_bitwise;
|
||||||
|
- const gdb_byte *source_buffer;
|
||||||
|
+ long dest_offset_bits, source_offset_bits;
|
||||||
|
|
||||||
|
this_size_bits = p->size;
|
||||||
|
if (bits_to_skip > 0 && bits_to_skip >= this_size_bits)
|
||||||
|
@@ -1978,24 +1971,6 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
if (this_size_bits > max_offset - offset)
|
||||||
|
this_size_bits = max_offset - offset;
|
||||||
|
|
||||||
|
- this_size = bits_to_bytes (dest_offset_bits, this_size_bits);
|
||||||
|
- source_offset = source_offset_bits / 8;
|
||||||
|
- dest_offset = dest_offset_bits / 8;
|
||||||
|
-
|
||||||
|
- /* Check whether the data can be transferred byte-wise. */
|
||||||
|
- if (dest_offset_bits % 8 == 0 && source_offset_bits % 8 == 0
|
||||||
|
- && this_size_bits % 8 == 0)
|
||||||
|
- {
|
||||||
|
- source_buffer = contents + source_offset;
|
||||||
|
- need_bitwise = 0;
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- buffer.reserve (this_size);
|
||||||
|
- source_buffer = buffer.data ();
|
||||||
|
- need_bitwise = 1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
switch (p->location)
|
||||||
|
{
|
||||||
|
case DWARF_VALUE_REGISTER:
|
||||||
|
@@ -2047,21 +2022,44 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DWARF_VALUE_MEMORY:
|
||||||
|
- if (need_bitwise)
|
||||||
|
- {
|
||||||
|
- /* Only the first and last bytes can possibly have any
|
||||||
|
- bits reused. */
|
||||||
|
- read_memory (p->v.mem.addr + dest_offset, buffer.data (), 1);
|
||||||
|
- read_memory (p->v.mem.addr + dest_offset + this_size - 1,
|
||||||
|
- &buffer[this_size - 1], 1);
|
||||||
|
- copy_bitwise (buffer.data (), dest_offset_bits % 8,
|
||||||
|
- contents, source_offset_bits,
|
||||||
|
- this_size_bits,
|
||||||
|
- bits_big_endian);
|
||||||
|
- }
|
||||||
|
+ {
|
||||||
|
+ CORE_ADDR start_addr = p->v.mem.addr + dest_offset_bits / 8;
|
||||||
|
+
|
||||||
|
+ if (dest_offset_bits % 8 == 0 && this_size_bits % 8 == 0
|
||||||
|
+ && source_offset_bits % 8 == 0)
|
||||||
|
+ {
|
||||||
|
+ /* Everything is byte-aligned; no buffer needed. */
|
||||||
|
+ write_memory (start_addr,
|
||||||
|
+ contents + source_offset_bits / 8,
|
||||||
|
+ this_size_bits / 8);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ this_size = bits_to_bytes (dest_offset_bits, this_size_bits);
|
||||||
|
+ buffer.reserve (this_size);
|
||||||
|
|
||||||
|
- write_memory (p->v.mem.addr + dest_offset,
|
||||||
|
- source_buffer, this_size);
|
||||||
|
+ if (dest_offset_bits % 8 != 0 || this_size_bits % 8 != 0)
|
||||||
|
+ {
|
||||||
|
+ if (this_size <= 8)
|
||||||
|
+ {
|
||||||
|
+ /* Perform a single read for small sizes. */
|
||||||
|
+ read_memory (start_addr, buffer.data (), this_size);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ /* Only the first and last bytes can possibly have any
|
||||||
|
+ bits reused. */
|
||||||
|
+ read_memory (start_addr, buffer.data (), 1);
|
||||||
|
+ read_memory (start_addr + this_size - 1,
|
||||||
|
+ &buffer[this_size - 1], 1);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ copy_bitwise (buffer.data (), dest_offset_bits % 8,
|
||||||
|
+ contents, source_offset_bits,
|
||||||
|
+ this_size_bits, bits_big_endian);
|
||||||
|
+ write_memory (start_addr, buffer.data (), this_size);
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mark_value_bytes_optimized_out (to, 0, TYPE_LENGTH (value_type (to)));
|
167
gdb-rhbz1420304-s390x-23of35.patch
Normal file
167
gdb-rhbz1420304-s390x-23of35.patch
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
commit 65d84b76164dc8ec1a1f0f0e0fd41667065ffd4e
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:31 2017 +0200
|
||||||
|
|
||||||
|
Respect piece offset for DW_OP_bit_piece
|
||||||
|
|
||||||
|
So far GDB ignores the piece offset of all kinds of DWARF bit
|
||||||
|
pieces (DW_OP_bit_piece) and treats such pieces as if the offset was zero.
|
||||||
|
|
||||||
|
This is fixed, and an appropriate test is added.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* dwarf2loc.c (read_pieced_value): Respect the piece offset, as
|
||||||
|
given by DW_OP_bit_piece.
|
||||||
|
(write_pieced_value): Likewise.
|
||||||
|
|
||||||
|
Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* gdb.dwarf2/var-access.exp: Add test for composite location with
|
||||||
|
nonzero piece offsets.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,11 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * dwarf2loc.c (read_pieced_value): Respect the piece offset, as
|
||||||
|
+ given by DW_OP_bit_piece.
|
||||||
|
+ (write_pieced_value): Likewise.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* dwarf2loc.c (read_pieced_value): Move the buffer allocation and
|
||||||
|
some other preparations to the places where sufficient information
|
||||||
|
is available.
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -1824,11 +1824,14 @@ read_pieced_value (struct value *v)
|
||||||
|
int optim, unavail;
|
||||||
|
|
||||||
|
if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
|
||||||
|
- && p->size < reg_bits)
|
||||||
|
+ && p->offset + p->size < reg_bits)
|
||||||
|
{
|
||||||
|
/* Big-endian, and we want less than full size. */
|
||||||
|
- source_offset_bits += reg_bits - p->size;
|
||||||
|
+ source_offset_bits += reg_bits - (p->offset + p->size);
|
||||||
|
}
|
||||||
|
+ else
|
||||||
|
+ source_offset_bits += p->offset;
|
||||||
|
+
|
||||||
|
this_size = bits_to_bytes (source_offset_bits, this_size_bits);
|
||||||
|
buffer.reserve (this_size);
|
||||||
|
|
||||||
|
@@ -1851,6 +1854,7 @@ read_pieced_value (struct value *v)
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DWARF_VALUE_MEMORY:
|
||||||
|
+ source_offset_bits += p->offset;
|
||||||
|
this_size = bits_to_bytes (source_offset_bits, this_size_bits);
|
||||||
|
buffer.reserve (this_size);
|
||||||
|
|
||||||
|
@@ -1871,12 +1875,15 @@ read_pieced_value (struct value *v)
|
||||||
|
= 8 * TYPE_LENGTH (value_type (p->v.value));
|
||||||
|
|
||||||
|
/* Use zeroes if piece reaches beyond stack value. */
|
||||||
|
- if (p->size > stack_value_size_bits)
|
||||||
|
+ if (p->offset + p->size > stack_value_size_bits)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Piece is anchored at least significant bit end. */
|
||||||
|
if (gdbarch_byte_order (objfile_gdbarch) == BFD_ENDIAN_BIG)
|
||||||
|
- source_offset_bits += stack_value_size_bits - p->size;
|
||||||
|
+ source_offset_bits += (stack_value_size_bits
|
||||||
|
+ - p->offset - p->size);
|
||||||
|
+ else
|
||||||
|
+ source_offset_bits += p->offset;
|
||||||
|
|
||||||
|
copy_bitwise (contents, dest_offset_bits,
|
||||||
|
value_contents_all (p->v.value),
|
||||||
|
@@ -1891,6 +1898,7 @@ read_pieced_value (struct value *v)
|
||||||
|
size_t n = this_size_bits;
|
||||||
|
|
||||||
|
/* Cut off at the end of the implicit value. */
|
||||||
|
+ source_offset_bits += p->offset;
|
||||||
|
if (source_offset_bits >= literal_size_bits)
|
||||||
|
break;
|
||||||
|
if (n > literal_size_bits - source_offset_bits)
|
||||||
|
@@ -1981,11 +1989,14 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
ULONGEST reg_bits = 8 * register_size (arch, gdb_regnum);
|
||||||
|
|
||||||
|
if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
|
||||||
|
- && p->size <= reg_bits)
|
||||||
|
+ && p->offset + p->size < reg_bits)
|
||||||
|
{
|
||||||
|
/* Big-endian, and we want less than full size. */
|
||||||
|
- dest_offset_bits += reg_bits - p->size;
|
||||||
|
+ dest_offset_bits += reg_bits - (p->offset + p->size);
|
||||||
|
}
|
||||||
|
+ else
|
||||||
|
+ dest_offset_bits += p->offset;
|
||||||
|
+
|
||||||
|
this_size = bits_to_bytes (dest_offset_bits, this_size_bits);
|
||||||
|
buffer.reserve (this_size);
|
||||||
|
|
||||||
|
@@ -2023,6 +2034,8 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
break;
|
||||||
|
case DWARF_VALUE_MEMORY:
|
||||||
|
{
|
||||||
|
+ dest_offset_bits += p->offset;
|
||||||
|
+
|
||||||
|
CORE_ADDR start_addr = p->v.mem.addr + dest_offset_bits / 8;
|
||||||
|
|
||||||
|
if (dest_offset_bits % 8 == 0 && this_size_bits % 8 == 0
|
||||||
|
--- a/gdb/testsuite/gdb.dwarf2/var-access.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.dwarf2/var-access.exp
|
||||||
|
@@ -228,6 +228,24 @@ Dwarf::assemble $asm_file {
|
||||||
|
piece 1
|
||||||
|
} SPECIAL_expr}
|
||||||
|
}
|
||||||
|
+ # One piece per bitfield, using piece offsets: 32 bits of
|
||||||
|
+ # an implicit value, 9 bits of a stack value, 13 bits of
|
||||||
|
+ # r0, and 10 bits of buf.
|
||||||
|
+ DW_TAG_variable {
|
||||||
|
+ {name "t3"}
|
||||||
|
+ {type :$struct_t_label}
|
||||||
|
+ {location {
|
||||||
|
+ implicit_value 0x12 0x34 0x56 0x78 0x9a
|
||||||
|
+ bit_piece 32 4
|
||||||
|
+ const2s -280
|
||||||
|
+ stack_value
|
||||||
|
+ bit_piece 9 2
|
||||||
|
+ regx [lindex $dwarf_regnum 0]
|
||||||
|
+ bit_piece 13 14
|
||||||
|
+ addr $buf_var
|
||||||
|
+ bit_piece 10 42
|
||||||
|
+ } SPECIAL_expr}
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -304,3 +322,24 @@ gdb_test_no_output "set var t2.y = 2641"
|
||||||
|
gdb_test_no_output "set var t2.z = -400"
|
||||||
|
gdb_test_no_output "set var t2.x = 200"
|
||||||
|
gdb_test "print t2.x + t2.y + t2.z" " = 2441"
|
||||||
|
+
|
||||||
|
+# Bitfield access through pieces with nonzero piece offsets.
|
||||||
|
+gdb_test_no_output "set var \$[lindex $regname 0] = 0xa8000" \
|
||||||
|
+ "init reg for t3.y"
|
||||||
|
+gdb_test_no_output "set var *(char \[2\] *) (a + 5) = { 70, 82 }" \
|
||||||
|
+ "init mem for t3.z"
|
||||||
|
+switch $endian {
|
||||||
|
+ little {set val "u = -1484430527, x = -70, y = 42, z = 145"}
|
||||||
|
+ big {set val "u = 591751049, x = -70, y = 42, z = 101"}
|
||||||
|
+}
|
||||||
|
+gdb_test "print t3" " = \\{$val\\}" \
|
||||||
|
+ "initialized t3 from reg and mem"
|
||||||
|
+gdb_test_no_output "set var t3.y = -1" \
|
||||||
|
+ "overwrite t3.y"
|
||||||
|
+gdb_test "print/x \$[lindex $regname 0]" " = 0x7ffc000" \
|
||||||
|
+ "verify t3.y through reg"
|
||||||
|
+gdb_test_no_output "set var t3.z = -614" \
|
||||||
|
+ "overwrite t3.z"
|
||||||
|
+switch $endian {big {set val "0x59, 0xa2"} little {set val "0x6a, 0x56"}}
|
||||||
|
+gdb_test "print/x *(char \[2\] *) (a + 5)" " = \\{$val\\}" \
|
||||||
|
+ "verify t3.z through mem"
|
290
gdb-rhbz1420304-s390x-24of35.patch
Normal file
290
gdb-rhbz1420304-s390x-24of35.patch
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
commit f236533e3c6a2693bea879b2a4d24d1229864ac9
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:31 2017 +0200
|
||||||
|
|
||||||
|
read/write_pieced_value: Remove unnecessary variable copies
|
||||||
|
|
||||||
|
In read_pieced_value's main loop, the variables `dest_offset_bits' and
|
||||||
|
`source_offset_bits' are basically just copies of `offset' and
|
||||||
|
`bits_to_skip', respectively. In write_pieced_value the copies are
|
||||||
|
reversed. This is not very helpful when trying to keep the logic between
|
||||||
|
these functions in sync. Since the copies are unnecessary, this patch
|
||||||
|
just removes them.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* dwarf2loc.c (read_pieced_value): Remove unnecessary variables
|
||||||
|
dest_offset_bits and source_offset_bits.
|
||||||
|
(write_pieced_value): Likewise.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,11 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * dwarf2loc.c (read_pieced_value): Remove unnecessary variables
|
||||||
|
+ dest_offset_bits and source_offset_bits.
|
||||||
|
+ (write_pieced_value): Likewise.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* dwarf2loc.c (read_pieced_value): Respect the piece offset, as
|
||||||
|
given by DW_OP_bit_piece.
|
||||||
|
(write_pieced_value): Likewise.
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -1790,25 +1790,16 @@ read_pieced_value (struct value *v)
|
||||||
|
else
|
||||||
|
max_offset = 8 * TYPE_LENGTH (value_type (v));
|
||||||
|
|
||||||
|
- for (i = 0; i < c->n_pieces && offset < max_offset; i++)
|
||||||
|
+ /* Advance to the first non-skipped piece. */
|
||||||
|
+ for (i = 0; i < c->n_pieces && bits_to_skip >= c->pieces[i].size; i++)
|
||||||
|
+ bits_to_skip -= c->pieces[i].size;
|
||||||
|
+
|
||||||
|
+ for (; i < c->n_pieces && offset < max_offset; i++)
|
||||||
|
{
|
||||||
|
struct dwarf_expr_piece *p = &c->pieces[i];
|
||||||
|
size_t this_size, this_size_bits;
|
||||||
|
- long dest_offset_bits, source_offset_bits;
|
||||||
|
-
|
||||||
|
- /* Compute size, source, and destination offsets for copying, in
|
||||||
|
- bits. */
|
||||||
|
- this_size_bits = p->size;
|
||||||
|
- if (bits_to_skip > 0 && bits_to_skip >= this_size_bits)
|
||||||
|
- {
|
||||||
|
- bits_to_skip -= this_size_bits;
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
- source_offset_bits = bits_to_skip;
|
||||||
|
- this_size_bits -= bits_to_skip;
|
||||||
|
- bits_to_skip = 0;
|
||||||
|
- dest_offset_bits = offset;
|
||||||
|
|
||||||
|
+ this_size_bits = p->size - bits_to_skip;
|
||||||
|
if (this_size_bits > max_offset - offset)
|
||||||
|
this_size_bits = max_offset - offset;
|
||||||
|
|
||||||
|
@@ -1827,16 +1818,16 @@ read_pieced_value (struct value *v)
|
||||||
|
&& p->offset + p->size < reg_bits)
|
||||||
|
{
|
||||||
|
/* Big-endian, and we want less than full size. */
|
||||||
|
- source_offset_bits += reg_bits - (p->offset + p->size);
|
||||||
|
+ bits_to_skip += reg_bits - (p->offset + p->size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- source_offset_bits += p->offset;
|
||||||
|
+ bits_to_skip += p->offset;
|
||||||
|
|
||||||
|
- this_size = bits_to_bytes (source_offset_bits, this_size_bits);
|
||||||
|
+ this_size = bits_to_bytes (bits_to_skip, this_size_bits);
|
||||||
|
buffer.reserve (this_size);
|
||||||
|
|
||||||
|
if (!get_frame_register_bytes (frame, gdb_regnum,
|
||||||
|
- source_offset_bits / 8,
|
||||||
|
+ bits_to_skip / 8,
|
||||||
|
this_size, buffer.data (),
|
||||||
|
&optim, &unavail))
|
||||||
|
{
|
||||||
|
@@ -1846,24 +1837,23 @@ read_pieced_value (struct value *v)
|
||||||
|
mark_value_bits_unavailable (v, offset, this_size_bits);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- copy_bitwise (contents, dest_offset_bits,
|
||||||
|
- buffer.data (), source_offset_bits % 8,
|
||||||
|
+ copy_bitwise (contents, offset,
|
||||||
|
+ buffer.data (), bits_to_skip % 8,
|
||||||
|
this_size_bits, bits_big_endian);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DWARF_VALUE_MEMORY:
|
||||||
|
- source_offset_bits += p->offset;
|
||||||
|
- this_size = bits_to_bytes (source_offset_bits, this_size_bits);
|
||||||
|
+ bits_to_skip += p->offset;
|
||||||
|
+ this_size = bits_to_bytes (bits_to_skip, this_size_bits);
|
||||||
|
buffer.reserve (this_size);
|
||||||
|
|
||||||
|
read_value_memory (v, offset,
|
||||||
|
p->v.mem.in_stack_memory,
|
||||||
|
- p->v.mem.addr + source_offset_bits / 8,
|
||||||
|
+ p->v.mem.addr + bits_to_skip / 8,
|
||||||
|
buffer.data (), this_size);
|
||||||
|
- copy_bitwise (contents, dest_offset_bits,
|
||||||
|
- buffer.data (), source_offset_bits % 8,
|
||||||
|
+ copy_bitwise (contents, offset,
|
||||||
|
+ buffer.data (), bits_to_skip % 8,
|
||||||
|
this_size_bits, bits_big_endian);
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -1880,14 +1870,13 @@ read_pieced_value (struct value *v)
|
||||||
|
|
||||||
|
/* Piece is anchored at least significant bit end. */
|
||||||
|
if (gdbarch_byte_order (objfile_gdbarch) == BFD_ENDIAN_BIG)
|
||||||
|
- source_offset_bits += (stack_value_size_bits
|
||||||
|
- - p->offset - p->size);
|
||||||
|
+ bits_to_skip += stack_value_size_bits - p->offset - p->size;
|
||||||
|
else
|
||||||
|
- source_offset_bits += p->offset;
|
||||||
|
+ bits_to_skip += p->offset;
|
||||||
|
|
||||||
|
- copy_bitwise (contents, dest_offset_bits,
|
||||||
|
+ copy_bitwise (contents, offset,
|
||||||
|
value_contents_all (p->v.value),
|
||||||
|
- source_offset_bits,
|
||||||
|
+ bits_to_skip,
|
||||||
|
this_size_bits, bits_big_endian);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
@@ -1898,14 +1887,14 @@ read_pieced_value (struct value *v)
|
||||||
|
size_t n = this_size_bits;
|
||||||
|
|
||||||
|
/* Cut off at the end of the implicit value. */
|
||||||
|
- source_offset_bits += p->offset;
|
||||||
|
- if (source_offset_bits >= literal_size_bits)
|
||||||
|
+ bits_to_skip += p->offset;
|
||||||
|
+ if (bits_to_skip >= literal_size_bits)
|
||||||
|
break;
|
||||||
|
- if (n > literal_size_bits - source_offset_bits)
|
||||||
|
- n = literal_size_bits - source_offset_bits;
|
||||||
|
+ if (n > literal_size_bits - bits_to_skip)
|
||||||
|
+ n = literal_size_bits - bits_to_skip;
|
||||||
|
|
||||||
|
- copy_bitwise (contents, dest_offset_bits,
|
||||||
|
- p->v.literal.data, source_offset_bits,
|
||||||
|
+ copy_bitwise (contents, offset,
|
||||||
|
+ p->v.literal.data, bits_to_skip,
|
||||||
|
n, bits_big_endian);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
@@ -1924,6 +1913,7 @@ read_pieced_value (struct value *v)
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += this_size_bits;
|
||||||
|
+ bits_to_skip = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1959,23 +1949,16 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
else
|
||||||
|
max_offset = 8 * TYPE_LENGTH (value_type (to));
|
||||||
|
|
||||||
|
- for (i = 0; i < c->n_pieces && offset < max_offset; i++)
|
||||||
|
+ /* Advance to the first non-skipped piece. */
|
||||||
|
+ for (i = 0; i < c->n_pieces && bits_to_skip >= c->pieces[i].size; i++)
|
||||||
|
+ bits_to_skip -= c->pieces[i].size;
|
||||||
|
+
|
||||||
|
+ for (; i < c->n_pieces && offset < max_offset; i++)
|
||||||
|
{
|
||||||
|
struct dwarf_expr_piece *p = &c->pieces[i];
|
||||||
|
size_t this_size_bits, this_size;
|
||||||
|
- long dest_offset_bits, source_offset_bits;
|
||||||
|
-
|
||||||
|
- this_size_bits = p->size;
|
||||||
|
- if (bits_to_skip > 0 && bits_to_skip >= this_size_bits)
|
||||||
|
- {
|
||||||
|
- bits_to_skip -= this_size_bits;
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
- dest_offset_bits = bits_to_skip;
|
||||||
|
- this_size_bits -= bits_to_skip;
|
||||||
|
- bits_to_skip = 0;
|
||||||
|
- source_offset_bits = offset;
|
||||||
|
|
||||||
|
+ this_size_bits = p->size - bits_to_skip;
|
||||||
|
if (this_size_bits > max_offset - offset)
|
||||||
|
this_size_bits = max_offset - offset;
|
||||||
|
|
||||||
|
@@ -1992,22 +1975,22 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
&& p->offset + p->size < reg_bits)
|
||||||
|
{
|
||||||
|
/* Big-endian, and we want less than full size. */
|
||||||
|
- dest_offset_bits += reg_bits - (p->offset + p->size);
|
||||||
|
+ bits_to_skip += reg_bits - (p->offset + p->size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- dest_offset_bits += p->offset;
|
||||||
|
+ bits_to_skip += p->offset;
|
||||||
|
|
||||||
|
- this_size = bits_to_bytes (dest_offset_bits, this_size_bits);
|
||||||
|
+ this_size = bits_to_bytes (bits_to_skip, this_size_bits);
|
||||||
|
buffer.reserve (this_size);
|
||||||
|
|
||||||
|
- if (dest_offset_bits % 8 != 0 || this_size_bits % 8 != 0)
|
||||||
|
+ if (bits_to_skip % 8 != 0 || this_size_bits % 8 != 0)
|
||||||
|
{
|
||||||
|
/* Data is copied non-byte-aligned into the register.
|
||||||
|
Need some bits from original register value. */
|
||||||
|
int optim, unavail;
|
||||||
|
|
||||||
|
if (!get_frame_register_bytes (frame, gdb_regnum,
|
||||||
|
- dest_offset_bits / 8,
|
||||||
|
+ bits_to_skip / 8,
|
||||||
|
this_size, buffer.data (),
|
||||||
|
&optim, &unavail))
|
||||||
|
{
|
||||||
|
@@ -2024,34 +2007,34 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- copy_bitwise (buffer.data (), dest_offset_bits % 8,
|
||||||
|
- contents, source_offset_bits,
|
||||||
|
+ copy_bitwise (buffer.data (), bits_to_skip % 8,
|
||||||
|
+ contents, offset,
|
||||||
|
this_size_bits, bits_big_endian);
|
||||||
|
put_frame_register_bytes (frame, gdb_regnum,
|
||||||
|
- dest_offset_bits / 8,
|
||||||
|
+ bits_to_skip / 8,
|
||||||
|
this_size, buffer.data ());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DWARF_VALUE_MEMORY:
|
||||||
|
{
|
||||||
|
- dest_offset_bits += p->offset;
|
||||||
|
+ bits_to_skip += p->offset;
|
||||||
|
|
||||||
|
- CORE_ADDR start_addr = p->v.mem.addr + dest_offset_bits / 8;
|
||||||
|
+ CORE_ADDR start_addr = p->v.mem.addr + bits_to_skip / 8;
|
||||||
|
|
||||||
|
- if (dest_offset_bits % 8 == 0 && this_size_bits % 8 == 0
|
||||||
|
- && source_offset_bits % 8 == 0)
|
||||||
|
+ if (bits_to_skip % 8 == 0 && this_size_bits % 8 == 0
|
||||||
|
+ && offset % 8 == 0)
|
||||||
|
{
|
||||||
|
/* Everything is byte-aligned; no buffer needed. */
|
||||||
|
write_memory (start_addr,
|
||||||
|
- contents + source_offset_bits / 8,
|
||||||
|
+ contents + offset / 8,
|
||||||
|
this_size_bits / 8);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- this_size = bits_to_bytes (dest_offset_bits, this_size_bits);
|
||||||
|
+ this_size = bits_to_bytes (bits_to_skip, this_size_bits);
|
||||||
|
buffer.reserve (this_size);
|
||||||
|
|
||||||
|
- if (dest_offset_bits % 8 != 0 || this_size_bits % 8 != 0)
|
||||||
|
+ if (bits_to_skip % 8 != 0 || this_size_bits % 8 != 0)
|
||||||
|
{
|
||||||
|
if (this_size <= 8)
|
||||||
|
{
|
||||||
|
@@ -2068,8 +2051,8 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- copy_bitwise (buffer.data (), dest_offset_bits % 8,
|
||||||
|
- contents, source_offset_bits,
|
||||||
|
+ copy_bitwise (buffer.data (), bits_to_skip % 8,
|
||||||
|
+ contents, offset,
|
||||||
|
this_size_bits, bits_big_endian);
|
||||||
|
write_memory (start_addr, buffer.data (), this_size);
|
||||||
|
}
|
||||||
|
@@ -2079,6 +2062,7 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
offset += this_size_bits;
|
||||||
|
+ bits_to_skip = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
76
gdb-rhbz1420304-s390x-25of35.patch
Normal file
76
gdb-rhbz1420304-s390x-25of35.patch
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
commit 23f945bf8cebf348154aff43782de2e1977e9230
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:31 2017 +0200
|
||||||
|
|
||||||
|
Fix bit-/byte-offset mismatch in parameter to read_value_memory
|
||||||
|
|
||||||
|
The function read_value_memory accepts a parameter embedded_offset and
|
||||||
|
expects it to represent the byte offset into the given value. However,
|
||||||
|
the only invocation with a possibly non-zero embedded_offset happens in
|
||||||
|
read_pieced_value, where a bit offset is passed instead.
|
||||||
|
|
||||||
|
Adjust the implementation of read_value_memory to meet the caller's
|
||||||
|
expectation. This implicitly fixes the invocation in read_pieced_value.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* valops.c (read_value_memory): Change embedded_offset to
|
||||||
|
represent a bit offset instead of a byte offset.
|
||||||
|
* value.h (read_value_memory): Adjust comment.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,11 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * valops.c (read_value_memory): Change embedded_offset to
|
||||||
|
+ represent a bit offset instead of a byte offset.
|
||||||
|
+ * value.h (read_value_memory): Adjust comment.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* dwarf2loc.c (read_pieced_value): Remove unnecessary variables
|
||||||
|
dest_offset_bits and source_offset_bits.
|
||||||
|
(write_pieced_value): Likewise.
|
||||||
|
--- a/gdb/valops.c
|
||||||
|
+++ b/gdb/valops.c
|
||||||
|
@@ -958,7 +958,7 @@ value_at_lazy (struct type *type, CORE_ADDR addr)
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
-read_value_memory (struct value *val, LONGEST embedded_offset,
|
||||||
|
+read_value_memory (struct value *val, LONGEST bit_offset,
|
||||||
|
int stack, CORE_ADDR memaddr,
|
||||||
|
gdb_byte *buffer, size_t length)
|
||||||
|
{
|
||||||
|
@@ -984,8 +984,9 @@ read_value_memory (struct value *val, LONGEST embedded_offset,
|
||||||
|
if (status == TARGET_XFER_OK)
|
||||||
|
/* nothing */;
|
||||||
|
else if (status == TARGET_XFER_UNAVAILABLE)
|
||||||
|
- mark_value_bytes_unavailable (val, embedded_offset + xfered_total,
|
||||||
|
- xfered_partial);
|
||||||
|
+ mark_value_bits_unavailable (val, (xfered_total * HOST_CHAR_BIT
|
||||||
|
+ + bit_offset),
|
||||||
|
+ xfered_partial * HOST_CHAR_BIT);
|
||||||
|
else if (status == TARGET_XFER_EOF)
|
||||||
|
memory_error (TARGET_XFER_E_IO, memaddr + xfered_total);
|
||||||
|
else
|
||||||
|
--- a/gdb/value.h
|
||||||
|
+++ b/gdb/value.h
|
||||||
|
@@ -581,12 +581,11 @@ extern int value_contents_eq (const struct value *val1, LONGEST offset1,
|
||||||
|
|
||||||
|
/* Read LENGTH addressable memory units starting at MEMADDR into BUFFER,
|
||||||
|
which is (or will be copied to) VAL's contents buffer offset by
|
||||||
|
- EMBEDDED_OFFSET (that is, to &VAL->contents[EMBEDDED_OFFSET]).
|
||||||
|
- Marks value contents ranges as unavailable if the corresponding
|
||||||
|
- memory is likewise unavailable. STACK indicates whether the memory
|
||||||
|
- is known to be stack memory. */
|
||||||
|
+ BIT_OFFSET bits. Marks value contents ranges as unavailable if
|
||||||
|
+ the corresponding memory is likewise unavailable. STACK indicates
|
||||||
|
+ whether the memory is known to be stack memory. */
|
||||||
|
|
||||||
|
-extern void read_value_memory (struct value *val, LONGEST embedded_offset,
|
||||||
|
+extern void read_value_memory (struct value *val, LONGEST bit_offset,
|
||||||
|
int stack, CORE_ADDR memaddr,
|
||||||
|
gdb_byte *buffer, size_t length);
|
||||||
|
|
56
gdb-rhbz1420304-s390x-26of35.patch
Normal file
56
gdb-rhbz1420304-s390x-26of35.patch
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
commit f65e204425b5b46a5927d9501c42f25d98a866ce
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:32 2017 +0200
|
||||||
|
|
||||||
|
write_pieced_value: Notify memory_changed observers
|
||||||
|
|
||||||
|
So far write_pieced_value uses write_memory when writing memory pieces to
|
||||||
|
the target. However, this is a case where GDB potentially overwrites a
|
||||||
|
watchpoint value. In such a case write_memory_with_notification should be
|
||||||
|
used instead, so that memory_changed observers get notified.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* dwarf2loc.c (write_pieced_value): When writing the data for a
|
||||||
|
memory piece, use write_memory_with_notification instead of
|
||||||
|
write_memory.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,11 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * dwarf2loc.c (write_pieced_value): When writing the data for a
|
||||||
|
+ memory piece, use write_memory_with_notification instead of
|
||||||
|
+ write_memory.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* valops.c (read_value_memory): Change embedded_offset to
|
||||||
|
represent a bit offset instead of a byte offset.
|
||||||
|
* value.h (read_value_memory): Adjust comment.
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -2025,9 +2025,9 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
&& offset % 8 == 0)
|
||||||
|
{
|
||||||
|
/* Everything is byte-aligned; no buffer needed. */
|
||||||
|
- write_memory (start_addr,
|
||||||
|
- contents + offset / 8,
|
||||||
|
- this_size_bits / 8);
|
||||||
|
+ write_memory_with_notification (start_addr,
|
||||||
|
+ contents + offset / 8,
|
||||||
|
+ this_size_bits / 8);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2054,7 +2054,8 @@ write_pieced_value (struct value *to, struct value *from)
|
||||||
|
copy_bitwise (buffer.data (), bits_to_skip % 8,
|
||||||
|
contents, offset,
|
||||||
|
this_size_bits, bits_big_endian);
|
||||||
|
- write_memory (start_addr, buffer.data (), this_size);
|
||||||
|
+ write_memory_with_notification (start_addr, buffer.data (),
|
||||||
|
+ this_size);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
481
gdb-rhbz1420304-s390x-27of35.patch
Normal file
481
gdb-rhbz1420304-s390x-27of35.patch
Normal file
@ -0,0 +1,481 @@
|
|||||||
|
commit 55acdf2242372ae52abb25c80db8e75df5578b23
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Jun 13 15:20:32 2017 +0200
|
||||||
|
|
||||||
|
read/write_pieced_value: Merge into one function
|
||||||
|
|
||||||
|
Since read_pieced_value and write_pieced_value share significant logic,
|
||||||
|
this patch merges them into a single function rw_pieced_value.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* dwarf2loc.c (rw_pieced_value): New. Merge logic from...
|
||||||
|
(read_pieced_value, write_pieced_value): ...here. Reduce to
|
||||||
|
wrappers that just call rw_pieced_value.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,5 +1,11 @@
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
+ * dwarf2loc.c (rw_pieced_value): New. Merge logic from...
|
||||||
|
+ (read_pieced_value, write_pieced_value): ...here. Reduce to
|
||||||
|
+ wrappers that just call rw_pieced_value.
|
||||||
|
+
|
||||||
|
+2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
* dwarf2loc.c (write_pieced_value): When writing the data for a
|
||||||
|
memory piece, use write_memory_with_notification instead of
|
||||||
|
write_memory.
|
||||||
|
--- a/gdb/dwarf2loc.c
|
||||||
|
+++ b/gdb/dwarf2loc.c
|
||||||
|
@@ -1761,31 +1761,55 @@ bits_to_bytes (ULONGEST start, ULONGEST n_bits)
|
||||||
|
return (start % 8 + n_bits + 7) / 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Read or write a pieced value V. If FROM != NULL, operate in "write
|
||||||
|
+ mode": copy FROM into the pieces comprising V. If FROM == NULL,
|
||||||
|
+ operate in "read mode": fetch the contents of the (lazy) value V by
|
||||||
|
+ composing it from its pieces. */
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
-read_pieced_value (struct value *v)
|
||||||
|
+rw_pieced_value (struct value *v, struct value *from)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
LONGEST offset = 0, max_offset;
|
||||||
|
ULONGEST bits_to_skip;
|
||||||
|
- gdb_byte *contents;
|
||||||
|
+ gdb_byte *v_contents;
|
||||||
|
+ const gdb_byte *from_contents;
|
||||||
|
struct piece_closure *c
|
||||||
|
= (struct piece_closure *) value_computed_closure (v);
|
||||||
|
std::vector<gdb_byte> buffer;
|
||||||
|
int bits_big_endian
|
||||||
|
= gdbarch_bits_big_endian (get_type_arch (value_type (v)));
|
||||||
|
|
||||||
|
- if (value_type (v) != value_enclosing_type (v))
|
||||||
|
- internal_error (__FILE__, __LINE__,
|
||||||
|
- _("Should not be able to create a lazy value with "
|
||||||
|
- "an enclosing type"));
|
||||||
|
+ if (from != NULL)
|
||||||
|
+ {
|
||||||
|
+ from_contents = value_contents (from);
|
||||||
|
+ v_contents = NULL;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ if (value_type (v) != value_enclosing_type (v))
|
||||||
|
+ internal_error (__FILE__, __LINE__,
|
||||||
|
+ _("Should not be able to create a lazy value with "
|
||||||
|
+ "an enclosing type"));
|
||||||
|
+ v_contents = value_contents_raw (v);
|
||||||
|
+ from_contents = NULL;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- contents = value_contents_raw (v);
|
||||||
|
bits_to_skip = 8 * value_offset (v);
|
||||||
|
if (value_bitsize (v))
|
||||||
|
{
|
||||||
|
bits_to_skip += (8 * value_offset (value_parent (v))
|
||||||
|
+ value_bitpos (v));
|
||||||
|
- max_offset = value_bitsize (v);
|
||||||
|
+ if (from != NULL
|
||||||
|
+ && (gdbarch_byte_order (get_type_arch (value_type (from)))
|
||||||
|
+ == BFD_ENDIAN_BIG))
|
||||||
|
+ {
|
||||||
|
+ /* Use the least significant bits of FROM. */
|
||||||
|
+ max_offset = 8 * TYPE_LENGTH (value_type (from));
|
||||||
|
+ offset = max_offset - value_bitsize (v);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ max_offset = value_bitsize (v);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
max_offset = 8 * TYPE_LENGTH (value_type (v));
|
||||||
|
@@ -1797,13 +1821,12 @@ read_pieced_value (struct value *v)
|
||||||
|
for (; i < c->n_pieces && offset < max_offset; i++)
|
||||||
|
{
|
||||||
|
struct dwarf_expr_piece *p = &c->pieces[i];
|
||||||
|
- size_t this_size, this_size_bits;
|
||||||
|
+ size_t this_size_bits, this_size;
|
||||||
|
|
||||||
|
this_size_bits = p->size - bits_to_skip;
|
||||||
|
if (this_size_bits > max_offset - offset)
|
||||||
|
this_size_bits = max_offset - offset;
|
||||||
|
|
||||||
|
- /* Copy from the source to DEST_BUFFER. */
|
||||||
|
switch (p->location)
|
||||||
|
{
|
||||||
|
case DWARF_VALUE_REGISTER:
|
||||||
|
@@ -1826,39 +1849,137 @@ read_pieced_value (struct value *v)
|
||||||
|
this_size = bits_to_bytes (bits_to_skip, this_size_bits);
|
||||||
|
buffer.reserve (this_size);
|
||||||
|
|
||||||
|
- if (!get_frame_register_bytes (frame, gdb_regnum,
|
||||||
|
- bits_to_skip / 8,
|
||||||
|
- this_size, buffer.data (),
|
||||||
|
- &optim, &unavail))
|
||||||
|
+ if (from == NULL)
|
||||||
|
{
|
||||||
|
- if (optim)
|
||||||
|
- mark_value_bits_optimized_out (v, offset, this_size_bits);
|
||||||
|
- if (unavail)
|
||||||
|
- mark_value_bits_unavailable (v, offset, this_size_bits);
|
||||||
|
- break;
|
||||||
|
+ /* Read mode. */
|
||||||
|
+ if (!get_frame_register_bytes (frame, gdb_regnum,
|
||||||
|
+ bits_to_skip / 8,
|
||||||
|
+ this_size, buffer.data (),
|
||||||
|
+ &optim, &unavail))
|
||||||
|
+ {
|
||||||
|
+ if (optim)
|
||||||
|
+ mark_value_bits_optimized_out (v, offset,
|
||||||
|
+ this_size_bits);
|
||||||
|
+ if (unavail)
|
||||||
|
+ mark_value_bits_unavailable (v, offset,
|
||||||
|
+ this_size_bits);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ copy_bitwise (v_contents, offset,
|
||||||
|
+ buffer.data (), bits_to_skip % 8,
|
||||||
|
+ this_size_bits, bits_big_endian);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ /* Write mode. */
|
||||||
|
+ if (bits_to_skip % 8 != 0 || this_size_bits % 8 != 0)
|
||||||
|
+ {
|
||||||
|
+ /* Data is copied non-byte-aligned into the register.
|
||||||
|
+ Need some bits from original register value. */
|
||||||
|
+ get_frame_register_bytes (frame, gdb_regnum,
|
||||||
|
+ bits_to_skip / 8,
|
||||||
|
+ this_size, buffer.data (),
|
||||||
|
+ &optim, &unavail);
|
||||||
|
+ if (optim)
|
||||||
|
+ throw_error (OPTIMIZED_OUT_ERROR,
|
||||||
|
+ _("Can't do read-modify-write to "
|
||||||
|
+ "update bitfield; containing word "
|
||||||
|
+ "has been optimized out"));
|
||||||
|
+ if (unavail)
|
||||||
|
+ throw_error (NOT_AVAILABLE_ERROR,
|
||||||
|
+ _("Can't do read-modify-write to "
|
||||||
|
+ "update bitfield; containing word "
|
||||||
|
+ "is unavailable"));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ copy_bitwise (buffer.data (), bits_to_skip % 8,
|
||||||
|
+ from_contents, offset,
|
||||||
|
+ this_size_bits, bits_big_endian);
|
||||||
|
+ put_frame_register_bytes (frame, gdb_regnum,
|
||||||
|
+ bits_to_skip / 8,
|
||||||
|
+ this_size, buffer.data ());
|
||||||
|
}
|
||||||
|
- copy_bitwise (contents, offset,
|
||||||
|
- buffer.data (), bits_to_skip % 8,
|
||||||
|
- this_size_bits, bits_big_endian);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DWARF_VALUE_MEMORY:
|
||||||
|
- bits_to_skip += p->offset;
|
||||||
|
- this_size = bits_to_bytes (bits_to_skip, this_size_bits);
|
||||||
|
- buffer.reserve (this_size);
|
||||||
|
-
|
||||||
|
- read_value_memory (v, offset,
|
||||||
|
- p->v.mem.in_stack_memory,
|
||||||
|
- p->v.mem.addr + bits_to_skip / 8,
|
||||||
|
- buffer.data (), this_size);
|
||||||
|
- copy_bitwise (contents, offset,
|
||||||
|
- buffer.data (), bits_to_skip % 8,
|
||||||
|
- this_size_bits, bits_big_endian);
|
||||||
|
+ {
|
||||||
|
+ bits_to_skip += p->offset;
|
||||||
|
+
|
||||||
|
+ CORE_ADDR start_addr = p->v.mem.addr + bits_to_skip / 8;
|
||||||
|
+
|
||||||
|
+ if (bits_to_skip % 8 == 0 && this_size_bits % 8 == 0
|
||||||
|
+ && offset % 8 == 0)
|
||||||
|
+ {
|
||||||
|
+ /* Everything is byte-aligned; no buffer needed. */
|
||||||
|
+ if (from != NULL)
|
||||||
|
+ write_memory_with_notification (start_addr,
|
||||||
|
+ (from_contents
|
||||||
|
+ + offset / 8),
|
||||||
|
+ this_size_bits / 8);
|
||||||
|
+ else
|
||||||
|
+ read_value_memory (v, offset,
|
||||||
|
+ p->v.mem.in_stack_memory,
|
||||||
|
+ p->v.mem.addr + bits_to_skip / 8,
|
||||||
|
+ v_contents + offset / 8,
|
||||||
|
+ this_size_bits / 8);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ this_size = bits_to_bytes (bits_to_skip, this_size_bits);
|
||||||
|
+ buffer.reserve (this_size);
|
||||||
|
+
|
||||||
|
+ if (from == NULL)
|
||||||
|
+ {
|
||||||
|
+ /* Read mode. */
|
||||||
|
+ read_value_memory (v, offset,
|
||||||
|
+ p->v.mem.in_stack_memory,
|
||||||
|
+ p->v.mem.addr + bits_to_skip / 8,
|
||||||
|
+ buffer.data (), this_size);
|
||||||
|
+ copy_bitwise (v_contents, offset,
|
||||||
|
+ buffer.data (), bits_to_skip % 8,
|
||||||
|
+ this_size_bits, bits_big_endian);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ /* Write mode. */
|
||||||
|
+ if (bits_to_skip % 8 != 0 || this_size_bits % 8 != 0)
|
||||||
|
+ {
|
||||||
|
+ if (this_size <= 8)
|
||||||
|
+ {
|
||||||
|
+ /* Perform a single read for small sizes. */
|
||||||
|
+ read_memory (start_addr, buffer.data (),
|
||||||
|
+ this_size);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ /* Only the first and last bytes can possibly have
|
||||||
|
+ any bits reused. */
|
||||||
|
+ read_memory (start_addr, buffer.data (), 1);
|
||||||
|
+ read_memory (start_addr + this_size - 1,
|
||||||
|
+ &buffer[this_size - 1], 1);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ copy_bitwise (buffer.data (), bits_to_skip % 8,
|
||||||
|
+ from_contents, offset,
|
||||||
|
+ this_size_bits, bits_big_endian);
|
||||||
|
+ write_memory_with_notification (start_addr,
|
||||||
|
+ buffer.data (),
|
||||||
|
+ this_size);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DWARF_VALUE_STACK:
|
||||||
|
{
|
||||||
|
+ if (from != NULL)
|
||||||
|
+ {
|
||||||
|
+ mark_value_bits_optimized_out (v, offset, this_size_bits);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
struct objfile *objfile = dwarf2_per_cu_objfile (c->per_cu);
|
||||||
|
struct gdbarch *objfile_gdbarch = get_objfile_arch (objfile);
|
||||||
|
ULONGEST stack_value_size_bits
|
||||||
|
@@ -1874,7 +1995,7 @@ read_pieced_value (struct value *v)
|
||||||
|
else
|
||||||
|
bits_to_skip += p->offset;
|
||||||
|
|
||||||
|
- copy_bitwise (contents, offset,
|
||||||
|
+ copy_bitwise (v_contents, offset,
|
||||||
|
value_contents_all (p->v.value),
|
||||||
|
bits_to_skip,
|
||||||
|
this_size_bits, bits_big_endian);
|
||||||
|
@@ -1883,6 +2004,12 @@ read_pieced_value (struct value *v)
|
||||||
|
|
||||||
|
case DWARF_VALUE_LITERAL:
|
||||||
|
{
|
||||||
|
+ if (from != NULL)
|
||||||
|
+ {
|
||||||
|
+ mark_value_bits_optimized_out (v, offset, this_size_bits);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
ULONGEST literal_size_bits = 8 * p->v.literal.length;
|
||||||
|
size_t n = this_size_bits;
|
||||||
|
|
||||||
|
@@ -1893,15 +2020,21 @@ read_pieced_value (struct value *v)
|
||||||
|
if (n > literal_size_bits - bits_to_skip)
|
||||||
|
n = literal_size_bits - bits_to_skip;
|
||||||
|
|
||||||
|
- copy_bitwise (contents, offset,
|
||||||
|
+ copy_bitwise (v_contents, offset,
|
||||||
|
p->v.literal.data, bits_to_skip,
|
||||||
|
n, bits_big_endian);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
- /* These bits show up as zeros -- but do not cause the value
|
||||||
|
- to be considered optimized-out. */
|
||||||
|
case DWARF_VALUE_IMPLICIT_POINTER:
|
||||||
|
+ if (from != NULL)
|
||||||
|
+ {
|
||||||
|
+ mark_value_bits_optimized_out (v, offset, this_size_bits);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* These bits show up as zeros -- but do not cause the value to
|
||||||
|
+ be considered optimized-out. */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DWARF_VALUE_OPTIMIZED_OUT:
|
||||||
|
@@ -1917,154 +2050,17 @@ read_pieced_value (struct value *v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
-write_pieced_value (struct value *to, struct value *from)
|
||||||
|
+read_pieced_value (struct value *v)
|
||||||
|
{
|
||||||
|
- int i;
|
||||||
|
- ULONGEST bits_to_skip;
|
||||||
|
- LONGEST offset = 0, max_offset;
|
||||||
|
- const gdb_byte *contents;
|
||||||
|
- struct piece_closure *c
|
||||||
|
- = (struct piece_closure *) value_computed_closure (to);
|
||||||
|
- std::vector<gdb_byte> buffer;
|
||||||
|
- int bits_big_endian
|
||||||
|
- = gdbarch_bits_big_endian (get_type_arch (value_type (to)));
|
||||||
|
-
|
||||||
|
- contents = value_contents (from);
|
||||||
|
- bits_to_skip = 8 * value_offset (to);
|
||||||
|
- if (value_bitsize (to))
|
||||||
|
- {
|
||||||
|
- bits_to_skip += (8 * value_offset (value_parent (to))
|
||||||
|
- + value_bitpos (to));
|
||||||
|
- /* Use the least significant bits of FROM. */
|
||||||
|
- if (gdbarch_byte_order (get_type_arch (value_type (from)))
|
||||||
|
- == BFD_ENDIAN_BIG)
|
||||||
|
- {
|
||||||
|
- max_offset = 8 * TYPE_LENGTH (value_type (from));
|
||||||
|
- offset = max_offset - value_bitsize (to);
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- max_offset = value_bitsize (to);
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- max_offset = 8 * TYPE_LENGTH (value_type (to));
|
||||||
|
-
|
||||||
|
- /* Advance to the first non-skipped piece. */
|
||||||
|
- for (i = 0; i < c->n_pieces && bits_to_skip >= c->pieces[i].size; i++)
|
||||||
|
- bits_to_skip -= c->pieces[i].size;
|
||||||
|
-
|
||||||
|
- for (; i < c->n_pieces && offset < max_offset; i++)
|
||||||
|
- {
|
||||||
|
- struct dwarf_expr_piece *p = &c->pieces[i];
|
||||||
|
- size_t this_size_bits, this_size;
|
||||||
|
-
|
||||||
|
- this_size_bits = p->size - bits_to_skip;
|
||||||
|
- if (this_size_bits > max_offset - offset)
|
||||||
|
- this_size_bits = max_offset - offset;
|
||||||
|
-
|
||||||
|
- switch (p->location)
|
||||||
|
- {
|
||||||
|
- case DWARF_VALUE_REGISTER:
|
||||||
|
- {
|
||||||
|
- struct frame_info *frame = frame_find_by_id (c->frame_id);
|
||||||
|
- struct gdbarch *arch = get_frame_arch (frame);
|
||||||
|
- int gdb_regnum = dwarf_reg_to_regnum_or_error (arch, p->v.regno);
|
||||||
|
- ULONGEST reg_bits = 8 * register_size (arch, gdb_regnum);
|
||||||
|
-
|
||||||
|
- if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
|
||||||
|
- && p->offset + p->size < reg_bits)
|
||||||
|
- {
|
||||||
|
- /* Big-endian, and we want less than full size. */
|
||||||
|
- bits_to_skip += reg_bits - (p->offset + p->size);
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- bits_to_skip += p->offset;
|
||||||
|
-
|
||||||
|
- this_size = bits_to_bytes (bits_to_skip, this_size_bits);
|
||||||
|
- buffer.reserve (this_size);
|
||||||
|
-
|
||||||
|
- if (bits_to_skip % 8 != 0 || this_size_bits % 8 != 0)
|
||||||
|
- {
|
||||||
|
- /* Data is copied non-byte-aligned into the register.
|
||||||
|
- Need some bits from original register value. */
|
||||||
|
- int optim, unavail;
|
||||||
|
-
|
||||||
|
- if (!get_frame_register_bytes (frame, gdb_regnum,
|
||||||
|
- bits_to_skip / 8,
|
||||||
|
- this_size, buffer.data (),
|
||||||
|
- &optim, &unavail))
|
||||||
|
- {
|
||||||
|
- if (optim)
|
||||||
|
- throw_error (OPTIMIZED_OUT_ERROR,
|
||||||
|
- _("Can't do read-modify-write to "
|
||||||
|
- "update bitfield; containing word "
|
||||||
|
- "has been optimized out"));
|
||||||
|
- if (unavail)
|
||||||
|
- throw_error (NOT_AVAILABLE_ERROR,
|
||||||
|
- _("Can't do read-modify-write to update "
|
||||||
|
- "bitfield; containing word "
|
||||||
|
- "is unavailable"));
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- copy_bitwise (buffer.data (), bits_to_skip % 8,
|
||||||
|
- contents, offset,
|
||||||
|
- this_size_bits, bits_big_endian);
|
||||||
|
- put_frame_register_bytes (frame, gdb_regnum,
|
||||||
|
- bits_to_skip / 8,
|
||||||
|
- this_size, buffer.data ());
|
||||||
|
- }
|
||||||
|
- break;
|
||||||
|
- case DWARF_VALUE_MEMORY:
|
||||||
|
- {
|
||||||
|
- bits_to_skip += p->offset;
|
||||||
|
-
|
||||||
|
- CORE_ADDR start_addr = p->v.mem.addr + bits_to_skip / 8;
|
||||||
|
-
|
||||||
|
- if (bits_to_skip % 8 == 0 && this_size_bits % 8 == 0
|
||||||
|
- && offset % 8 == 0)
|
||||||
|
- {
|
||||||
|
- /* Everything is byte-aligned; no buffer needed. */
|
||||||
|
- write_memory_with_notification (start_addr,
|
||||||
|
- contents + offset / 8,
|
||||||
|
- this_size_bits / 8);
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- this_size = bits_to_bytes (bits_to_skip, this_size_bits);
|
||||||
|
- buffer.reserve (this_size);
|
||||||
|
-
|
||||||
|
- if (bits_to_skip % 8 != 0 || this_size_bits % 8 != 0)
|
||||||
|
- {
|
||||||
|
- if (this_size <= 8)
|
||||||
|
- {
|
||||||
|
- /* Perform a single read for small sizes. */
|
||||||
|
- read_memory (start_addr, buffer.data (), this_size);
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- /* Only the first and last bytes can possibly have any
|
||||||
|
- bits reused. */
|
||||||
|
- read_memory (start_addr, buffer.data (), 1);
|
||||||
|
- read_memory (start_addr + this_size - 1,
|
||||||
|
- &buffer[this_size - 1], 1);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
+ rw_pieced_value (v, NULL);
|
||||||
|
+}
|
||||||
|
|
||||||
|
- copy_bitwise (buffer.data (), bits_to_skip % 8,
|
||||||
|
- contents, offset,
|
||||||
|
- this_size_bits, bits_big_endian);
|
||||||
|
- write_memory_with_notification (start_addr, buffer.data (),
|
||||||
|
- this_size);
|
||||||
|
- }
|
||||||
|
- break;
|
||||||
|
- default:
|
||||||
|
- mark_value_bytes_optimized_out (to, 0, TYPE_LENGTH (value_type (to)));
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- offset += this_size_bits;
|
||||||
|
- bits_to_skip = 0;
|
||||||
|
- }
|
||||||
|
+static void
|
||||||
|
+write_pieced_value (struct value *to, struct value *from)
|
||||||
|
+{
|
||||||
|
+ rw_pieced_value (to, from);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* An implementation of an lval_funcs method to see whether a value is
|
60
gdb-rhbz1420304-s390x-28of35.patch
Normal file
60
gdb-rhbz1420304-s390x-28of35.patch
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
commit 5524b5250e319f41933605420e9526fb74cfb9ae
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Wed Jun 14 14:24:03 2017 +0200
|
||||||
|
|
||||||
|
Fix register selection in var-access.exp
|
||||||
|
|
||||||
|
The new test var-access.exp causes FAILs on i686. This is because the
|
||||||
|
test chooses the wrong name for DWARF register number 1: It uses
|
||||||
|
"edx" (which corresponds to DWARF register number 2), but should have used
|
||||||
|
"ecx" instead.
|
||||||
|
|
||||||
|
Also, the current logic in var-access.exp does not correctly distinguish
|
||||||
|
between a 64-bit and a 32-bit program on an x86-64 target. It uses the
|
||||||
|
64-bit register names for both.
|
||||||
|
|
||||||
|
These problems are fixed. In order to address the latter, the convenience
|
||||||
|
macros is_*_target are exploited where appropriate.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
* gdb.dwarf2/var-access.exp: Use register name ecx instead of edx
|
||||||
|
on 32-bit x86 targets. Exploit is_*_target macros where
|
||||||
|
appropriate.
|
||||||
|
|
||||||
|
### a/gdb/testsuite/ChangeLog
|
||||||
|
### b/gdb/testsuite/ChangeLog
|
||||||
|
## -1,3 +1,9 @@
|
||||||
|
+2017-06-14 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
+ * gdb.dwarf2/var-access.exp: Use register name ecx instead of edx
|
||||||
|
+ on 32-bit x86 targets. Exploit is_*_target macros where
|
||||||
|
+ appropriate.
|
||||||
|
+
|
||||||
|
2017-06-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* gdb.dwarf2/var-access.exp: Add test for non-byte-aligned
|
||||||
|
--- a/gdb/testsuite/gdb.dwarf2/var-access.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.dwarf2/var-access.exp
|
||||||
|
@@ -28,16 +28,16 @@ if {![dwarf2_support]} {
|
||||||
|
|
||||||
|
set dwarf_regnum {0 1}
|
||||||
|
|
||||||
|
-if { [istarget "aarch64*-*-*"] } {
|
||||||
|
+if { [is_aarch64_target] } {
|
||||||
|
set regname {x0 x1}
|
||||||
|
-} elseif { [istarget "arm*-*-*"]
|
||||||
|
+} elseif { [is_aarch32_target]
|
||||||
|
|| [istarget "s390*-*-*" ]
|
||||||
|
|| [istarget "powerpc*-*-*"]
|
||||||
|
|| [istarget "rs6000*-*-aix*"] } {
|
||||||
|
set regname {r0 r1}
|
||||||
|
-} elseif { [istarget "i?86-*-*"] } {
|
||||||
|
- set regname {eax edx}
|
||||||
|
-} elseif { [istarget "x86_64-*-*"] } {
|
||||||
|
+} elseif { [is_x86_like_target] } {
|
||||||
|
+ set regname {eax ecx}
|
||||||
|
+} elseif { [is_amd64_regs_target] } {
|
||||||
|
set regname {rax rdx}
|
||||||
|
} else {
|
||||||
|
verbose "Skipping tests for accessing DWARF-described variables."
|
197
gdb-rhbz1420304-s390x-29of35.patch
Normal file
197
gdb-rhbz1420304-s390x-29of35.patch
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
commit b4cbbe8f7294070cc93a71ace78f134965ddad82
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Thu Jun 8 17:24:50 2017 +0200
|
||||||
|
|
||||||
|
S/390: Add support for pgste marker
|
||||||
|
|
||||||
|
This patch adds a new S/390 specific segment type: PT_S390_PGSTE. For
|
||||||
|
binaries marked with that segment the kernel will allocate 4k page
|
||||||
|
tables. The only user so far will be qemu.
|
||||||
|
|
||||||
|
ld/ChangeLog:
|
||||||
|
|
||||||
|
2017-06-23 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* Makefile.in: Add s390.em as build dependency.
|
||||||
|
* emulparams/elf64_s390.sh (EXTRA_EM_FILE): Add s390.em.
|
||||||
|
* emultempl/s390.em: New file.
|
||||||
|
* gen-doc.texi: Add documentation for --s390-pgste option.
|
||||||
|
* ld.texinfo: Likewise.
|
||||||
|
|
||||||
|
include/ChangeLog:
|
||||||
|
|
||||||
|
2017-06-23 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* elf/s390.h (PT_S390_PGSTE): Define macro.
|
||||||
|
|
||||||
|
binutils/ChangeLog:
|
||||||
|
|
||||||
|
2017-06-23 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* readelf.c (get_s390_segment_type): Add support for the new
|
||||||
|
segment type PT_S390_PGSTE.
|
||||||
|
(get_segment_type): Call get_s390_segment_type.
|
||||||
|
|
||||||
|
elfcpp/ChangeLog:
|
||||||
|
|
||||||
|
2017-06-23 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* elfcpp.h (enum PT): Add PT_S390_PGSTE to enum.
|
||||||
|
|
||||||
|
bfd/ChangeLog:
|
||||||
|
|
||||||
|
2017-06-23 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* elf-s390.h: New file.
|
||||||
|
* elf64-s390.c (struct elf_s390_link_hash_table): Add params
|
||||||
|
field.
|
||||||
|
(elf_s390_additional_program_headers): New function.
|
||||||
|
(elf_s390_modify_segment_map): New function.
|
||||||
|
(bfd_elf_s390_set_options): New function.
|
||||||
|
(elf_backend_additional_program_headers)
|
||||||
|
(elf_backend_modify_segment_map): Add macro definitions.
|
||||||
|
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/bfd/elf-s390.h
|
||||||
|
@@ -0,0 +1,29 @@
|
||||||
|
+/* S/390-specific support for ELF.
|
||||||
|
+ Copyright (C) 2017 Free Software Foundation, Inc.
|
||||||
|
+
|
||||||
|
+ This file is part of BFD, the Binary File Descriptor library.
|
||||||
|
+
|
||||||
|
+ This program is free software; you can redistribute it and/or modify
|
||||||
|
+ it under the terms of the GNU General Public License as published by
|
||||||
|
+ the Free Software Foundation; either version 3 of the License, or
|
||||||
|
+ (at your option) any later version.
|
||||||
|
+
|
||||||
|
+ This program is distributed in the hope that it will be useful,
|
||||||
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+ You should have received a copy of the GNU General Public License
|
||||||
|
+ along with this program; if not, write to the Free Software
|
||||||
|
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||||||
|
+ MA 02110-1301, USA. */
|
||||||
|
+
|
||||||
|
+/* Used to pass info between ld and bfd. */
|
||||||
|
+struct s390_elf_params
|
||||||
|
+{
|
||||||
|
+ /* Tell the kernel to allocate 4k page tables. */
|
||||||
|
+ int pgste;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+bfd_boolean bfd_elf_s390_set_options (struct bfd_link_info *info,
|
||||||
|
+ struct s390_elf_params *params);
|
||||||
|
--- a/bfd/elf64-s390.c
|
||||||
|
+++ b/bfd/elf64-s390.c
|
||||||
|
@@ -25,6 +25,7 @@
|
||||||
|
#include "libbfd.h"
|
||||||
|
#include "elf-bfd.h"
|
||||||
|
#include "elf/s390.h"
|
||||||
|
+#include "elf-s390.h"
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
|
||||||
|
@@ -660,6 +661,9 @@ struct elf_s390_link_hash_table
|
||||||
|
|
||||||
|
/* Small local sym cache. */
|
||||||
|
struct sym_cache sym_cache;
|
||||||
|
+
|
||||||
|
+ /* Options passed from the linker. */
|
||||||
|
+ struct s390_elf_params *params;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Get the s390 ELF linker hash table from a link_info structure. */
|
||||||
|
@@ -3966,6 +3970,70 @@ elf64_s390_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
|
||||||
|
return elf_s390_merge_obj_attributes (ibfd, info);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* We may add a PT_S390_PGSTE program header. */
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+elf_s390_additional_program_headers (bfd *abfd ATTRIBUTE_UNUSED,
|
||||||
|
+ struct bfd_link_info *info)
|
||||||
|
+{
|
||||||
|
+ struct elf_s390_link_hash_table *htab;
|
||||||
|
+
|
||||||
|
+ htab = elf_s390_hash_table (info);
|
||||||
|
+ return htab->params->pgste;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/* Add the PT_S390_PGSTE program header. */
|
||||||
|
+
|
||||||
|
+static bfd_boolean
|
||||||
|
+elf_s390_modify_segment_map (bfd *abfd ATTRIBUTE_UNUSED,
|
||||||
|
+ struct bfd_link_info *info)
|
||||||
|
+{
|
||||||
|
+ struct elf_s390_link_hash_table *htab;
|
||||||
|
+ struct elf_segment_map *m, *pm = NULL;
|
||||||
|
+
|
||||||
|
+ htab = elf_s390_hash_table (info);
|
||||||
|
+ if (!htab->params->pgste)
|
||||||
|
+ return TRUE;
|
||||||
|
+
|
||||||
|
+ /* If there is already a PT_S390_PGSTE header, avoid adding
|
||||||
|
+ another. */
|
||||||
|
+ m = elf_seg_map (abfd);
|
||||||
|
+ while (m && m->p_type != PT_S390_PGSTE)
|
||||||
|
+ {
|
||||||
|
+ pm = m;
|
||||||
|
+ m = m->next;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (m)
|
||||||
|
+ return TRUE;
|
||||||
|
+
|
||||||
|
+ m = (struct elf_segment_map *)
|
||||||
|
+ bfd_zalloc (abfd, sizeof (struct elf_segment_map));
|
||||||
|
+ if (m == NULL)
|
||||||
|
+ return FALSE;
|
||||||
|
+ m->p_type = PT_S390_PGSTE;
|
||||||
|
+ m->count = 0;
|
||||||
|
+ m->next = NULL;
|
||||||
|
+ if (pm)
|
||||||
|
+ pm->next = m;
|
||||||
|
+
|
||||||
|
+ return TRUE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+bfd_boolean
|
||||||
|
+bfd_elf_s390_set_options (struct bfd_link_info *info,
|
||||||
|
+ struct s390_elf_params *params)
|
||||||
|
+{
|
||||||
|
+ struct elf_s390_link_hash_table *htab;
|
||||||
|
+
|
||||||
|
+ htab = elf_s390_hash_table (info);
|
||||||
|
+ htab->params = params;
|
||||||
|
+
|
||||||
|
+ return TRUE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
/* Why was the hash table entry size definition changed from
|
||||||
|
ARCH_SIZE/8 to 4? This breaks the 64 bit dynamic linker and
|
||||||
|
this is the only reason for the s390_elf64_size_info structure. */
|
||||||
|
@@ -4046,6 +4114,8 @@ const struct elf_size_info s390_elf64_size_info =
|
||||||
|
#define elf_backend_plt_sym_val elf_s390_plt_sym_val
|
||||||
|
#define elf_backend_add_symbol_hook elf_s390_add_symbol_hook
|
||||||
|
#define elf_backend_sort_relocs_p elf_s390_elf_sort_relocs_p
|
||||||
|
+#define elf_backend_additional_program_headers elf_s390_additional_program_headers
|
||||||
|
+#define elf_backend_modify_segment_map elf_s390_modify_segment_map
|
||||||
|
|
||||||
|
#define bfd_elf64_mkobject elf_s390_mkobject
|
||||||
|
#define elf_backend_object_p elf_s390_object_p
|
||||||
|
--- a/include/elf/s390.h
|
||||||
|
+++ b/include/elf/s390.h
|
||||||
|
@@ -37,6 +37,9 @@
|
||||||
|
|
||||||
|
#define EF_S390_HIGH_GPRS 0x00000001
|
||||||
|
|
||||||
|
+/* Request 4k page table size. */
|
||||||
|
+#define PT_S390_PGSTE (PT_LOPROC + 0)
|
||||||
|
+
|
||||||
|
/* Relocation types. */
|
||||||
|
|
||||||
|
START_RELOC_NUMBERS (elf_s390_reloc_type)
|
85
gdb-rhbz1420304-s390x-30of35.patch
Normal file
85
gdb-rhbz1420304-s390x-30of35.patch
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
commit 93ec5e23766a9f75aa4950748cf73964028a8d1b
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Mon Jun 26 11:01:58 2017 +0200
|
||||||
|
|
||||||
|
S/390: Fix testsuite segfault added with recent pgste patch.
|
||||||
|
|
||||||
|
The recent pgste patch caused several testcases to fail with a
|
||||||
|
segfault. Fixed with this patch by adding NULL pointer checks.
|
||||||
|
|
||||||
|
regression-tested on s390x.
|
||||||
|
|
||||||
|
bfd/ChangeLog:
|
||||||
|
|
||||||
|
2017-06-26 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* elf64-s390.c (elf_s390_additional_program_headers): Add NULL
|
||||||
|
pointer checks.
|
||||||
|
(elf_s390_modify_segment_map): Likewise.
|
||||||
|
(bfd_elf_s390_set_options): Lisewise.
|
||||||
|
|
||||||
|
### a/bfd/ChangeLog
|
||||||
|
### b/bfd/ChangeLog
|
||||||
|
## -1,3 +1,10 @@
|
||||||
|
+2017-06-26 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
+ * elf64-s390.c (elf_s390_additional_program_headers): Add NULL
|
||||||
|
+ pointer checks.
|
||||||
|
+ (elf_s390_modify_segment_map): Likewise.
|
||||||
|
+ (bfd_elf_s390_set_options): Lisewise.
|
||||||
|
+
|
||||||
|
2017-06-26 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* elflink.c (_bfd_elf_link_create_dynstrtab): Don't make dynobj
|
||||||
|
--- a/bfd/elf64-s390.c
|
||||||
|
+++ b/bfd/elf64-s390.c
|
||||||
|
@@ -3978,22 +3978,29 @@ elf_s390_additional_program_headers (bfd *abfd ATTRIBUTE_UNUSED,
|
||||||
|
{
|
||||||
|
struct elf_s390_link_hash_table *htab;
|
||||||
|
|
||||||
|
- htab = elf_s390_hash_table (info);
|
||||||
|
- return htab->params->pgste;
|
||||||
|
+ if (info)
|
||||||
|
+ {
|
||||||
|
+ htab = elf_s390_hash_table (info);
|
||||||
|
+ if (htab)
|
||||||
|
+ return htab->params->pgste;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Add the PT_S390_PGSTE program header. */
|
||||||
|
|
||||||
|
static bfd_boolean
|
||||||
|
-elf_s390_modify_segment_map (bfd *abfd ATTRIBUTE_UNUSED,
|
||||||
|
- struct bfd_link_info *info)
|
||||||
|
+elf_s390_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
|
||||||
|
{
|
||||||
|
struct elf_s390_link_hash_table *htab;
|
||||||
|
struct elf_segment_map *m, *pm = NULL;
|
||||||
|
|
||||||
|
+ if (!abfd || !info)
|
||||||
|
+ return TRUE;
|
||||||
|
+
|
||||||
|
htab = elf_s390_hash_table (info);
|
||||||
|
- if (!htab->params->pgste)
|
||||||
|
+ if (!htab || !htab->params->pgste)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* If there is already a PT_S390_PGSTE header, avoid adding
|
||||||
|
@@ -4027,8 +4034,12 @@ bfd_elf_s390_set_options (struct bfd_link_info *info,
|
||||||
|
{
|
||||||
|
struct elf_s390_link_hash_table *htab;
|
||||||
|
|
||||||
|
- htab = elf_s390_hash_table (info);
|
||||||
|
- htab->params = params;
|
||||||
|
+ if (info)
|
||||||
|
+ {
|
||||||
|
+ htab = elf_s390_hash_table (info);
|
||||||
|
+ if (htab)
|
||||||
|
+ htab->params = params;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
169
gdb-rhbz1420304-s390x-31of35.patch
Normal file
169
gdb-rhbz1420304-s390x-31of35.patch
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
commit 88ab90e860a46a1123fcfd13bfe51cd360e9c3f7
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Thu Jun 29 10:30:09 2017 +0200
|
||||||
|
|
||||||
|
S390: Support guarded-storage core note sections
|
||||||
|
|
||||||
|
Newer Linux kernel versions offer two new register sets in support of the
|
||||||
|
z/Architecture's guarded storage facility: NT_S390_GS_CB, the
|
||||||
|
"guarded-storage registers", and NT_S390_GS_BC, the "guarded-storage
|
||||||
|
broadcast control block". This patch adds support for the respective core
|
||||||
|
notes sections to binutils.
|
||||||
|
|
||||||
|
bfd/ChangeLog:
|
||||||
|
* elf-bfd.h (elfcore_write_s390_gs_cb): Add prototype.
|
||||||
|
(elfcore_write_s390_gs_bc): Likewise.
|
||||||
|
* elf.c (elfcore_grok_s390_gs_cb): New function.
|
||||||
|
(elfcore_grok_s390_gs_bc): New function.
|
||||||
|
(elfcore_grok_note): Call them.
|
||||||
|
(elfcore_write_s390_gs_cb): New function.
|
||||||
|
(elfcore_write_s390_gs_bc): New function.
|
||||||
|
(elfcore_write_register_note): Call them.
|
||||||
|
|
||||||
|
binutils/ChangeLog:
|
||||||
|
* readelf.c (get_note_type): Add NT_S390_GS_CB and NT_S390_GS_BC.
|
||||||
|
|
||||||
|
include/ChangeLog:
|
||||||
|
* elf/common.h (NT_S390_GS_CB): New macro.
|
||||||
|
(NT_S390_GS_BC): Likewise.
|
||||||
|
|
||||||
|
### a/bfd/ChangeLog
|
||||||
|
### b/bfd/ChangeLog
|
||||||
|
## -1,3 +1,14 @@
|
||||||
|
+2017-06-29 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
+ * elf-bfd.h (elfcore_write_s390_gs_cb): Add prototype.
|
||||||
|
+ (elfcore_write_s390_gs_bc): Likewise.
|
||||||
|
+ * elf.c (elfcore_grok_s390_gs_cb): New function.
|
||||||
|
+ (elfcore_grok_s390_gs_bc): New function.
|
||||||
|
+ (elfcore_grok_note): Call them.
|
||||||
|
+ (elfcore_write_s390_gs_cb): New function.
|
||||||
|
+ (elfcore_write_s390_gs_bc): New function.
|
||||||
|
+ (elfcore_write_register_note): Call them.
|
||||||
|
+
|
||||||
|
2017-06-28 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* libbfd.c (_bfd_generic_get_section_contents): Don't call
|
||||||
|
--- a/bfd/elf-bfd.h
|
||||||
|
+++ b/bfd/elf-bfd.h
|
||||||
|
@@ -2533,6 +2533,10 @@ extern char *elfcore_write_s390_vxrs_low
|
||||||
|
(bfd *, char *, int *, const void *, int);
|
||||||
|
extern char *elfcore_write_s390_vxrs_high
|
||||||
|
(bfd *, char *, int *, const void *, int);
|
||||||
|
+extern char *elfcore_write_s390_gs_cb
|
||||||
|
+ (bfd *, char *, int *, const void *, int);
|
||||||
|
+extern char *elfcore_write_s390_gs_bc
|
||||||
|
+ (bfd *, char *, int *, const void *, int);
|
||||||
|
extern char *elfcore_write_arm_vfp
|
||||||
|
(bfd *, char *, int *, const void *, int);
|
||||||
|
extern char *elfcore_write_aarch_tls
|
||||||
|
--- a/bfd/elf.c
|
||||||
|
+++ b/bfd/elf.c
|
||||||
|
@@ -9191,6 +9191,18 @@ elfcore_grok_s390_vxrs_high (bfd *abfd, Elf_Internal_Note *note)
|
||||||
|
}
|
||||||
|
|
||||||
|
static bfd_boolean
|
||||||
|
+elfcore_grok_s390_gs_cb (bfd *abfd, Elf_Internal_Note *note)
|
||||||
|
+{
|
||||||
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-s390-gs-cb", note);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static bfd_boolean
|
||||||
|
+elfcore_grok_s390_gs_bc (bfd *abfd, Elf_Internal_Note *note)
|
||||||
|
+{
|
||||||
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-s390-gs-bc", note);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static bfd_boolean
|
||||||
|
elfcore_grok_arm_vfp (bfd *abfd, Elf_Internal_Note *note)
|
||||||
|
{
|
||||||
|
return elfcore_make_note_pseudosection (abfd, ".reg-arm-vfp", note);
|
||||||
|
@@ -9668,6 +9680,20 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
|
||||||
|
else
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
+ case NT_S390_GS_CB:
|
||||||
|
+ if (note->namesz == 6
|
||||||
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
||||||
|
+ return elfcore_grok_s390_gs_bc (abfd, note);
|
||||||
|
+ else
|
||||||
|
+ return TRUE;
|
||||||
|
+
|
||||||
|
+ case NT_S390_GS_BC:
|
||||||
|
+ if (note->namesz == 6
|
||||||
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
||||||
|
+ return elfcore_grok_s390_gs_cb (abfd, note);
|
||||||
|
+ else
|
||||||
|
+ return TRUE;
|
||||||
|
+
|
||||||
|
case NT_ARM_VFP:
|
||||||
|
if (note->namesz == 6
|
||||||
|
&& strcmp (note->namedata, "LINUX") == 0)
|
||||||
|
@@ -10728,6 +10754,32 @@ elfcore_write_s390_vxrs_high (bfd *abfd,
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
+elfcore_write_s390_gs_cb (bfd *abfd,
|
||||||
|
+ char *buf,
|
||||||
|
+ int *bufsiz,
|
||||||
|
+ const void *s390_gs_cb,
|
||||||
|
+ int size)
|
||||||
|
+{
|
||||||
|
+ char *note_name = "LINUX";
|
||||||
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
||||||
|
+ note_name, NT_S390_GS_CB,
|
||||||
|
+ s390_gs_cb, size);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+char *
|
||||||
|
+elfcore_write_s390_gs_bc (bfd *abfd,
|
||||||
|
+ char *buf,
|
||||||
|
+ int *bufsiz,
|
||||||
|
+ const void *s390_gs_bc,
|
||||||
|
+ int size)
|
||||||
|
+{
|
||||||
|
+ char *note_name = "LINUX";
|
||||||
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
||||||
|
+ note_name, NT_S390_GS_BC,
|
||||||
|
+ s390_gs_bc, size);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+char *
|
||||||
|
elfcore_write_arm_vfp (bfd *abfd,
|
||||||
|
char *buf,
|
||||||
|
int *bufsiz,
|
||||||
|
@@ -10815,6 +10867,10 @@ elfcore_write_register_note (bfd *abfd,
|
||||||
|
return elfcore_write_s390_vxrs_low (abfd, buf, bufsiz, data, size);
|
||||||
|
if (strcmp (section, ".reg-s390-vxrs-high") == 0)
|
||||||
|
return elfcore_write_s390_vxrs_high (abfd, buf, bufsiz, data, size);
|
||||||
|
+ if (strcmp (section, ".reg-s390-gs-cb") == 0)
|
||||||
|
+ return elfcore_write_s390_gs_cb (abfd, buf, bufsiz, data, size);
|
||||||
|
+ if (strcmp (section, ".reg-s390-gs-bc") == 0)
|
||||||
|
+ return elfcore_write_s390_gs_bc (abfd, buf, bufsiz, data, size);
|
||||||
|
if (strcmp (section, ".reg-arm-vfp") == 0)
|
||||||
|
return elfcore_write_arm_vfp (abfd, buf, bufsiz, data, size);
|
||||||
|
if (strcmp (section, ".reg-aarch-tls") == 0)
|
||||||
|
### a/include/ChangeLog
|
||||||
|
### b/include/ChangeLog
|
||||||
|
## -1,3 +1,8 @@
|
||||||
|
+2017-06-29 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
+ * elf/common.h (NT_S390_GS_CB): New macro.
|
||||||
|
+ (NT_S390_GS_BC): Likewise.
|
||||||
|
+
|
||||||
|
2017-06-28 Tamar Christina <tamar.christina@arm.com>
|
||||||
|
|
||||||
|
* opcode/aarch64.h: (AARCH64_FEATURE_DOTPROD): New.
|
||||||
|
--- a/include/elf/common.h
|
||||||
|
+++ b/include/elf/common.h
|
||||||
|
@@ -598,6 +598,10 @@
|
||||||
|
/* note name must be "LINUX". */
|
||||||
|
#define NT_S390_VXRS_HIGH 0x30a /* S390 vector registers 16-31 */
|
||||||
|
/* note name must be "LINUX". */
|
||||||
|
+#define NT_S390_GS_CB 0x30b /* s390 guarded storage registers */
|
||||||
|
+ /* note name must be "LINUX". */
|
||||||
|
+#define NT_S390_GS_BC 0x30c /* s390 guarded storage broadcast control block */
|
||||||
|
+ /* note name must be "LINUX". */
|
||||||
|
#define NT_ARM_VFP 0x400 /* ARM VFP registers */
|
||||||
|
/* The following definitions should really use NT_AARCH_..., but defined
|
||||||
|
this way for compatibility with Linux. */
|
380
gdb-rhbz1420304-s390x-32of35.patch
Normal file
380
gdb-rhbz1420304-s390x-32of35.patch
Normal file
@ -0,0 +1,380 @@
|
|||||||
|
commit 55efceabc6149e96134c10676adb2b1e79e0ae13
|
||||||
|
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
Date: Thu Jul 13 20:17:03 2017 +0200
|
||||||
|
|
||||||
|
S390: Add record/replay support for arch12 instructions
|
||||||
|
|
||||||
|
Support record/replay of the z/Architecture instructions that were
|
||||||
|
introduced with arch12.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* s390-linux-tdep.c (s390_process_record): Add support for
|
||||||
|
instructions new in arch12.
|
||||||
|
|
||||||
|
### a/gdb/ChangeLog
|
||||||
|
### b/gdb/ChangeLog
|
||||||
|
## -1,3 +1,8 @@
|
||||||
|
+2017-07-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
+ * s390-linux-tdep.c (s390_process_record): Add support for
|
||||||
|
+ instructions new in arch12.
|
||||||
|
+
|
||||||
|
2017-07-11 John Baldwin <jhb@FreeBSD.org>
|
||||||
|
|
||||||
|
* amd64-bsd-nat.c (amd64bsd_fetch_inferior_registers): Use
|
||||||
|
--- a/gdb/s390-linux-tdep.c
|
||||||
|
+++ b/gdb/s390-linux-tdep.c
|
||||||
|
@@ -4992,6 +4992,8 @@ ex:
|
||||||
|
case 0xb9e9: /* SGRK - subtract */
|
||||||
|
case 0xb9ea: /* ALGRK - add logical */
|
||||||
|
case 0xb9eb: /* SLGRK - subtract logical */
|
||||||
|
+ case 0xb9ed: /* MSGRKC - multiply single 64x64 -> 64 */
|
||||||
|
+ case 0xb9fd: /* MSRKC - multiply single 32x32 -> 32 */
|
||||||
|
/* 64-bit gpr destination + flags */
|
||||||
|
if (s390_record_gpr_g (gdbarch, regcache, inib[6]))
|
||||||
|
return -1;
|
||||||
|
@@ -5019,7 +5021,7 @@ ex:
|
||||||
|
case 0xb914: /* LGFR - load */
|
||||||
|
case 0xb916: /* LLGFR - load logical */
|
||||||
|
case 0xb917: /* LLGTR - load logical thirty one bits */
|
||||||
|
- case 0xb91c: /* MSGFR - load */
|
||||||
|
+ case 0xb91c: /* MSGFR - multiply single 64<32 */
|
||||||
|
case 0xb946: /* BCTGR - branch on count */
|
||||||
|
case 0xb984: /* LLGCR - load logical character */
|
||||||
|
case 0xb985: /* LLGHR - load logical halfword */
|
||||||
|
@@ -5038,6 +5040,7 @@ ex:
|
||||||
|
case 0xb91d: /* DSGFR - divide single */
|
||||||
|
case 0xb986: /* MLGR - multiply logical */
|
||||||
|
case 0xb987: /* DLGR - divide logical */
|
||||||
|
+ case 0xb9ec: /* MGRK - multiply 64x64 -> 128 */
|
||||||
|
/* 64-bit gpr pair destination */
|
||||||
|
if (s390_record_gpr_g (gdbarch, regcache, inib[6]))
|
||||||
|
return -1;
|
||||||
|
@@ -5106,8 +5109,8 @@ ex:
|
||||||
|
/* 0xb922-0xb924 undefined */
|
||||||
|
/* 0xb925 privileged */
|
||||||
|
/* 0xb928 privileged */
|
||||||
|
- /* 0xb929 undefined */
|
||||||
|
|
||||||
|
+ case 0xb929: /* KMA - cipher message with authentication */
|
||||||
|
case 0xb92a: /* KMF - cipher message with cipher feedback [partial] */
|
||||||
|
case 0xb92b: /* KMO - cipher message with output feedback [partial] */
|
||||||
|
case 0xb92f: /* KMC - cipher message with chaining [partial] */
|
||||||
|
@@ -5170,6 +5173,15 @@ ex:
|
||||||
|
if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + (inib[7] | 1)))
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
+ if (tmp != 0 && insn[0] == 0xb929)
|
||||||
|
+ {
|
||||||
|
+ if (record_full_arch_list_add_reg (regcache,
|
||||||
|
+ S390_R0_REGNUM + inib[4]))
|
||||||
|
+ return -1;
|
||||||
|
+ if (record_full_arch_list_add_reg (regcache,
|
||||||
|
+ S390_R0_REGNUM + (inib[4] | 1)))
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
@@ -5571,10 +5583,11 @@ ex:
|
||||||
|
|
||||||
|
/* 0xb9e3 undefined */
|
||||||
|
/* 0xb9e5 undefined */
|
||||||
|
- /* 0xb9ec-0xb9f1 undefined */
|
||||||
|
+ /* 0xb9ee-0xb9f1 undefined */
|
||||||
|
/* 0xb9f3 undefined */
|
||||||
|
/* 0xb9f5 undefined */
|
||||||
|
- /* 0xb9fc-0xb9ff undefined */
|
||||||
|
+ /* 0xb9fc undefined */
|
||||||
|
+ /* 0xb9fe -0xb9ff undefined */
|
||||||
|
|
||||||
|
default:
|
||||||
|
goto UNKNOWN_OP;
|
||||||
|
@@ -5962,6 +5975,7 @@ ex:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xe3:
|
||||||
|
+ case 0xe6:
|
||||||
|
case 0xe7:
|
||||||
|
case 0xeb:
|
||||||
|
case 0xed:
|
||||||
|
@@ -6006,6 +6020,7 @@ ex:
|
||||||
|
case 0xe31c: /* MSGF - multiply single */
|
||||||
|
case 0xe32a: /* LZRG - load and zero rightmost byte */
|
||||||
|
case 0xe33a: /* LLZRGF - load logical and zero rightmost byte */
|
||||||
|
+ case 0xe33c: /* MGH - multiply halfword 64x16mem -> 64 */
|
||||||
|
case 0xe346: /* BCTG - branch on count */
|
||||||
|
case 0xe377: /* LGB - load byte */
|
||||||
|
case 0xe390: /* LLGC - load logical character */
|
||||||
|
@@ -6036,6 +6051,7 @@ ex:
|
||||||
|
|
||||||
|
case 0xe30d: /* DSG - divide single */
|
||||||
|
case 0xe31d: /* DSGF - divide single */
|
||||||
|
+ case 0xe384: /* MG - multiply 64x64mem -> 128 */
|
||||||
|
case 0xe386: /* MLG - multiply logical */
|
||||||
|
case 0xe387: /* DLG - divide logical */
|
||||||
|
case 0xe38f: /* LPQ - load pair from quadword */
|
||||||
|
@@ -6057,6 +6073,9 @@ ex:
|
||||||
|
/* 0xe310-0xe311 undefined */
|
||||||
|
|
||||||
|
case 0xe312: /* LT - load and test */
|
||||||
|
+ case 0xe338: /* AGH - add halfword to 64 bit value */
|
||||||
|
+ case 0xe339: /* SGH - subtract halfword from 64 bit value */
|
||||||
|
+ case 0xe353: /* MSC - multiply single 32x32mem -> 32 */
|
||||||
|
case 0xe354: /* NY - and */
|
||||||
|
case 0xe356: /* OY - or */
|
||||||
|
case 0xe357: /* XY - xor */
|
||||||
|
@@ -6066,13 +6085,14 @@ ex:
|
||||||
|
case 0xe35f: /* SLY - subtract logical */
|
||||||
|
case 0xe37a: /* AHY - add halfword */
|
||||||
|
case 0xe37b: /* SHY - subtract halfword */
|
||||||
|
+ case 0xe383: /* MSGC - multiply single 64x64mem -> 64 */
|
||||||
|
case 0xe398: /* ALC - add logical with carry */
|
||||||
|
case 0xe399: /* SLB - subtract logical with borrow */
|
||||||
|
case 0xe727: /* LCBB - load count to block bounduary */
|
||||||
|
case 0xeb81: /* ICMY - insert characters under mask */
|
||||||
|
case 0xebdc: /* SRAK - shift left single */
|
||||||
|
case 0xebdd: /* SLAK - shift left single */
|
||||||
|
- /* 32-bit gpr destination + flags */
|
||||||
|
+ /* 32/64-bit gpr destination + flags */
|
||||||
|
if (record_full_arch_list_add_reg (regcache, S390_R0_REGNUM + inib[2]))
|
||||||
|
return -1;
|
||||||
|
if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
|
||||||
|
@@ -6160,7 +6180,7 @@ ex:
|
||||||
|
case 0xe336: /* PFD - prefetch data */
|
||||||
|
break;
|
||||||
|
|
||||||
|
- /* 0xe337-0xe339 undefined */
|
||||||
|
+ /* 0xe337 undefined */
|
||||||
|
/* 0xe33c-0xe33d undefined */
|
||||||
|
|
||||||
|
case 0xe33e: /* STRV - store reversed */
|
||||||
|
@@ -6183,8 +6203,12 @@ ex:
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* 0xe340-0xe345 undefined */
|
||||||
|
- /* 0xe347-0xe34f undefined */
|
||||||
|
- /* 0xe352-0xe353 undefined */
|
||||||
|
+
|
||||||
|
+ case 0xe347: /* BIC - branch indirect on condition */
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ /* 0xe348-0xe34f undefined */
|
||||||
|
+ /* 0xe352 undefined */
|
||||||
|
|
||||||
|
case 0xe35c: /* MFY - multiply */
|
||||||
|
case 0xe396: /* ML - multiply logical */
|
||||||
|
@@ -6216,11 +6240,12 @@ ex:
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* 0xe37d-0xe37f undefined */
|
||||||
|
- /* 0xe383-0xe384 undefined */
|
||||||
|
|
||||||
|
case 0xe385: /* LGAT - load and trap */
|
||||||
|
case 0xe39c: /* LLGTAT - load logical thirty one bits and trap */
|
||||||
|
case 0xe39d: /* LLGFAT - load logical and trap */
|
||||||
|
+ case 0xe650: /* VCVB - vector convert to binary 32 bit*/
|
||||||
|
+ case 0xe652: /* VCVBG - vector convert to binary 64 bit*/
|
||||||
|
case 0xe721: /* VLGV - vector load gr from vr element */
|
||||||
|
/* 64-bit gpr destination + fpc for possible DXC write */
|
||||||
|
if (s390_record_gpr_g (gdbarch, regcache, inib[2]))
|
||||||
|
@@ -6271,6 +6296,10 @@ ex:
|
||||||
|
/* 0xe3ce undefined */
|
||||||
|
/* 0xe3d0-0xe3ff undefined */
|
||||||
|
|
||||||
|
+ case 0xe634: /* VPKZ - vector pack zoned */
|
||||||
|
+ case 0xe635: /* VLRL - vector load rightmost with immed. length */
|
||||||
|
+ case 0xe637: /* VLRLR - vector load rightmost with length */
|
||||||
|
+ case 0xe649: /* VLIP - vector load immediate decimal */
|
||||||
|
case 0xe700: /* VLEB - vector load element */
|
||||||
|
case 0xe701: /* VLEH - vector load element */
|
||||||
|
case 0xe702: /* VLEG - vector load element */
|
||||||
|
@@ -6311,7 +6340,10 @@ ex:
|
||||||
|
case 0xe769: /* VNC - vector and with complement */
|
||||||
|
case 0xe76a: /* VO - vector or */
|
||||||
|
case 0xe76b: /* VNO - vector nor */
|
||||||
|
+ case 0xe76c: /* VNX - vector not exclusive or */
|
||||||
|
case 0xe76d: /* VX - vector xor */
|
||||||
|
+ case 0xe76e: /* VNN - vector nand */
|
||||||
|
+ case 0xe76f: /* VOC - vector or with complement */
|
||||||
|
case 0xe770: /* VESLV - vector element shift left */
|
||||||
|
case 0xe772: /* VERIM - vector element rotate and insert under mask */
|
||||||
|
case 0xe773: /* VERLLV - vector element rotate left logical */
|
||||||
|
@@ -6325,11 +6357,14 @@ ex:
|
||||||
|
case 0xe77e: /* VSRA - vector shift right arithmetic */
|
||||||
|
case 0xe77f: /* VSRAB - vector shift right arithmetic by byte */
|
||||||
|
case 0xe784: /* VPDI - vector permute doubleword immediate */
|
||||||
|
+ case 0xe785: /* VBPERM - vector bit permute */
|
||||||
|
case 0xe78c: /* VPERM - vector permute */
|
||||||
|
case 0xe78d: /* VSEL - vector select */
|
||||||
|
case 0xe78e: /* VFMS - vector fp multiply and subtract */
|
||||||
|
case 0xe78f: /* VFMA - vector fp multiply and add */
|
||||||
|
case 0xe794: /* VPK - vector pack */
|
||||||
|
+ case 0xe79e: /* VFNMS - vector fp negative multiply and subtract */
|
||||||
|
+ case 0xe79f: /* VFNMA - vector fp negative multiply and add */
|
||||||
|
case 0xe7a1: /* VMLH - vector multiply logical high */
|
||||||
|
case 0xe7a2: /* VML - vector multiply low */
|
||||||
|
case 0xe7a3: /* VMH - vector multiply high */
|
||||||
|
@@ -6345,6 +6380,7 @@ ex:
|
||||||
|
case 0xe7ae: /* VMAE - vector multiply and add even */
|
||||||
|
case 0xe7af: /* VMAO - vector multiply and add odd */
|
||||||
|
case 0xe7b4: /* VGFM - vector Galois field multiply sum */
|
||||||
|
+ case 0xe7b8: /* VMSL - vector multiply sum logical */
|
||||||
|
case 0xe7b9: /* VACCC - vector add with carry compute carry */
|
||||||
|
case 0xe7bb: /* VAC - vector add with carry */
|
||||||
|
case 0xe7bc: /* VGFMA - vector Galois field multiply sum and accumulate */
|
||||||
|
@@ -6354,8 +6390,8 @@ ex:
|
||||||
|
case 0xe7c1: /* VCDLG - vector convert from logical 64-bit */
|
||||||
|
case 0xe7c2: /* VCGD - vector convert to fixed 64-bit */
|
||||||
|
case 0xe7c3: /* VCDG - vector convert from fixed 64-bit */
|
||||||
|
- case 0xe7c4: /* VLDE - vector fp load lengthened */
|
||||||
|
- case 0xe7c5: /* VLED - vector fp load rounded */
|
||||||
|
+ case 0xe7c4: /* VLDE/VFLL - vector fp load lengthened */
|
||||||
|
+ case 0xe7c5: /* VLED/VFLR - vector fp load rounded */
|
||||||
|
case 0xe7c7: /* VFI - vector load fp integer */
|
||||||
|
case 0xe7cc: /* VFPSO - vector fp perform sign operation */
|
||||||
|
case 0xe7ce: /* VFSQ - vector fp square root */
|
||||||
|
@@ -6369,6 +6405,8 @@ ex:
|
||||||
|
case 0xe7e3: /* VFA - vector fp add */
|
||||||
|
case 0xe7e5: /* VFD - vector fp divide */
|
||||||
|
case 0xe7e7: /* VFM - vector fp multiply */
|
||||||
|
+ case 0xe7ee: /* VFMIN - vector fp minimum */
|
||||||
|
+ case 0xe7ef: /* VFMAX - vector fp maximum */
|
||||||
|
case 0xe7f0: /* VAVGL - vector average logical */
|
||||||
|
case 0xe7f1: /* VACC - vector add and compute carry */
|
||||||
|
case 0xe7f2: /* VAVG - vector average */
|
||||||
|
@@ -6386,6 +6424,14 @@ ex:
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case 0xe63d: /* VSTRL - vector store rightmost with immed. length */
|
||||||
|
+ oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
|
||||||
|
+ if (record_full_arch_list_add_mem (oaddr, inib[3] + 1))
|
||||||
|
+ return -1;
|
||||||
|
+ if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
|
||||||
|
+ return -1;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
case 0xe708: /* VSTEB - vector store element */
|
||||||
|
oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
|
||||||
|
if (record_full_arch_list_add_mem (oaddr, 1))
|
||||||
|
@@ -6480,13 +6526,22 @@ ex:
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case 0xe63c: /* VUPKZ - vector unpack zoned */
|
||||||
|
+ oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
|
||||||
|
+ if (record_full_arch_list_add_mem (oaddr, (ibyte[1] + 1) & 31))
|
||||||
|
+ return -1;
|
||||||
|
+ if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
|
||||||
|
+ return -1;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case 0xe63f: /* VSTRLR - vector store rightmost with length */
|
||||||
|
case 0xe73f: /* VSTL - vector store with length */
|
||||||
|
oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
|
||||||
|
regcache_raw_read_unsigned (regcache, S390_R0_REGNUM + inib[3], &tmp);
|
||||||
|
tmp &= 0xffffffffu;
|
||||||
|
- if (tmp > 16)
|
||||||
|
- tmp = 16;
|
||||||
|
- if (record_full_arch_list_add_mem (oaddr, tmp))
|
||||||
|
+ if (tmp > 15)
|
||||||
|
+ tmp = 15;
|
||||||
|
+ if (record_full_arch_list_add_mem (oaddr, tmp + 1))
|
||||||
|
return -1;
|
||||||
|
if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
|
||||||
|
return -1;
|
||||||
|
@@ -6494,6 +6549,17 @@ ex:
|
||||||
|
|
||||||
|
/* 0xe747-0xe749 undefined */
|
||||||
|
|
||||||
|
+ case 0xe658: /* VCVD - vector convert to decimal 32 bit */
|
||||||
|
+ case 0xe659: /* VSRP - vector shift and round decimal */
|
||||||
|
+ case 0xe65a: /* VCVDG - vector convert to decimal 64 bit*/
|
||||||
|
+ case 0xe65b: /* VPSOP - vector perform sign operation decimal */
|
||||||
|
+ case 0xe671: /* VAP - vector add decimal */
|
||||||
|
+ case 0xe673: /* VSP - vector subtract decimal */
|
||||||
|
+ case 0xe678: /* VMP - vector multiply decimal */
|
||||||
|
+ case 0xe679: /* VMSP - vector multiply decimal */
|
||||||
|
+ case 0xe67a: /* VDP - vector divide decimal */
|
||||||
|
+ case 0xe67b: /* VRP - vector remainder decimal */
|
||||||
|
+ case 0xe67e: /* VSDP - vector shift and divide decimal */
|
||||||
|
case 0xe74a: /* VFTCI - vector fp test data class immediate */
|
||||||
|
case 0xe75c: /* VISTR - vector isolate string */
|
||||||
|
case 0xe780: /* VFEE - vector find element equal */
|
||||||
|
@@ -6504,7 +6570,7 @@ ex:
|
||||||
|
case 0xe797: /* VPKS - vector pack saturate */
|
||||||
|
case 0xe7e8: /* VFCE - vector fp compare equal */
|
||||||
|
case 0xe7ea: /* VFCHE - vector fp compare high or equal */
|
||||||
|
- case 0xe7eb: /* VFCE - vector fp compare high */
|
||||||
|
+ case 0xe7eb: /* VFCH - vector fp compare high */
|
||||||
|
case 0xe7f8: /* VCEQ - vector compare equal */
|
||||||
|
case 0xe7f9: /* VCHL - vector compare high logical */
|
||||||
|
case 0xe7fb: /* VCH - vector compare high */
|
||||||
|
@@ -6517,6 +6583,14 @@ ex:
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case 0xe65f: /* VTP - vector test decimal */
|
||||||
|
+ /* flags + FPC */
|
||||||
|
+ if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM))
|
||||||
|
+ return -1;
|
||||||
|
+ if (record_full_arch_list_add_reg (regcache, S390_FPC_REGNUM))
|
||||||
|
+ return -1;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
/* 0xe74b-0xe74c undefined */
|
||||||
|
/* 0xe74e-0xe74f undefined */
|
||||||
|
/* 0xe751 undefined */
|
||||||
|
@@ -6524,26 +6598,26 @@ ex:
|
||||||
|
/* 0xe757-0xe75b undefined */
|
||||||
|
/* 0xe75d-0xe75e undefined */
|
||||||
|
/* 0xe763 undefined */
|
||||||
|
- /* 0xe76c undefined */
|
||||||
|
- /* 0xe76e-0xe76f undefined */
|
||||||
|
/* 0xe771 undefined */
|
||||||
|
/* 0xe776 undefined */
|
||||||
|
/* 0xe779 undefined */
|
||||||
|
/* 0xe77b undefined */
|
||||||
|
/* 0xe783 undefined */
|
||||||
|
- /* 0xe785-0xe789 undefined */
|
||||||
|
+ /* 0xe786-0xe789 undefined */
|
||||||
|
/* 0xe78b undefined */
|
||||||
|
/* 0xe790-0xe793 undefined */
|
||||||
|
/* 0xe796 undefined */
|
||||||
|
- /* 0xe798-0xe7a0 undefined */
|
||||||
|
- /* 0xe7a8 undefined */
|
||||||
|
+ /* 0xe798-0xe79d undefined */
|
||||||
|
+ /* 0xe7a0 undefined */
|
||||||
|
+ /* 0xe7a8 undefined */
|
||||||
|
/* 0xe7b0-0xe7b3 undefined */
|
||||||
|
- /* 0xe7b5-0xe7b8 undefined */
|
||||||
|
+ /* 0xe7b5-0xe7b7 undefined */
|
||||||
|
/* 0xe7ba undefined */
|
||||||
|
/* 0xe7be undefined */
|
||||||
|
/* 0xe7c6 undefined */
|
||||||
|
/* 0xe7c8-0xe7c9 undefined */
|
||||||
|
|
||||||
|
+ case 0xe677: /* VCP - vector compare decimal */
|
||||||
|
case 0xe7ca: /* WFK - vector fp compare and signal scalar */
|
||||||
|
case 0xe7cb: /* WFC - vector fp compare scalar */
|
||||||
|
case 0xe7d8: /* VTM - vector test under mask */
|
||||||
|
@@ -6568,7 +6642,7 @@ ex:
|
||||||
|
/* 0xe7e4 undefined */
|
||||||
|
/* 0xe7e6 undefined */
|
||||||
|
/* 0xe7e9 undefined */
|
||||||
|
- /* 0xe7ec-0xe7ef undefined */
|
||||||
|
+ /* 0xe7ec-0xe7ed undefined */
|
||||||
|
/* 0xe7f4 undefined */
|
||||||
|
/* 0xe7f6 undefined */
|
||||||
|
/* 0xe7fa undefined */
|
||||||
|
@@ -7048,8 +7122,6 @@ ex:
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
- /* 0xe6 undefined */
|
||||||
|
-
|
||||||
|
case 0xec:
|
||||||
|
/* RIE/RIS/RRS-format instruction */
|
||||||
|
switch (ibyte[0] << 8 | ibyte[5])
|
49
gdb-rhbz1420304-s390x-33of35.patch
Normal file
49
gdb-rhbz1420304-s390x-33of35.patch
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
commit 47826cdbec2548cd1d25acf4cfaf908ae88f3325
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Fri Jul 21 10:54:06 2017 +0200
|
||||||
|
|
||||||
|
S/390: Support z14 as CPU name.
|
||||||
|
|
||||||
|
With IBM z14 officially announced I can add z14 as CPU name.
|
||||||
|
|
||||||
|
No regressions with that patch on s390x.
|
||||||
|
|
||||||
|
gas/ChangeLog:
|
||||||
|
|
||||||
|
2017-07-21 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* config/tc-s390.c (s390_parse_cpu): Add z14 as alternate CPU
|
||||||
|
name.
|
||||||
|
* doc/as.texinfo: Add z14 to CPU string list.
|
||||||
|
* doc/c-s390.texi: Likewise.
|
||||||
|
|
||||||
|
opcodes/ChangeLog:
|
||||||
|
|
||||||
|
2017-07-21 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* s390-mkopc.c (main): Enable z14 as CPU string in the opcode
|
||||||
|
table.
|
||||||
|
|
||||||
|
### a/opcodes/ChangeLog
|
||||||
|
### b/opcodes/ChangeLog
|
||||||
|
## -1,3 +1,8 @@
|
||||||
|
+2017-07-21 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
+ * s390-mkopc.c (main): Enable z14 as CPU string in the opcode
|
||||||
|
+ table.
|
||||||
|
+
|
||||||
|
2017-07-20 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* po/de.po: Updated German translation.
|
||||||
|
--- a/opcodes/s390-mkopc.c
|
||||||
|
+++ b/opcodes/s390-mkopc.c
|
||||||
|
@@ -374,7 +374,8 @@ main (void)
|
||||||
|
else if (strcmp (cpu_string, "z13") == 0
|
||||||
|
|| strcmp (cpu_string, "arch11") == 0)
|
||||||
|
min_cpu = S390_OPCODE_Z13;
|
||||||
|
- else if (strcmp (cpu_string, "arch12") == 0)
|
||||||
|
+ else if (strcmp (cpu_string, "z14") == 0
|
||||||
|
+ || strcmp (cpu_string, "arch12") == 0)
|
||||||
|
min_cpu = S390_OPCODE_ARCH12;
|
||||||
|
else {
|
||||||
|
fprintf (stderr, "Couldn't parse cpu string %s\n", cpu_string);
|
53
gdb-rhbz1420304-s390x-34of35.patch
Normal file
53
gdb-rhbz1420304-s390x-34of35.patch
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
commit 79c12faeea57e61364b6a7a3e411b096edce989c
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Fri Jul 28 17:59:25 2017 +0200
|
||||||
|
|
||||||
|
S/390: Fix segfault when linking -shared -nostartfiles
|
||||||
|
|
||||||
|
Regression-tested on s390x.
|
||||||
|
|
||||||
|
bfd/ChangeLog:
|
||||||
|
|
||||||
|
2017-07-28 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* elf32-s390.c (elf_s390_finish_dynamic_sections): Add NULL
|
||||||
|
pointer check for htab->elf.irelplt.
|
||||||
|
* elf64-s390.c (elf_s390_finish_dynamic_sections): Likewise.
|
||||||
|
|
||||||
|
--- a/bfd/elf32-s390.c
|
||||||
|
+++ b/bfd/elf32-s390.c
|
||||||
|
@@ -3941,7 +3941,9 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd,
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DT_PLTRELSZ:
|
||||||
|
- dyn.d_un.d_val = htab->elf.srelplt->size + htab->elf.irelplt->size;
|
||||||
|
+ dyn.d_un.d_val = htab->elf.srelplt->size;
|
||||||
|
+ if (htab->elf.irelplt)
|
||||||
|
+ dyn.d_un.d_val += htab->elf.irelplt->size;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
--- a/bfd/elf64-s390.c
|
||||||
|
+++ b/bfd/elf64-s390.c
|
||||||
|
@@ -3745,7 +3745,9 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd,
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DT_PLTRELSZ:
|
||||||
|
- dyn.d_un.d_val = htab->elf.srelplt->size + htab->elf.irelplt->size;
|
||||||
|
+ dyn.d_un.d_val = htab->elf.srelplt->size;
|
||||||
|
+ if (htab->elf.irelplt)
|
||||||
|
+ dyn.d_un.d_val += htab->elf.irelplt->size;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DT_RELASZ:
|
||||||
|
@@ -3756,7 +3758,9 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd,
|
||||||
|
linker script arranges for .rela.plt to follow all
|
||||||
|
other relocation sections, we don't have to worry
|
||||||
|
about changing the DT_RELA entry. */
|
||||||
|
- dyn.d_un.d_val -= htab->elf.srelplt->size + htab->elf.irelplt->size;
|
||||||
|
+ dyn.d_un.d_val -= htab->elf.srelplt->size;
|
||||||
|
+ if (htab->elf.irelplt)
|
||||||
|
+ dyn.d_un.d_val -= htab->elf.irelplt->size;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
67
gdb-rhbz1420304-s390x-35of35.patch
Normal file
67
gdb-rhbz1420304-s390x-35of35.patch
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
commit 1ef692ea23714876cc30b1a3ab3ef33a1369f17a
|
||||||
|
Author: Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
Date: Tue Aug 1 15:13:40 2017 +0200
|
||||||
|
|
||||||
|
S/390: Fix claimfile failures
|
||||||
|
|
||||||
|
This fixes a segfault when trying to access the local_plt field in the
|
||||||
|
s390 specific elf data althoug the underlaying object is a generic elf
|
||||||
|
object.
|
||||||
|
|
||||||
|
This fixes the following testsuite failures:
|
||||||
|
|
||||||
|
< FAIL: plugin claimfile replace symbol with source
|
||||||
|
< FAIL: plugin claimfile resolve symbol with source
|
||||||
|
< FAIL: plugin claimfile replace file with source
|
||||||
|
< FAIL: plugin set symbol visibility with source
|
||||||
|
< FAIL: plugin ignore lib with source
|
||||||
|
< FAIL: plugin claimfile replace lib with source
|
||||||
|
< FAIL: plugin 2 with source lib
|
||||||
|
< FAIL: load plugin 2 with source
|
||||||
|
< FAIL: plugin 3 with source lib
|
||||||
|
< FAIL: load plugin 3 with source
|
||||||
|
|
||||||
|
bfd/ChangeLog:
|
||||||
|
|
||||||
|
2017-08-01 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* elf32-s390.c (elf_s390_finish_dynamic_sections): Skip if it
|
||||||
|
isn't the S/390 specific elf data.
|
||||||
|
* elf64-s390.c (elf_s390_finish_dynamic_sections): Likewise.
|
||||||
|
|
||||||
|
### a/bfd/ChangeLog
|
||||||
|
### b/bfd/ChangeLog
|
||||||
|
## -1,3 +1,9 @@
|
||||||
|
+2017-08-01 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
+
|
||||||
|
+ * elf32-s390.c (elf_s390_finish_dynamic_sections): Skip if it
|
||||||
|
+ isn't the S/390 specific elf data.
|
||||||
|
+ * elf64-s390.c (elf_s390_finish_dynamic_sections): Likewise.
|
||||||
|
+
|
||||||
|
2017-07-31 Kuan-Lin Chen <rufus@andestech.com>
|
||||||
|
|
||||||
|
* elfxx-riscv.c (riscv_elf_add_sub_reloc): New function.
|
||||||
|
--- a/bfd/elf32-s390.c
|
||||||
|
+++ b/bfd/elf32-s390.c
|
||||||
|
@@ -4001,6 +4001,9 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd,
|
||||||
|
|
||||||
|
symtab_hdr = &elf_symtab_hdr (ibfd);
|
||||||
|
|
||||||
|
+ if (!is_s390_elf (ibfd))
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
local_plt = elf_s390_local_plt (ibfd);
|
||||||
|
if (local_plt != NULL)
|
||||||
|
for (i = 0; i < symtab_hdr->sh_info; i++)
|
||||||
|
--- a/bfd/elf64-s390.c
|
||||||
|
+++ b/bfd/elf64-s390.c
|
||||||
|
@@ -3814,6 +3814,9 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd,
|
||||||
|
|
||||||
|
symtab_hdr = &elf_symtab_hdr (ibfd);
|
||||||
|
|
||||||
|
+ if (!is_s390_elf (ibfd))
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
local_plt = elf_s390_local_plt (ibfd);
|
||||||
|
if (local_plt != NULL)
|
||||||
|
for (i = 0; i < symtab_hdr->sh_info; i++)
|
File diff suppressed because it is too large
Load Diff
@ -52,11 +52,11 @@ Content-Type: text/x-patch
|
|||||||
Content-Transfer-Encoding: 7bit
|
Content-Transfer-Encoding: 7bit
|
||||||
Content-Disposition: attachment; filename=bitpos-ensure-size_t.patch
|
Content-Disposition: attachment; filename=bitpos-ensure-size_t.patch
|
||||||
|
|
||||||
Index: gdb-7.10.90.20160211/gdb/alpha-tdep.c
|
Index: gdb-8.0/gdb/alpha-tdep.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- gdb-7.10.90.20160211.orig/gdb/alpha-tdep.c 2016-02-11 20:56:59.224850729 +0100
|
--- gdb-8.0.orig/gdb/alpha-tdep.c 2017-08-19 20:07:45.469330496 +0200
|
||||||
+++ gdb-7.10.90.20160211/gdb/alpha-tdep.c 2016-02-11 20:57:05.385891225 +0100
|
+++ gdb-8.0/gdb/alpha-tdep.c 2017-08-19 20:07:50.670379152 +0200
|
||||||
@@ -413,6 +413,13 @@
|
@@ -414,6 +414,13 @@
|
||||||
accumulate_size = 0;
|
accumulate_size = 0;
|
||||||
else
|
else
|
||||||
accumulate_size -= sizeof(arg_reg_buffer);
|
accumulate_size -= sizeof(arg_reg_buffer);
|
||||||
@ -70,11 +70,11 @@ Index: gdb-7.10.90.20160211/gdb/alpha-tdep.c
|
|||||||
sp -= accumulate_size;
|
sp -= accumulate_size;
|
||||||
|
|
||||||
/* Keep sp aligned to a multiple of 16 as the ABI requires. */
|
/* Keep sp aligned to a multiple of 16 as the ABI requires. */
|
||||||
Index: gdb-7.10.90.20160211/gdb/cp-valprint.c
|
Index: gdb-8.0/gdb/cp-valprint.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- gdb-7.10.90.20160211.orig/gdb/cp-valprint.c 2016-02-11 20:56:59.224850729 +0100
|
--- gdb-8.0.orig/gdb/cp-valprint.c 2017-08-19 20:07:45.470330505 +0200
|
||||||
+++ gdb-7.10.90.20160211/gdb/cp-valprint.c 2016-02-11 20:57:05.385891225 +0100
|
+++ gdb-8.0/gdb/cp-valprint.c 2017-08-19 20:07:50.670379152 +0200
|
||||||
@@ -536,6 +536,8 @@
|
@@ -537,6 +537,8 @@
|
||||||
gdb_byte *buf;
|
gdb_byte *buf;
|
||||||
struct cleanup *back_to;
|
struct cleanup *back_to;
|
||||||
|
|
||||||
@ -83,32 +83,11 @@ Index: gdb-7.10.90.20160211/gdb/cp-valprint.c
|
|||||||
buf = (gdb_byte *) xmalloc (TYPE_LENGTH (baseclass));
|
buf = (gdb_byte *) xmalloc (TYPE_LENGTH (baseclass));
|
||||||
back_to = make_cleanup (xfree, buf);
|
back_to = make_cleanup (xfree, buf);
|
||||||
|
|
||||||
Index: gdb-7.10.90.20160211/gdb/dwarf2loc.c
|
Index: gdb-8.0/gdb/findcmd.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- gdb-7.10.90.20160211.orig/gdb/dwarf2loc.c 2016-02-11 20:56:59.225850736 +0100
|
--- gdb-8.0.orig/gdb/findcmd.c 2017-08-19 20:07:45.472330524 +0200
|
||||||
+++ gdb-7.10.90.20160211/gdb/dwarf2loc.c 2016-02-11 20:57:05.386891231 +0100
|
+++ gdb-8.0/gdb/findcmd.c 2017-08-19 20:07:50.672379171 +0200
|
||||||
@@ -1744,6 +1744,8 @@
|
@@ -186,6 +186,7 @@
|
||||||
|
|
||||||
this_size = (this_size_bits + source_offset_bits % 8 + 7) / 8;
|
|
||||||
source_offset = source_offset_bits / 8;
|
|
||||||
+ ulongest_fits_host_or_error (this_size);
|
|
||||||
+
|
|
||||||
if (buffer_size < this_size)
|
|
||||||
{
|
|
||||||
buffer_size = this_size;
|
|
||||||
@@ -1926,6 +1928,7 @@
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
+ ulongest_fits_host_or_error (this_size);
|
|
||||||
if (buffer_size < this_size)
|
|
||||||
{
|
|
||||||
buffer_size = this_size;
|
|
||||||
Index: gdb-7.10.90.20160211/gdb/findcmd.c
|
|
||||||
===================================================================
|
|
||||||
--- gdb-7.10.90.20160211.orig/gdb/findcmd.c 2016-02-11 20:56:59.226850742 +0100
|
|
||||||
+++ gdb-7.10.90.20160211/gdb/findcmd.c 2016-02-11 20:57:05.387891238 +0100
|
|
||||||
@@ -184,6 +184,7 @@
|
|
||||||
size_t current_offset = pattern_buf_end - pattern_buf;
|
size_t current_offset = pattern_buf_end - pattern_buf;
|
||||||
|
|
||||||
pattern_buf_size = pattern_buf_size_need * 2;
|
pattern_buf_size = pattern_buf_size_need * 2;
|
||||||
@ -116,11 +95,11 @@ Index: gdb-7.10.90.20160211/gdb/findcmd.c
|
|||||||
pattern_buf = (gdb_byte *) xrealloc (pattern_buf, pattern_buf_size);
|
pattern_buf = (gdb_byte *) xrealloc (pattern_buf, pattern_buf_size);
|
||||||
pattern_buf_end = pattern_buf + current_offset;
|
pattern_buf_end = pattern_buf + current_offset;
|
||||||
}
|
}
|
||||||
Index: gdb-7.10.90.20160211/gdb/p-valprint.c
|
Index: gdb-8.0/gdb/p-valprint.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- gdb-7.10.90.20160211.orig/gdb/p-valprint.c 2016-02-11 20:56:59.226850742 +0100
|
--- gdb-8.0.orig/gdb/p-valprint.c 2017-08-19 20:07:45.472330524 +0200
|
||||||
+++ gdb-7.10.90.20160211/gdb/p-valprint.c 2016-02-11 20:57:05.387891238 +0100
|
+++ gdb-8.0/gdb/p-valprint.c 2017-08-19 20:07:50.673379180 +0200
|
||||||
@@ -769,6 +769,7 @@
|
@@ -772,6 +772,7 @@
|
||||||
gdb_byte *buf;
|
gdb_byte *buf;
|
||||||
struct cleanup *back_to;
|
struct cleanup *back_to;
|
||||||
|
|
||||||
@ -128,11 +107,11 @@ Index: gdb-7.10.90.20160211/gdb/p-valprint.c
|
|||||||
buf = (gdb_byte *) xmalloc (TYPE_LENGTH (baseclass));
|
buf = (gdb_byte *) xmalloc (TYPE_LENGTH (baseclass));
|
||||||
back_to = make_cleanup (xfree, buf);
|
back_to = make_cleanup (xfree, buf);
|
||||||
|
|
||||||
Index: gdb-7.10.90.20160211/gdb/utils.c
|
Index: gdb-8.0/gdb/utils.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- gdb-7.10.90.20160211.orig/gdb/utils.c 2016-02-11 20:56:59.227850749 +0100
|
--- gdb-8.0.orig/gdb/utils.c 2017-08-19 20:07:45.473330533 +0200
|
||||||
+++ gdb-7.10.90.20160211/gdb/utils.c 2016-02-11 20:57:05.388891244 +0100
|
+++ gdb-8.0/gdb/utils.c 2017-08-19 20:07:50.673379180 +0200
|
||||||
@@ -2837,6 +2837,18 @@
|
@@ -2776,6 +2776,18 @@
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,11 +130,11 @@ Index: gdb-7.10.90.20160211/gdb/utils.c
|
|||||||
char *
|
char *
|
||||||
gdb_realpath (const char *filename)
|
gdb_realpath (const char *filename)
|
||||||
{
|
{
|
||||||
Index: gdb-7.10.90.20160211/gdb/valops.c
|
Index: gdb-8.0/gdb/valops.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- gdb-7.10.90.20160211.orig/gdb/valops.c 2016-02-11 20:56:59.228850755 +0100
|
--- gdb-8.0.orig/gdb/valops.c 2017-08-19 20:07:45.474330542 +0200
|
||||||
+++ gdb-7.10.90.20160211/gdb/valops.c 2016-02-11 20:57:05.389891251 +0100
|
+++ gdb-8.0/gdb/valops.c 2017-08-19 20:07:50.674379190 +0200
|
||||||
@@ -2057,6 +2057,7 @@
|
@@ -2100,6 +2100,7 @@
|
||||||
struct cleanup *back_to;
|
struct cleanup *back_to;
|
||||||
CORE_ADDR address;
|
CORE_ADDR address;
|
||||||
|
|
||||||
@ -163,11 +142,11 @@ Index: gdb-7.10.90.20160211/gdb/valops.c
|
|||||||
tmp = (gdb_byte *) xmalloc (TYPE_LENGTH (baseclass));
|
tmp = (gdb_byte *) xmalloc (TYPE_LENGTH (baseclass));
|
||||||
back_to = make_cleanup (xfree, tmp);
|
back_to = make_cleanup (xfree, tmp);
|
||||||
address = value_address (*arg1p);
|
address = value_address (*arg1p);
|
||||||
Index: gdb-7.10.90.20160211/gdb/value.c
|
Index: gdb-8.0/gdb/value.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- gdb-7.10.90.20160211.orig/gdb/value.c 2016-02-11 20:56:59.229850762 +0100
|
--- gdb-8.0.orig/gdb/value.c 2017-08-19 20:07:45.476330561 +0200
|
||||||
+++ gdb-7.10.90.20160211/gdb/value.c 2016-02-11 20:58:35.095480877 +0100
|
+++ gdb-8.0/gdb/value.c 2017-08-19 20:07:50.675379199 +0200
|
||||||
@@ -935,6 +935,7 @@
|
@@ -936,6 +936,7 @@
|
||||||
description correctly. */
|
description correctly. */
|
||||||
check_typedef (type);
|
check_typedef (type);
|
||||||
|
|
||||||
@ -175,7 +154,7 @@ Index: gdb-7.10.90.20160211/gdb/value.c
|
|||||||
val = XCNEW (struct value);
|
val = XCNEW (struct value);
|
||||||
val->contents = NULL;
|
val->contents = NULL;
|
||||||
val->next = all_values;
|
val->next = all_values;
|
||||||
@@ -1034,6 +1035,8 @@
|
@@ -1033,6 +1034,8 @@
|
||||||
static void
|
static void
|
||||||
allocate_value_contents (struct value *val)
|
allocate_value_contents (struct value *val)
|
||||||
{
|
{
|
||||||
@ -184,7 +163,7 @@ Index: gdb-7.10.90.20160211/gdb/value.c
|
|||||||
if (!val->contents)
|
if (!val->contents)
|
||||||
{
|
{
|
||||||
check_type_length_before_alloc (val->enclosing_type);
|
check_type_length_before_alloc (val->enclosing_type);
|
||||||
@@ -3090,6 +3093,7 @@
|
@@ -3093,6 +3096,7 @@
|
||||||
if (TYPE_LENGTH (new_encl_type) > TYPE_LENGTH (value_enclosing_type (val)))
|
if (TYPE_LENGTH (new_encl_type) > TYPE_LENGTH (value_enclosing_type (val)))
|
||||||
{
|
{
|
||||||
check_type_length_before_alloc (new_encl_type);
|
check_type_length_before_alloc (new_encl_type);
|
||||||
@ -192,10 +171,10 @@ Index: gdb-7.10.90.20160211/gdb/value.c
|
|||||||
val->contents
|
val->contents
|
||||||
= (gdb_byte *) xrealloc (val->contents, TYPE_LENGTH (new_encl_type));
|
= (gdb_byte *) xrealloc (val->contents, TYPE_LENGTH (new_encl_type));
|
||||||
}
|
}
|
||||||
Index: gdb-7.10.90.20160211/gdb/vax-tdep.c
|
Index: gdb-8.0/gdb/vax-tdep.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- gdb-7.10.90.20160211.orig/gdb/vax-tdep.c 2016-02-11 20:56:59.229850762 +0100
|
--- gdb-8.0.orig/gdb/vax-tdep.c 2017-08-19 20:07:45.476330561 +0200
|
||||||
+++ gdb-7.10.90.20160211/gdb/vax-tdep.c 2016-02-11 20:57:05.391891264 +0100
|
+++ gdb-8.0/gdb/vax-tdep.c 2017-08-19 20:07:50.675379199 +0200
|
||||||
@@ -219,6 +219,7 @@
|
@@ -219,6 +219,7 @@
|
||||||
ULONGEST addr;
|
ULONGEST addr;
|
||||||
|
|
||||||
@ -204,11 +183,11 @@ Index: gdb-7.10.90.20160211/gdb/vax-tdep.c
|
|||||||
read_memory (addr, readbuf, len);
|
read_memory (addr, readbuf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
Index: gdb-7.10.90.20160211/gdb/defs.h
|
Index: gdb-8.0/gdb/defs.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- gdb-7.10.90.20160211.orig/gdb/defs.h 2016-02-11 20:56:59.229850762 +0100
|
--- gdb-8.0.orig/gdb/defs.h 2017-08-19 20:07:45.476330561 +0200
|
||||||
+++ gdb-7.10.90.20160211/gdb/defs.h 2016-02-11 20:57:05.391891264 +0100
|
+++ gdb-8.0/gdb/defs.h 2017-08-19 20:07:50.676379208 +0200
|
||||||
@@ -690,4 +690,6 @@
|
@@ -750,4 +750,6 @@
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
77
gdb.spec
77
gdb.spec
@ -26,7 +26,7 @@ Version: 8.0
|
|||||||
|
|
||||||
# The release always contains a leading reserved number, start it at 1.
|
# The release always contains a leading reserved number, start it at 1.
|
||||||
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
||||||
Release: 22%{?dist}
|
Release: 23%{?dist}
|
||||||
|
|
||||||
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and LGPLv3+ and BSD and Public Domain and GFDL
|
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and LGPLv3+ and BSD and Public Domain and GFDL
|
||||||
Group: Development/Debuggers
|
Group: Development/Debuggers
|
||||||
@ -689,6 +689,43 @@ Patch1155: gdb-rhbz1398387-tab-crash-test.patch
|
|||||||
#=push+jan
|
#=push+jan
|
||||||
Patch1171: v1.6.1-implicit-fallthrough.patch
|
Patch1171: v1.6.1-implicit-fallthrough.patch
|
||||||
|
|
||||||
|
# [s390x] Backport arch12 support and other s390x fixes (RH BZ 1420304).
|
||||||
|
Patch1210: gdb-rhbz1420304-s390x-01of35.patch
|
||||||
|
Patch1211: gdb-rhbz1420304-s390x-02of35.patch
|
||||||
|
Patch1212: gdb-rhbz1420304-s390x-03of35.patch
|
||||||
|
Patch1213: gdb-rhbz1420304-s390x-04of35.patch
|
||||||
|
Patch1214: gdb-rhbz1420304-s390x-05of35.patch
|
||||||
|
Patch1215: gdb-rhbz1420304-s390x-06of35.patch
|
||||||
|
Patch1216: gdb-rhbz1420304-s390x-07of35.patch
|
||||||
|
Patch1217: gdb-rhbz1420304-s390x-08of35.patch
|
||||||
|
Patch1218: gdb-rhbz1420304-s390x-09of35.patch
|
||||||
|
Patch1219: gdb-rhbz1420304-s390x-10of35.patch
|
||||||
|
Patch1220: gdb-rhbz1420304-s390x-11of35.patch
|
||||||
|
Patch1221: gdb-rhbz1420304-s390x-12of35.patch
|
||||||
|
Patch1222: gdb-rhbz1420304-s390x-13of35.patch
|
||||||
|
Patch1223: gdb-rhbz1420304-s390x-14of35.patch
|
||||||
|
Patch1224: gdb-rhbz1420304-s390x-15of35.patch
|
||||||
|
Patch1225: gdb-rhbz1420304-s390x-16of35.patch
|
||||||
|
Patch1226: gdb-rhbz1420304-s390x-17of35.patch
|
||||||
|
Patch1227: gdb-rhbz1420304-s390x-18of35.patch
|
||||||
|
Patch1228: gdb-rhbz1420304-s390x-19of35.patch
|
||||||
|
Patch1229: gdb-rhbz1420304-s390x-20of35.patch
|
||||||
|
Patch1230: gdb-rhbz1420304-s390x-21of35.patch
|
||||||
|
Patch1231: gdb-rhbz1420304-s390x-22of35.patch
|
||||||
|
Patch1232: gdb-rhbz1420304-s390x-23of35.patch
|
||||||
|
Patch1233: gdb-rhbz1420304-s390x-24of35.patch
|
||||||
|
Patch1234: gdb-rhbz1420304-s390x-25of35.patch
|
||||||
|
Patch1235: gdb-rhbz1420304-s390x-26of35.patch
|
||||||
|
Patch1236: gdb-rhbz1420304-s390x-27of35.patch
|
||||||
|
Patch1237: gdb-rhbz1420304-s390x-28of35.patch
|
||||||
|
Patch1238: gdb-rhbz1420304-s390x-29of35.patch
|
||||||
|
Patch1239: gdb-rhbz1420304-s390x-30of35.patch
|
||||||
|
Patch1240: gdb-rhbz1420304-s390x-31of35.patch
|
||||||
|
Patch1241: gdb-rhbz1420304-s390x-32of35.patch
|
||||||
|
Patch1242: gdb-rhbz1420304-s390x-33of35.patch
|
||||||
|
Patch1243: gdb-rhbz1420304-s390x-34of35.patch
|
||||||
|
Patch1244: gdb-rhbz1420304-s390x-35of35.patch
|
||||||
|
|
||||||
%if 0%{!?rhel:1} || 0%{?rhel} > 6
|
%if 0%{!?rhel:1} || 0%{?rhel} > 6
|
||||||
# RL_STATE_FEDORA_GDB would not be found for:
|
# RL_STATE_FEDORA_GDB would not be found for:
|
||||||
# Patch642: gdb-readline62-ask-more-rh.patch
|
# Patch642: gdb-readline62-ask-more-rh.patch
|
||||||
@ -1012,6 +1049,41 @@ find -name "*.info*"|xargs rm -f
|
|||||||
%patch690 -p1
|
%patch690 -p1
|
||||||
%patch698 -p1
|
%patch698 -p1
|
||||||
%patch703 -p1
|
%patch703 -p1
|
||||||
|
%patch1210 -p1
|
||||||
|
%patch1211 -p1
|
||||||
|
%patch1212 -p1
|
||||||
|
%patch1213 -p1
|
||||||
|
%patch1214 -p1
|
||||||
|
%patch1215 -p1
|
||||||
|
%patch1216 -p1
|
||||||
|
%patch1217 -p1
|
||||||
|
%patch1218 -p1
|
||||||
|
%patch1219 -p1
|
||||||
|
%patch1220 -p1
|
||||||
|
%patch1221 -p1
|
||||||
|
%patch1222 -p1
|
||||||
|
%patch1223 -p1
|
||||||
|
%patch1224 -p1
|
||||||
|
%patch1225 -p1
|
||||||
|
%patch1226 -p1
|
||||||
|
%patch1227 -p1
|
||||||
|
%patch1228 -p1
|
||||||
|
%patch1229 -p1
|
||||||
|
%patch1230 -p1
|
||||||
|
%patch1231 -p1
|
||||||
|
%patch1232 -p1
|
||||||
|
%patch1233 -p1
|
||||||
|
%patch1234 -p1
|
||||||
|
%patch1235 -p1
|
||||||
|
%patch1236 -p1
|
||||||
|
%patch1237 -p1
|
||||||
|
%patch1238 -p1
|
||||||
|
%patch1239 -p1
|
||||||
|
%patch1240 -p1
|
||||||
|
%patch1241 -p1
|
||||||
|
%patch1242 -p1
|
||||||
|
%patch1243 -p1
|
||||||
|
%patch1244 -p1
|
||||||
%patch811 -p1
|
%patch811 -p1
|
||||||
%patch812 -p1
|
%patch812 -p1
|
||||||
%patch813 -p1
|
%patch813 -p1
|
||||||
@ -1643,6 +1715,9 @@ then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Sat Aug 19 2017 Jan Kratochvil <jan.kratochvil@redhat.com> - 8.0-23.fc26
|
||||||
|
- [s390x] Backport arch12 support and other s390x fixes (RH BZ 1420304).
|
||||||
|
|
||||||
* Fri Aug 18 2017 Jan Kratochvil <jan.kratochvil@redhat.com> - 8.0-22.fc26
|
* Fri Aug 18 2017 Jan Kratochvil <jan.kratochvil@redhat.com> - 8.0-22.fc26
|
||||||
- Backport a fix for clang && -gsplit-dwarf debuggees (RH BZ 1482892).
|
- Backport a fix for clang && -gsplit-dwarf debuggees (RH BZ 1482892).
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user