public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/gdb] gdb-17.2-rebase-f44: [s390x] Backport arch12 support and other s390x fixes (RH BZ 1420304).
@ 2026-06-27 23:58 Jan Kratochvil
0 siblings, 0 replies; only message in thread
From: Jan Kratochvil @ 2026-06-27 23:58 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/gdb
Branch : gdb-17.2-rebase-f44
Commit : 4f1de05c3fac677d47f66cf08f8695ad3f41a168
Author : Jan Kratochvil <jan.kratochvil@redhat.com>
Date : 2017-08-19T22:40:32+02:00
Stats : +4770/-374 in 38 file(s)
URL : https://src.fedoraproject.org/rpms/gdb/c/4f1de05c3fac677d47f66cf08f8695ad3f41a168?branch=gdb-17.2-rebase-f44
Log:
[s390x] Backport arch12 support and other s390x fixes (RH BZ 1420304).
---
diff --git a/gdb-rhbz1420304-s390x-01of35.patch b/gdb-rhbz1420304-s390x-01of35.patch
new file mode 100644
index 0000000..206bdd9
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-01of35.patch
@@ -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);
diff --git a/gdb-rhbz1420304-s390x-02of35.patch b/gdb-rhbz1420304-s390x-02of35.patch
new file mode 100644
index 0000000..277f505
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-02of35.patch
@@ -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
diff --git a/gdb-rhbz1420304-s390x-03of35.patch b/gdb-rhbz1420304-s390x-03of35.patch
new file mode 100644
index 0000000..e9b1c5f
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-03of35.patch
@@ -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 */
diff --git a/gdb-rhbz1420304-s390x-04of35.patch b/gdb-rhbz1420304-s390x-04of35.patch
new file mode 100644
index 0000000..6ce0818
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-04of35.patch
@@ -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 {
diff --git a/gdb-rhbz1420304-s390x-05of35.patch b/gdb-rhbz1420304-s390x-05of35.patch
new file mode 100644
index 0000000..ea362a3
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-05of35.patch
@@ -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
+
diff --git a/gdb-rhbz1420304-s390x-06of35.patch b/gdb-rhbz1420304-s390x-06of35.patch
new file mode 100644
index 0000000..bb43cdf
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-06of35.patch
@@ -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
diff --git a/gdb-rhbz1420304-s390x-07of35.patch b/gdb-rhbz1420304-s390x-07of35.patch
new file mode 100644
index 0000000..492a894
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-07of35.patch
@@ -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
diff --git a/gdb-rhbz1420304-s390x-08of35.patch b/gdb-rhbz1420304-s390x-08of35.patch
new file mode 100644
index 0000000..70338c3
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-08of35.patch
@@ -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
+
diff --git a/gdb-rhbz1420304-s390x-09of35.patch b/gdb-rhbz1420304-s390x-09of35.patch
new file mode 100644
index 0000000..ed2fada
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-09of35.patch
@@ -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;
diff --git a/gdb-rhbz1420304-s390x-10of35.patch b/gdb-rhbz1420304-s390x-10of35.patch
new file mode 100644
index 0000000..f60485c
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-10of35.patch
@@ -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
+ }
diff --git a/gdb-rhbz1420304-s390x-11of35.patch b/gdb-rhbz1420304-s390x-11of35.patch
new file mode 100644
index 0000000..b02f094
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-11of35.patch
@@ -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" \
diff --git a/gdb-rhbz1420304-s390x-12of35.patch b/gdb-rhbz1420304-s390x-12of35.patch
new file mode 100644
index 0000000..811d9e6
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-12of35.patch
@@ -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>"
diff --git a/gdb-rhbz1420304-s390x-13of35.patch b/gdb-rhbz1420304-s390x-13of35.patch
new file mode 100644
index 0000000..dbde90a
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-13of35.patch
@@ -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
diff --git a/gdb-rhbz1420304-s390x-14of35.patch b/gdb-rhbz1420304-s390x-14of35.patch
new file mode 100644
index 0000000..aecc39d
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-14of35.patch
@@ -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
diff --git a/gdb-rhbz1420304-s390x-15of35.patch b/gdb-rhbz1420304-s390x-15of35.patch
new file mode 100644
index 0000000..1fa4a2b
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-15of35.patch
@@ -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)
diff --git a/gdb-rhbz1420304-s390x-16of35.patch b/gdb-rhbz1420304-s390x-16of35.patch
new file mode 100644
index 0000000..c829d51
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-16of35.patch
@@ -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;
diff --git a/gdb-rhbz1420304-s390x-17of35.patch b/gdb-rhbz1420304-s390x-17of35.patch
new file mode 100644
index 0000000..7345133
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-17of35.patch
@@ -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);
diff --git a/gdb-rhbz1420304-s390x-18of35.patch b/gdb-rhbz1420304-s390x-18of35.patch
new file mode 100644
index 0000000..e536591
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-18of35.patch
@@ -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;
diff --git a/gdb-rhbz1420304-s390x-19of35.patch b/gdb-rhbz1420304-s390x-19of35.patch
new file mode 100644
index 0000000..9b5b190
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-19of35.patch
@@ -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"
diff --git a/gdb-rhbz1420304-s390x-20of35.patch b/gdb-rhbz1420304-s390x-20of35.patch
new file mode 100644
index 0000000..5c80735
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-20of35.patch
@@ -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;
+ }
diff --git a/gdb-rhbz1420304-s390x-21of35.patch b/gdb-rhbz1420304-s390x-21of35.patch
new file mode 100644
index 0000000..65f9c91
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-21of35.patch
@@ -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"
diff --git a/gdb-rhbz1420304-s390x-22of35.patch b/gdb-rhbz1420304-s390x-22of35.patch
new file mode 100644
index 0000000..2ca9f10
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-22of35.patch
@@ -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)));
diff --git a/gdb-rhbz1420304-s390x-23of35.patch b/gdb-rhbz1420304-s390x-23of35.patch
new file mode 100644
index 0000000..4253729
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-23of35.patch
@@ -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"
diff --git a/gdb-rhbz1420304-s390x-24of35.patch b/gdb-rhbz1420304-s390x-24of35.patch
new file mode 100644
index 0000000..4bf34f9
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-24of35.patch
@@ -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;
+ }
+ }
+
diff --git a/gdb-rhbz1420304-s390x-25of35.patch b/gdb-rhbz1420304-s390x-25of35.patch
new file mode 100644
index 0000000..dfa366c
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-25of35.patch
@@ -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);
+
diff --git a/gdb-rhbz1420304-s390x-26of35.patch b/gdb-rhbz1420304-s390x-26of35.patch
new file mode 100644
index 0000000..c460794
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-26of35.patch
@@ -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:
diff --git a/gdb-rhbz1420304-s390x-27of35.patch b/gdb-rhbz1420304-s390x-27of35.patch
new file mode 100644
index 0000000..ad1fa0e
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-27of35.patch
@@ -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
diff --git a/gdb-rhbz1420304-s390x-28of35.patch b/gdb-rhbz1420304-s390x-28of35.patch
new file mode 100644
index 0000000..67dd28b
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-28of35.patch
@@ -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."
diff --git a/gdb-rhbz1420304-s390x-29of35.patch b/gdb-rhbz1420304-s390x-29of35.patch
new file mode 100644
index 0000000..9e9312e
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-29of35.patch
@@ -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)
diff --git a/gdb-rhbz1420304-s390x-30of35.patch b/gdb-rhbz1420304-s390x-30of35.patch
new file mode 100644
index 0000000..056e4d3
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-30of35.patch
@@ -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;
+ }
diff --git a/gdb-rhbz1420304-s390x-31of35.patch b/gdb-rhbz1420304-s390x-31of35.patch
new file mode 100644
index 0000000..84d06e5
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-31of35.patch
@@ -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. */
diff --git a/gdb-rhbz1420304-s390x-32of35.patch b/gdb-rhbz1420304-s390x-32of35.patch
new file mode 100644
index 0000000..a7f6624
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-32of35.patch
@@ -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])
diff --git a/gdb-rhbz1420304-s390x-33of35.patch b/gdb-rhbz1420304-s390x-33of35.patch
new file mode 100644
index 0000000..31c0021
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-33of35.patch
@@ -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);
diff --git a/gdb-rhbz1420304-s390x-34of35.patch b/gdb-rhbz1420304-s390x-34of35.patch
new file mode 100644
index 0000000..75466d5
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-34of35.patch
@@ -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;
+ }
+
diff --git a/gdb-rhbz1420304-s390x-35of35.patch b/gdb-rhbz1420304-s390x-35of35.patch
new file mode 100644
index 0000000..007e81f
--- /dev/null
+++ b/gdb-rhbz1420304-s390x-35of35.patch
@@ -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++)
diff --git a/gdb-rhbz795424-bitpos-20of25.patch b/gdb-rhbz795424-bitpos-20of25.patch
index 518f87b..e8d816d 100644
--- a/gdb-rhbz795424-bitpos-20of25.patch
+++ b/gdb-rhbz795424-bitpos-20of25.patch
@@ -463,10 +463,10 @@ Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=bitpos-main.patch
-Index: gdb-7.99.90.20170420/gdb/ada-lang.c
+Index: gdb-8.0/gdb/ada-lang.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/ada-lang.c 2017-04-20 23:08:54.142394671 +0200
-+++ gdb-7.99.90.20170420/gdb/ada-lang.c 2017-04-20 23:08:56.967410590 +0200
+--- gdb-8.0.orig/gdb/ada-lang.c 2017-08-19 20:04:59.785780501 +0200
++++ gdb-8.0/gdb/ada-lang.c 2017-08-19 20:05:10.056876589 +0200
@@ -76,7 +76,7 @@
static struct value *desc_bounds (struct value *);
@@ -850,10 +850,10 @@ Index: gdb-7.99.90.20170420/gdb/ada-lang.c
int elt_bitsize = TYPE_FIELD_BITSIZE (type0, 0);
TYPE_FIELD_BITSIZE (result, 0) = TYPE_FIELD_BITSIZE (type0, 0);
-Index: gdb-7.99.90.20170420/gdb/ada-lang.h
+Index: gdb-8.0/gdb/ada-lang.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/ada-lang.h 2017-04-20 23:08:54.143394676 +0200
-+++ gdb-7.99.90.20170420/gdb/ada-lang.h 2017-04-20 23:08:56.967410590 +0200
+--- gdb-8.0.orig/gdb/ada-lang.h 2017-08-19 20:04:59.786780510 +0200
++++ gdb-8.0/gdb/ada-lang.h 2017-08-19 20:05:10.056876589 +0200
@@ -168,7 +168,7 @@
extern void ada_print_typedef (struct type *type, struct symbol *new_symbol,
struct ui_file *stream);
@@ -881,10 +881,10 @@ Index: gdb-7.99.90.20170420/gdb/ada-lang.h
struct type *);
extern struct type *ada_coerce_to_simple_array_type (struct type *);
-Index: gdb-7.99.90.20170420/gdb/ada-typeprint.c
+Index: gdb-8.0/gdb/ada-typeprint.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/ada-typeprint.c 2017-04-20 23:08:54.143394676 +0200
-+++ gdb-7.99.90.20170420/gdb/ada-typeprint.c 2017-04-20 23:08:56.967410590 +0200
+--- gdb-8.0.orig/gdb/ada-typeprint.c 2017-08-19 20:04:59.786780510 +0200
++++ gdb-8.0/gdb/ada-typeprint.c 2017-08-19 20:05:10.057876598 +0200
@@ -891,8 +891,8 @@
const char *name = ada_type_name (type);
@@ -906,10 +906,10 @@ Index: gdb-7.99.90.20170420/gdb/ada-typeprint.c
break;
case TYPE_CODE_ENUM:
if (show < 0)
-Index: gdb-7.99.90.20170420/gdb/ada-valprint.c
+Index: gdb-8.0/gdb/ada-valprint.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/ada-valprint.c 2017-04-20 23:08:54.144394682 +0200
-+++ gdb-7.99.90.20170420/gdb/ada-valprint.c 2017-04-20 23:08:56.968410595 +0200
+--- gdb-8.0.orig/gdb/ada-valprint.c 2017-08-19 20:04:59.787780520 +0200
++++ gdb-8.0/gdb/ada-valprint.c 2017-08-19 20:05:10.057876598 +0200
@@ -33,11 +33,11 @@
#include "objfiles.h"
@@ -1054,10 +1054,10 @@ Index: gdb-7.99.90.20170420/gdb/ada-valprint.c
struct ui_file *stream, int recurse,
struct value *val,
const struct value_print_options *options)
-Index: gdb-7.99.90.20170420/gdb/annotate.c
+Index: gdb-8.0/gdb/annotate.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/annotate.c 2017-04-20 23:08:54.144394682 +0200
-+++ gdb-7.99.90.20170420/gdb/annotate.c 2017-04-20 23:08:56.968410595 +0200
+--- gdb-8.0.orig/gdb/annotate.c 2017-08-19 20:04:59.787780520 +0200
++++ gdb-8.0/gdb/annotate.c 2017-08-19 20:05:10.057876598 +0200
@@ -533,21 +533,21 @@
}
\f
@@ -1084,10 +1084,10 @@ Index: gdb-7.99.90.20170420/gdb/annotate.c
}
void
-Index: gdb-7.99.90.20170420/gdb/annotate.h
+Index: gdb-8.0/gdb/annotate.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/annotate.h 2017-04-20 23:08:54.145394688 +0200
-+++ gdb-7.99.90.20170420/gdb/annotate.h 2017-04-20 23:08:56.968410595 +0200
+--- gdb-8.0.orig/gdb/annotate.h 2017-08-19 20:04:59.788780529 +0200
++++ gdb-8.0/gdb/annotate.h 2017-08-19 20:05:10.058876607 +0200
@@ -92,8 +92,8 @@
extern void annotate_frame_where (void);
extern void annotate_frame_end (void);
@@ -1099,11 +1099,11 @@ Index: gdb-7.99.90.20170420/gdb/annotate.h
extern void annotate_elt_rep_end (void);
extern void annotate_elt (void);
extern void annotate_array_section_end (void);
-Index: gdb-7.99.90.20170420/gdb/arm-linux-nat.c
+Index: gdb-8.0/gdb/arm-linux-nat.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/arm-linux-nat.c 2017-04-20 23:08:54.145394688 +0200
-+++ gdb-7.99.90.20170420/gdb/arm-linux-nat.c 2017-04-20 23:08:56.969410601 +0200
-@@ -1065,7 +1065,7 @@
+--- gdb-8.0.orig/gdb/arm-linux-nat.c 2017-08-19 20:04:59.788780529 +0200
++++ gdb-8.0/gdb/arm-linux-nat.c 2017-08-19 20:05:10.058876607 +0200
+@@ -1067,7 +1067,7 @@
ADDR? */
static int
arm_linux_region_ok_for_hw_watchpoint (struct target_ops *self,
@@ -1112,10 +1112,10 @@ Index: gdb-7.99.90.20170420/gdb/arm-linux-nat.c
{
const struct arm_linux_hwbp_cap *cap = arm_linux_get_hwbp_cap ();
CORE_ADDR max_wp_length, aligned_addr;
-Index: gdb-7.99.90.20170420/gdb/ax-gdb.c
+Index: gdb-8.0/gdb/ax-gdb.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/ax-gdb.c 2017-04-20 23:08:54.146394694 +0200
-+++ gdb-7.99.90.20170420/gdb/ax-gdb.c 2017-04-20 23:10:24.154901877 +0200
+--- gdb-8.0.orig/gdb/ax-gdb.c 2017-08-19 20:04:59.789780538 +0200
++++ gdb-8.0/gdb/ax-gdb.c 2017-08-19 20:05:10.059876617 +0200
@@ -83,12 +83,12 @@
static void gen_sign_extend (struct agent_expr *, struct type *);
static void gen_extend (struct agent_expr *, struct type *);
@@ -1214,10 +1214,10 @@ Index: gdb-7.99.90.20170420/gdb/ax-gdb.c
{
int i, rslt;
int nbases = TYPE_N_BASECLASSES (type);
-Index: gdb-7.99.90.20170420/gdb/ax-general.c
+Index: gdb-8.0/gdb/ax-general.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/ax-general.c 2017-04-20 23:08:54.147394699 +0200
-+++ gdb-7.99.90.20170420/gdb/ax-general.c 2017-04-20 23:08:56.970410606 +0200
+--- gdb-8.0.orig/gdb/ax-general.c 2017-08-19 20:04:59.789780538 +0200
++++ gdb-8.0/gdb/ax-general.c 2017-08-19 20:05:10.059876617 +0200
@@ -177,7 +177,7 @@
/* Append a trace_quick instruction to EXPR, to record N bytes. */
@@ -1227,10 +1227,10 @@ Index: gdb-7.99.90.20170420/gdb/ax-general.c
{
/* N must fit in a byte. */
if (n < 0 || n > 255)
-Index: gdb-7.99.90.20170420/gdb/ax.h
+Index: gdb-8.0/gdb/ax.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/ax.h 2017-04-20 23:08:54.147394699 +0200
-+++ gdb-7.99.90.20170420/gdb/ax.h 2017-04-20 23:08:56.970410606 +0200
+--- gdb-8.0.orig/gdb/ax.h 2017-08-19 20:04:59.789780538 +0200
++++ gdb-8.0/gdb/ax.h 2017-08-19 20:05:10.059876617 +0200
@@ -205,7 +205,7 @@
extern void ax_zero_ext (struct agent_expr *EXPR, int N);
@@ -1240,10 +1240,10 @@ Index: gdb-7.99.90.20170420/gdb/ax.h
/* Append a goto op to EXPR. OP is the actual op (must be aop_goto or
aop_if_goto). We assume we don't know the target offset yet,
-Index: gdb-7.99.90.20170420/gdb/breakpoint.c
+Index: gdb-8.0/gdb/breakpoint.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/breakpoint.c 2017-04-20 23:08:54.151394722 +0200
-+++ gdb-7.99.90.20170420/gdb/breakpoint.c 2017-04-20 23:08:56.973410623 +0200
+--- gdb-8.0.orig/gdb/breakpoint.c 2017-08-19 20:04:59.792780566 +0200
++++ gdb-8.0/gdb/breakpoint.c 2017-08-19 20:05:10.063876654 +0200
@@ -2225,9 +2225,9 @@
{
fprintf_unfiltered (gdb_stdlog,
@@ -1274,10 +1274,10 @@ Index: gdb-7.99.90.20170420/gdb/breakpoint.c
int num_regs;
len = (target_exact_watchpoints
-Index: gdb-7.99.90.20170420/gdb/breakpoint.h
+Index: gdb-8.0/gdb/breakpoint.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/breakpoint.h 2017-04-20 23:08:54.152394727 +0200
-+++ gdb-7.99.90.20170420/gdb/breakpoint.h 2017-04-20 23:08:56.974410629 +0200
+--- gdb-8.0.orig/gdb/breakpoint.h 2017-08-19 20:04:59.793780576 +0200
++++ gdb-8.0/gdb/breakpoint.h 2017-08-19 20:05:10.063876654 +0200
@@ -250,7 +250,7 @@
/* If this is a ranged breakpoint, then this field contains the
@@ -1296,10 +1296,10 @@ Index: gdb-7.99.90.20170420/gdb/breakpoint.h
/* Type of hardware watchpoint. */
enum target_hw_bp_type watchpoint_type;
-Index: gdb-7.99.90.20170420/gdb/c-lang.c
+Index: gdb-8.0/gdb/c-lang.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/c-lang.c 2017-04-20 23:08:54.152394727 +0200
-+++ gdb-7.99.90.20170420/gdb/c-lang.c 2017-04-20 23:08:56.974410629 +0200
+--- gdb-8.0.orig/gdb/c-lang.c 2017-08-19 20:04:59.793780576 +0200
++++ gdb-8.0/gdb/c-lang.c 2017-08-19 20:05:10.064876663 +0200
@@ -186,7 +186,7 @@
void
@@ -1327,10 +1327,10 @@ Index: gdb-7.99.90.20170420/gdb/c-lang.c
if (get_discrete_bounds (TYPE_INDEX_TYPE (expect_type),
&low_bound, &high_bound) < 0)
-Index: gdb-7.99.90.20170420/gdb/c-lang.h
+Index: gdb-8.0/gdb/c-lang.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/c-lang.h 2017-04-20 23:08:54.152394727 +0200
-+++ gdb-7.99.90.20170420/gdb/c-lang.h 2017-04-20 23:08:56.974410629 +0200
+--- gdb-8.0.orig/gdb/c-lang.h 2017-08-19 20:04:59.793780576 +0200
++++ gdb-8.0/gdb/c-lang.h 2017-08-19 20:05:10.064876663 +0200
@@ -77,7 +77,7 @@
struct ui_file *);
@@ -1349,10 +1349,10 @@ Index: gdb-7.99.90.20170420/gdb/c-lang.h
const char *user_encoding,
int force_ellipses,
const struct value_print_options *options);
-Index: gdb-7.99.90.20170420/gdb/c-valprint.c
+Index: gdb-8.0/gdb/c-valprint.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/c-valprint.c 2017-04-20 23:08:54.153394733 +0200
-+++ gdb-7.99.90.20170420/gdb/c-valprint.c 2017-04-20 23:08:56.975410634 +0200
+--- gdb-8.0.orig/gdb/c-valprint.c 2017-08-19 20:04:59.794780585 +0200
++++ gdb-8.0/gdb/c-valprint.c 2017-08-19 20:05:10.064876663 +0200
@@ -244,7 +244,7 @@
if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (unresolved_elttype) > 0)
{
@@ -1391,10 +1391,10 @@ Index: gdb-7.99.90.20170420/gdb/c-valprint.c
struct ui_file *stream, int recurse,
struct value *original_value,
const struct value_print_options *options)
-Index: gdb-7.99.90.20170420/gdb/cp-abi.c
+Index: gdb-8.0/gdb/cp-abi.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/cp-abi.c 2017-04-20 23:08:54.153394733 +0200
-+++ gdb-7.99.90.20170420/gdb/cp-abi.c 2017-04-20 23:08:56.975410634 +0200
+--- gdb-8.0.orig/gdb/cp-abi.c 2017-08-19 20:04:59.794780585 +0200
++++ gdb-8.0/gdb/cp-abi.c 2017-08-19 20:05:10.065876673 +0200
@@ -64,12 +64,12 @@
return (*current_cp_abi.is_operator_name) (name);
}
@@ -1419,10 +1419,10 @@ Index: gdb-7.99.90.20170420/gdb/cp-abi.c
{
if ((current_cp_abi.virtual_fn_field) == NULL)
return NULL;
-Index: gdb-7.99.90.20170420/gdb/cp-abi.h
+Index: gdb-8.0/gdb/cp-abi.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/cp-abi.h 2017-04-20 23:08:54.153394733 +0200
-+++ gdb-7.99.90.20170420/gdb/cp-abi.h 2017-04-20 23:08:56.975410634 +0200
+--- gdb-8.0.orig/gdb/cp-abi.h 2017-08-19 20:04:59.794780585 +0200
++++ gdb-8.0/gdb/cp-abi.h 2017-08-19 20:05:10.065876673 +0200
@@ -108,7 +108,7 @@
struct fn_field *f,
int j,
@@ -1466,10 +1466,10 @@ Index: gdb-7.99.90.20170420/gdb/cp-abi.h
void (*print_method_ptr) (const gdb_byte *contents,
struct type *type,
struct ui_file *stream);
-Index: gdb-7.99.90.20170420/gdb/cp-valprint.c
+Index: gdb-8.0/gdb/cp-valprint.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/cp-valprint.c 2017-04-20 23:08:54.153394733 +0200
-+++ gdb-7.99.90.20170420/gdb/cp-valprint.c 2017-04-20 23:08:56.975410634 +0200
+--- gdb-8.0.orig/gdb/cp-valprint.c 2017-08-19 20:04:59.794780585 +0200
++++ gdb-8.0/gdb/cp-valprint.c 2017-08-19 20:05:10.065876673 +0200
@@ -336,7 +336,7 @@
}
else if (i == vptr_fieldno && type == vptr_basetype)
@@ -1479,10 +1479,10 @@ Index: gdb-7.99.90.20170420/gdb/cp-valprint.c
struct type *i_type = TYPE_FIELD_TYPE (type, i);
if (valprint_check_validity (stream, i_type, i_offset, val))
-Index: gdb-7.99.90.20170420/gdb/d-lang.h
+Index: gdb-8.0/gdb/d-lang.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/d-lang.h 2017-04-20 23:08:54.153394733 +0200
-+++ gdb-7.99.90.20170420/gdb/d-lang.h 2017-04-20 23:08:56.975410634 +0200
+--- gdb-8.0.orig/gdb/d-lang.h 2017-08-19 20:04:59.794780585 +0200
++++ gdb-8.0/gdb/d-lang.h 2017-08-19 20:05:10.065876673 +0200
@@ -81,7 +81,7 @@
/* Defined in d-valprint.c */
@@ -1492,10 +1492,10 @@ Index: gdb-7.99.90.20170420/gdb/d-lang.h
struct ui_file *stream, int recurse,
struct value *val,
const struct value_print_options *options);
-Index: gdb-7.99.90.20170420/gdb/d-valprint.c
+Index: gdb-8.0/gdb/d-valprint.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/d-valprint.c 2017-04-20 23:08:54.154394739 +0200
-+++ gdb-7.99.90.20170420/gdb/d-valprint.c 2017-04-20 23:08:56.976410640 +0200
+--- gdb-8.0.orig/gdb/d-valprint.c 2017-08-19 20:04:59.794780585 +0200
++++ gdb-8.0/gdb/d-valprint.c 2017-08-19 20:05:10.065876673 +0200
@@ -73,7 +73,7 @@
/* Implements the la_val_print routine for language D. */
@@ -1505,63 +1505,20 @@ Index: gdb-7.99.90.20170420/gdb/d-valprint.c
CORE_ADDR address, struct ui_file *stream, int recurse,
struct value *val,
const struct value_print_options *options)
-Index: gdb-7.99.90.20170420/gdb/dwarf2loc.c
+Index: gdb-8.0/gdb/dwarf2loc.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/dwarf2loc.c 2017-04-20 23:08:54.156394750 +0200
-+++ gdb-7.99.90.20170420/gdb/dwarf2loc.c 2017-04-20 23:11:23.138266582 +0200
-@@ -1761,12 +1761,12 @@
- read_pieced_value (struct value *v)
- {
- int i;
-- long offset = 0;
-+ LONGEST offset = 0;
- ULONGEST bits_to_skip;
- gdb_byte *contents;
- struct piece_closure *c
- = (struct piece_closure *) value_computed_closure (v);
-- size_t type_len;
-+ ULONGEST type_len;
- size_t buffer_size = 0;
- std::vector<gdb_byte> buffer;
- int bits_big_endian
-@@ -1790,8 +1790,8 @@
- for (i = 0; i < c->n_pieces && offset < type_len; i++)
- {
- struct dwarf_expr_piece *p = &c->pieces[i];
-- size_t this_size, this_size_bits;
-- long dest_offset_bits, source_offset_bits, source_offset;
-+ ULONGEST this_size, this_size_bits;
-+ LONGEST dest_offset_bits, source_offset_bits, source_offset;
- const gdb_byte *intermediate_buffer;
-
- /* Compute size, source, and destination offsets for copying, in
-@@ -1930,12 +1930,12 @@
- write_pieced_value (struct value *to, struct value *from)
- {
- int i;
-- long offset = 0;
-+ LONGEST offset = 0;
- ULONGEST bits_to_skip;
- const gdb_byte *contents;
- struct piece_closure *c
- = (struct piece_closure *) value_computed_closure (to);
-- size_t type_len;
-+ ULONGEST type_len;
- size_t buffer_size = 0;
- std::vector<gdb_byte> buffer;
- int bits_big_endian
-@@ -1954,8 +1954,8 @@
- for (i = 0; i < c->n_pieces && offset < type_len; i++)
+--- gdb-8.0.orig/gdb/dwarf2loc.c 2017-08-19 20:04:59.796780604 +0200
++++ gdb-8.0/gdb/dwarf2loc.c 2017-08-19 20:07:00.692911605 +0200
+@@ -1826,7 +1826,7 @@
+ 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, dest_offset, source_offset;
+ ULONGEST this_size_bits, this_size;
-+ LONGEST dest_offset_bits, source_offset_bits, dest_offset, source_offset;
- int need_bitwise;
- const gdb_byte *source_buffer;
-@@ -2074,7 +2074,7 @@
+ this_size_bits = p->size - bits_to_skip;
+ if (this_size_bits > max_offset - offset)
+@@ -2073,7 +2073,7 @@
static int
check_pieced_synthetic_pointer (const struct value *value, LONGEST bit_offset,
@@ -1570,7 +1527,7 @@ Index: gdb-7.99.90.20170420/gdb/dwarf2loc.c
{
struct piece_closure *c
= (struct piece_closure *) value_computed_closure (value);
-@@ -2087,7 +2087,7 @@
+@@ -2086,7 +2086,7 @@
for (i = 0; i < c->n_pieces && bit_length > 0; i++)
{
struct dwarf_expr_piece *p = &c->pieces[i];
@@ -1579,7 +1536,7 @@ Index: gdb-7.99.90.20170420/gdb/dwarf2loc.c
if (bit_offset > 0)
{
-@@ -2195,8 +2195,8 @@
+@@ -2194,8 +2194,8 @@
struct type *type;
struct frame_info *frame;
struct dwarf2_locexpr_baton baton;
@@ -1590,7 +1547,7 @@ Index: gdb-7.99.90.20170420/gdb/dwarf2loc.c
struct dwarf_expr_piece *piece = NULL;
LONGEST byte_offset;
enum bfd_endian byte_order;
-@@ -2213,7 +2213,7 @@
+@@ -2212,7 +2212,7 @@
for (i = 0; i < c->n_pieces && bit_length > 0; i++)
{
struct dwarf_expr_piece *p = &c->pieces[i];
@@ -1599,7 +1556,7 @@ Index: gdb-7.99.90.20170420/gdb/dwarf2loc.c
if (bit_offset > 0)
{
-@@ -2504,9 +2504,9 @@
+@@ -2503,9 +2503,9 @@
case DWARF_VALUE_STACK:
{
struct value *value = ctx.fetch (0);
@@ -1612,10 +1569,10 @@ Index: gdb-7.99.90.20170420/gdb/dwarf2loc.c
struct gdbarch *objfile_gdbarch = get_objfile_arch (objfile);
struct cleanup *cleanup;
-Index: gdb-7.99.90.20170420/gdb/dwarf2read.c
+Index: gdb-8.0/gdb/dwarf2read.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/dwarf2read.c 2017-04-20 23:08:54.160394772 +0200
-+++ gdb-7.99.90.20170420/gdb/dwarf2read.c 2017-04-20 23:08:56.981410668 +0200
+--- gdb-8.0.orig/gdb/dwarf2read.c 2017-08-19 20:04:59.800780641 +0200
++++ gdb-8.0/gdb/dwarf2read.c 2017-08-19 20:05:10.072876738 +0200
@@ -2064,12 +2064,12 @@
}
@@ -1644,10 +1601,10 @@ Index: gdb-7.99.90.20170420/gdb/dwarf2read.c
attr = dwarf2_attr (die, DW_AT_byte_size, cu);
if (attr)
-Index: gdb-7.99.90.20170420/gdb/eval.c
+Index: gdb-8.0/gdb/eval.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/eval.c 2017-04-20 23:08:54.162394784 +0200
-+++ gdb-7.99.90.20170420/gdb/eval.c 2017-04-20 23:08:56.982410674 +0200
+--- gdb-8.0.orig/gdb/eval.c 2017-08-19 20:04:59.801780651 +0200
++++ gdb-8.0/gdb/eval.c 2017-08-19 20:05:10.073876748 +0200
@@ -297,7 +297,8 @@
while (--nargs >= 0)
{
@@ -1700,10 +1657,10 @@ Index: gdb-7.99.90.20170420/gdb/eval.c
LONGEST low_bound, high_bound, index;
if (get_discrete_bounds (range_type, &low_bound, &high_bound) < 0)
-Index: gdb-7.99.90.20170420/gdb/f-lang.c
+Index: gdb-8.0/gdb/f-lang.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/f-lang.c 2017-04-20 23:08:54.162394784 +0200
-+++ gdb-7.99.90.20170420/gdb/f-lang.c 2017-04-20 23:08:56.982410674 +0200
+--- gdb-8.0.orig/gdb/f-lang.c 2017-08-19 20:04:59.801780651 +0200
++++ gdb-8.0/gdb/f-lang.c 2017-08-19 20:05:10.073876748 +0200
@@ -103,7 +103,7 @@
static void
@@ -1713,10 +1670,10 @@ Index: gdb-7.99.90.20170420/gdb/f-lang.c
const struct value_print_options *options)
{
const char *type_encoding = f_get_encoding (type);
-Index: gdb-7.99.90.20170420/gdb/f-lang.h
+Index: gdb-8.0/gdb/f-lang.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/f-lang.h 2017-04-20 23:08:54.163394789 +0200
-+++ gdb-7.99.90.20170420/gdb/f-lang.h 2017-04-20 23:08:56.982410674 +0200
+--- gdb-8.0.orig/gdb/f-lang.h 2017-08-19 20:04:59.802780660 +0200
++++ gdb-8.0/gdb/f-lang.h 2017-08-19 20:05:10.073876748 +0200
@@ -30,7 +30,7 @@
extern void f_print_type (struct type *, const char *, struct ui_file *, int,
int, const struct type_print_options *);
@@ -1726,10 +1683,10 @@ Index: gdb-7.99.90.20170420/gdb/f-lang.h
struct ui_file *, int,
struct value *,
const struct value_print_options *);
-Index: gdb-7.99.90.20170420/gdb/f-valprint.c
+Index: gdb-8.0/gdb/f-valprint.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/f-valprint.c 2017-04-20 23:08:54.163394789 +0200
-+++ gdb-7.99.90.20170420/gdb/f-valprint.c 2017-04-20 23:08:56.982410674 +0200
+--- gdb-8.0.orig/gdb/f-valprint.c 2017-08-19 20:04:59.802780660 +0200
++++ gdb-8.0/gdb/f-valprint.c 2017-08-19 20:05:10.073876748 +0200
@@ -38,7 +38,7 @@
static void info_common_command (char *, int);
static void f77_get_dynamic_length_of_aggregate (struct type *);
@@ -1786,10 +1743,10 @@ Index: gdb-7.99.90.20170420/gdb/f-valprint.c
CORE_ADDR address, struct ui_file *stream, int recurse,
struct value *original_value,
const struct value_print_options *options)
-Index: gdb-7.99.90.20170420/gdb/findvar.c
+Index: gdb-8.0/gdb/findvar.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/findvar.c 2017-04-20 23:08:54.163394789 +0200
-+++ gdb-7.99.90.20170420/gdb/findvar.c 2017-04-20 23:08:56.983410680 +0200
+--- gdb-8.0.orig/gdb/findvar.c 2017-08-19 20:04:59.802780660 +0200
++++ gdb-8.0/gdb/findvar.c 2017-08-19 20:05:10.074876757 +0200
@@ -817,7 +817,7 @@
default_value_from_register (struct gdbarch *gdbarch, struct type *type,
int regnum, struct frame_id frame_id)
@@ -1817,10 +1774,10 @@ Index: gdb-7.99.90.20170420/gdb/findvar.c
/* If the register length is larger than the number of bytes
remaining to copy, then only copy the appropriate bytes. */
-Index: gdb-7.99.90.20170420/gdb/frame.c
+Index: gdb-8.0/gdb/frame.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/frame.c 2017-04-20 23:08:54.164394795 +0200
-+++ gdb-7.99.90.20170420/gdb/frame.c 2017-04-20 23:08:56.983410680 +0200
+--- gdb-8.0.orig/gdb/frame.c 2017-08-19 20:04:59.803780669 +0200
++++ gdb-8.0/gdb/frame.c 2017-08-19 20:05:10.074876757 +0200
@@ -1375,7 +1375,7 @@
int
@@ -1839,10 +1796,10 @@ Index: gdb-7.99.90.20170420/gdb/frame.c
/* Copy the data. */
while (len > 0)
-Index: gdb-7.99.90.20170420/gdb/frame.h
+Index: gdb-8.0/gdb/frame.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/frame.h 2017-04-20 23:08:54.164394795 +0200
-+++ gdb-7.99.90.20170420/gdb/frame.h 2017-04-20 23:08:56.984410685 +0200
+--- gdb-8.0.orig/gdb/frame.h 2017-08-19 20:04:59.803780669 +0200
++++ gdb-8.0/gdb/frame.h 2017-08-19 20:05:10.074876757 +0200
@@ -600,7 +600,7 @@
contents are optimized out or unavailable, set *OPTIMIZEDP,
*UNAVAILABLEP accordingly. */
@@ -1852,11 +1809,11 @@ Index: gdb-7.99.90.20170420/gdb/frame.h
gdb_byte *myaddr,
int *optimizedp, int *unavailablep);
-Index: gdb-7.99.90.20170420/gdb/gdbtypes.c
+Index: gdb-8.0/gdb/gdbtypes.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/gdbtypes.c 2017-04-20 23:08:54.166394806 +0200
-+++ gdb-7.99.90.20170420/gdb/gdbtypes.c 2017-04-20 23:08:56.985410691 +0200
-@@ -2808,7 +2808,7 @@
+--- gdb-8.0.orig/gdb/gdbtypes.c 2017-08-19 20:04:59.804780679 +0200
++++ gdb-8.0/gdb/gdbtypes.c 2017-08-19 20:05:10.075876766 +0200
+@@ -2807,7 +2807,7 @@
least as long as OBJFILE. */
struct type *
@@ -1865,7 +1822,7 @@ Index: gdb-7.99.90.20170420/gdb/gdbtypes.c
const char *name)
{
struct type *type;
-@@ -3117,8 +3117,8 @@
+@@ -3116,8 +3116,8 @@
static int
is_unique_ancestor_worker (struct type *base, struct type *dclass,
@@ -1876,7 +1833,7 @@ Index: gdb-7.99.90.20170420/gdb/gdbtypes.c
CORE_ADDR address, struct value *val)
{
int i, count = 0;
-@@ -3129,7 +3129,7 @@
+@@ -3128,7 +3128,7 @@
for (i = 0; i < TYPE_N_BASECLASSES (dclass) && count < 2; ++i)
{
struct type *iter;
@@ -1885,7 +1842,7 @@ Index: gdb-7.99.90.20170420/gdb/gdbtypes.c
iter = check_typedef (TYPE_BASECLASS (dclass, i));
-@@ -3170,7 +3170,7 @@
+@@ -3169,7 +3169,7 @@
int
is_unique_ancestor (struct type *base, struct value *val)
{
@@ -1894,7 +1851,7 @@ Index: gdb-7.99.90.20170420/gdb/gdbtypes.c
return is_unique_ancestor_worker (base, value_type (val), &offset,
value_contents_for_printing (val),
-@@ -4409,7 +4409,7 @@
+@@ -4415,7 +4415,7 @@
break;
}
puts_filtered ("\n");
@@ -1903,7 +1860,7 @@ Index: gdb-7.99.90.20170420/gdb/gdbtypes.c
if (TYPE_OBJFILE_OWNED (type))
{
printfi_filtered (spaces, "objfile ");
-@@ -4869,7 +4869,7 @@
+@@ -4875,7 +4875,7 @@
struct type *
arch_type (struct gdbarch *gdbarch,
@@ -1912,10 +1869,10 @@ Index: gdb-7.99.90.20170420/gdb/gdbtypes.c
{
struct type *type;
-Index: gdb-7.99.90.20170420/gdb/gdbtypes.h
+Index: gdb-8.0/gdb/gdbtypes.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/gdbtypes.h 2017-04-20 23:08:54.167394812 +0200
-+++ gdb-7.99.90.20170420/gdb/gdbtypes.h 2017-04-20 23:08:56.985410691 +0200
+--- gdb-8.0.orig/gdb/gdbtypes.h 2017-08-19 20:04:59.805780688 +0200
++++ gdb-8.0/gdb/gdbtypes.h 2017-08-19 20:05:10.076876776 +0200
@@ -787,7 +787,7 @@
type_length_units function should be used in order to get the length
expressed in target addressable memory units. */
@@ -1943,10 +1900,10 @@ Index: gdb-7.99.90.20170420/gdb/gdbtypes.h
const char *);
extern struct type *arch_integer_type (struct gdbarch *, int, int,
const char *);
-Index: gdb-7.99.90.20170420/gdb/gnu-v2-abi.c
+Index: gdb-8.0/gdb/gnu-v2-abi.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/gnu-v2-abi.c 2017-04-20 23:08:54.167394812 +0200
-+++ gdb-7.99.90.20170420/gdb/gnu-v2-abi.c 2017-04-20 23:08:56.985410691 +0200
+--- gdb-8.0.orig/gdb/gnu-v2-abi.c 2017-08-19 20:04:59.805780688 +0200
++++ gdb-8.0/gdb/gnu-v2-abi.c 2017-08-19 20:05:10.076876776 +0200
@@ -82,7 +82,7 @@
TYPE is the type in which F is located. */
static struct value *
@@ -1984,10 +1941,10 @@ Index: gdb-7.99.90.20170420/gdb/gnu-v2-abi.c
gnuv2_baseclass_offset (type, i, valaddr,
embedded_offset, address, val);
-Index: gdb-7.99.90.20170420/gdb/gnu-v3-abi.c
+Index: gdb-8.0/gdb/gnu-v3-abi.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/gnu-v3-abi.c 2017-04-20 23:08:54.168394817 +0200
-+++ gdb-7.99.90.20170420/gdb/gnu-v3-abi.c 2017-04-20 23:08:56.986410697 +0200
+--- gdb-8.0.orig/gdb/gnu-v3-abi.c 2017-08-19 20:04:59.806780698 +0200
++++ gdb-8.0/gdb/gnu-v3-abi.c 2017-08-19 20:05:10.077876785 +0200
@@ -109,7 +109,7 @@
{
struct type *t;
@@ -2051,10 +2008,10 @@ Index: gdb-7.99.90.20170420/gdb/gnu-v3-abi.c
struct type *basetype;
if (BASETYPE_VIA_VIRTUAL (domain, i))
-Index: gdb-7.99.90.20170420/gdb/go-lang.h
+Index: gdb-8.0/gdb/go-lang.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/go-lang.h 2017-04-20 23:08:54.168394817 +0200
-+++ gdb-7.99.90.20170420/gdb/go-lang.h 2017-04-20 23:08:56.986410697 +0200
+--- gdb-8.0.orig/gdb/go-lang.h 2017-08-19 20:04:59.806780698 +0200
++++ gdb-8.0/gdb/go-lang.h 2017-08-19 20:05:10.077876785 +0200
@@ -85,7 +85,7 @@
/* Defined in go-valprint.c. */
@@ -2064,10 +2021,10 @@ Index: gdb-7.99.90.20170420/gdb/go-lang.h
struct ui_file *stream, int recurse,
struct value *val,
const struct value_print_options *options);
-Index: gdb-7.99.90.20170420/gdb/go-valprint.c
+Index: gdb-8.0/gdb/go-valprint.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/go-valprint.c 2017-04-20 23:08:54.168394817 +0200
-+++ gdb-7.99.90.20170420/gdb/go-valprint.c 2017-04-20 23:08:56.986410697 +0200
+--- gdb-8.0.orig/gdb/go-valprint.c 2017-08-19 20:04:59.806780698 +0200
++++ gdb-8.0/gdb/go-valprint.c 2017-08-19 20:05:10.077876785 +0200
@@ -86,7 +86,7 @@
/* Implements the la_val_print routine for language Go. */
@@ -2077,10 +2034,10 @@ Index: gdb-7.99.90.20170420/gdb/go-valprint.c
CORE_ADDR address, struct ui_file *stream, int recurse,
struct value *val,
const struct value_print_options *options)
-Index: gdb-7.99.90.20170420/gdb/language.c
+Index: gdb-8.0/gdb/language.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/language.c 2017-04-20 23:08:54.168394817 +0200
-+++ gdb-7.99.90.20170420/gdb/language.c 2017-04-20 23:08:56.986410697 +0200
+--- gdb-8.0.orig/gdb/language.c 2017-08-19 20:04:59.806780698 +0200
++++ gdb-8.0/gdb/language.c 2017-08-19 20:05:10.077876785 +0200
@@ -753,7 +753,7 @@
static void
@@ -2099,10 +2056,10 @@ Index: gdb-7.99.90.20170420/gdb/language.c
struct ui_file *stream, int recurse,
struct value *val,
const struct value_print_options *options)
-Index: gdb-7.99.90.20170420/gdb/language.h
+Index: gdb-8.0/gdb/language.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/language.h 2017-04-20 23:08:54.169394823 +0200
-+++ gdb-7.99.90.20170420/gdb/language.h 2017-04-20 23:08:56.986410697 +0200
+--- gdb-8.0.orig/gdb/language.h 2017-08-19 20:04:59.806780698 +0200
++++ gdb-8.0/gdb/language.h 2017-08-19 20:05:10.077876785 +0200
@@ -197,7 +197,7 @@
struct ui_file * stream);
@@ -2121,10 +2078,10 @@ Index: gdb-7.99.90.20170420/gdb/language.h
struct ui_file *stream, int recurse,
struct value *val,
const struct value_print_options *options);
-Index: gdb-7.99.90.20170420/gdb/m2-lang.c
+Index: gdb-8.0/gdb/m2-lang.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/m2-lang.c 2017-04-20 23:08:54.169394823 +0200
-+++ gdb-7.99.90.20170420/gdb/m2-lang.c 2017-04-20 23:08:56.987410702 +0200
+--- gdb-8.0.orig/gdb/m2-lang.c 2017-08-19 20:04:59.807780707 +0200
++++ gdb-8.0/gdb/m2-lang.c 2017-08-19 20:05:10.078876795 +0200
@@ -104,10 +104,10 @@
static void
@@ -2159,10 +2116,10 @@ Index: gdb-7.99.90.20170420/gdb/m2-lang.c
i = rep1 - 1;
things_printed += options->repeat_count_threshold;
need_comma = 1;
-Index: gdb-7.99.90.20170420/gdb/m2-lang.h
+Index: gdb-8.0/gdb/m2-lang.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/m2-lang.h 2017-04-20 23:08:54.169394823 +0200
-+++ gdb-7.99.90.20170420/gdb/m2-lang.h 2017-04-20 23:08:56.987410702 +0200
+--- gdb-8.0.orig/gdb/m2-lang.h 2017-08-19 20:04:59.807780707 +0200
++++ gdb-8.0/gdb/m2-lang.h 2017-08-19 20:05:10.078876795 +0200
@@ -34,7 +34,7 @@
extern int m2_is_long_set (struct type *type);
extern int m2_is_unbounded_array (struct type *type);
@@ -2172,10 +2129,10 @@ Index: gdb-7.99.90.20170420/gdb/m2-lang.h
struct ui_file *, int,
struct value *,
const struct value_print_options *);
-Index: gdb-7.99.90.20170420/gdb/m2-typeprint.c
+Index: gdb-8.0/gdb/m2-typeprint.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/m2-typeprint.c 2017-04-20 23:08:54.169394823 +0200
-+++ gdb-7.99.90.20170420/gdb/m2-typeprint.c 2017-04-20 23:08:56.987410702 +0200
+--- gdb-8.0.orig/gdb/m2-typeprint.c 2017-08-19 20:04:59.807780707 +0200
++++ gdb-8.0/gdb/m2-typeprint.c 2017-08-19 20:05:10.078876795 +0200
@@ -234,9 +234,12 @@
m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 1);
}
@@ -2192,10 +2149,10 @@ Index: gdb-7.99.90.20170420/gdb/m2-typeprint.c
}
fprintf_filtered (stream, "] OF ");
m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level, flags);
-Index: gdb-7.99.90.20170420/gdb/m2-valprint.c
+Index: gdb-8.0/gdb/m2-valprint.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/m2-valprint.c 2017-04-20 23:08:54.170394829 +0200
-+++ gdb-7.99.90.20170420/gdb/m2-valprint.c 2017-04-20 23:08:56.987410702 +0200
+--- gdb-8.0.orig/gdb/m2-valprint.c 2017-08-19 20:04:59.807780707 +0200
++++ gdb-8.0/gdb/m2-valprint.c 2017-08-19 20:05:10.078876795 +0200
@@ -35,7 +35,7 @@
struct ui_file *stream);
static void
@@ -2266,10 +2223,10 @@ Index: gdb-7.99.90.20170420/gdb/m2-valprint.c
int need_comma = 0;
fputs_filtered ("{", stream);
-Index: gdb-7.99.90.20170420/gdb/memrange.c
+Index: gdb-8.0/gdb/memrange.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/memrange.c 2017-04-20 23:08:54.170394829 +0200
-+++ gdb-7.99.90.20170420/gdb/memrange.c 2017-04-20 23:08:56.987410702 +0200
+--- gdb-8.0.orig/gdb/memrange.c 2017-08-19 20:04:59.807780707 +0200
++++ gdb-8.0/gdb/memrange.c 2017-08-19 20:05:10.078876795 +0200
@@ -22,8 +22,8 @@
#include <algorithm>
@@ -2281,10 +2238,10 @@ Index: gdb-7.99.90.20170420/gdb/memrange.c
{
ULONGEST h, l;
-Index: gdb-7.99.90.20170420/gdb/memrange.h
+Index: gdb-8.0/gdb/memrange.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/memrange.h 2017-04-20 23:08:54.170394829 +0200
-+++ gdb-7.99.90.20170420/gdb/memrange.h 2017-04-20 23:08:56.987410702 +0200
+--- gdb-8.0.orig/gdb/memrange.h 2017-08-19 20:04:59.808780716 +0200
++++ gdb-8.0/gdb/memrange.h 2017-08-19 20:05:10.079876804 +0200
@@ -30,7 +30,7 @@
CORE_ADDR start;
@@ -2305,10 +2262,10 @@ Index: gdb-7.99.90.20170420/gdb/memrange.h
/* Returns true if ADDR is in RANGE. */
-Index: gdb-7.99.90.20170420/gdb/mips-linux-nat.c
+Index: gdb-8.0/gdb/mips-linux-nat.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/mips-linux-nat.c 2017-04-20 23:08:54.170394829 +0200
-+++ gdb-7.99.90.20170420/gdb/mips-linux-nat.c 2017-04-20 23:08:56.988410708 +0200
+--- gdb-8.0.orig/gdb/mips-linux-nat.c 2017-08-19 20:04:59.808780716 +0200
++++ gdb-8.0/gdb/mips-linux-nat.c 2017-08-19 20:05:10.079876804 +0200
@@ -584,7 +584,7 @@
static int
@@ -2318,10 +2275,10 @@ Index: gdb-7.99.90.20170420/gdb/mips-linux-nat.c
{
struct pt_watch_regs dummy_regs;
int i;
-Index: gdb-7.99.90.20170420/gdb/opencl-lang.c
+Index: gdb-8.0/gdb/opencl-lang.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/opencl-lang.c 2017-04-20 23:08:54.171394834 +0200
-+++ gdb-7.99.90.20170420/gdb/opencl-lang.c 2017-04-20 23:08:56.988410708 +0200
+--- gdb-8.0.orig/gdb/opencl-lang.c 2017-08-19 20:04:59.808780716 +0200
++++ gdb-8.0/gdb/opencl-lang.c 2017-08-19 20:05:10.079876804 +0200
@@ -78,11 +78,11 @@
static struct type *
@@ -2390,10 +2347,10 @@ Index: gdb-7.99.90.20170420/gdb/opencl-lang.c
if (!value_bits_synthetic_pointer (c->val,
c->indices[i] * elsize + comp_offset,
-Index: gdb-7.99.90.20170420/gdb/p-lang.c
+Index: gdb-8.0/gdb/p-lang.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/p-lang.c 2017-04-20 23:08:54.171394834 +0200
-+++ gdb-7.99.90.20170420/gdb/p-lang.c 2017-04-20 23:08:56.988410708 +0200
+--- gdb-8.0.orig/gdb/p-lang.c 2017-08-19 20:04:59.808780716 +0200
++++ gdb-8.0/gdb/p-lang.c 2017-08-19 20:05:10.079876804 +0200
@@ -95,8 +95,8 @@
are not multiple of TARGET_CHAR_BIT then the results are wrong
but this does not happen for Free Pascal nor for GPC. */
@@ -2441,10 +2398,10 @@ Index: gdb-7.99.90.20170420/gdb/p-lang.c
i = rep1 - 1;
things_printed += options->repeat_count_threshold;
need_comma = 1;
-Index: gdb-7.99.90.20170420/gdb/p-lang.h
+Index: gdb-8.0/gdb/p-lang.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/p-lang.h 2017-04-20 23:08:54.171394834 +0200
-+++ gdb-7.99.90.20170420/gdb/p-lang.h 2017-04-20 23:08:56.988410708 +0200
+--- gdb-8.0.orig/gdb/p-lang.h 2017-08-19 20:04:59.809780726 +0200
++++ gdb-8.0/gdb/p-lang.h 2017-08-19 20:05:10.080876813 +0200
@@ -36,7 +36,7 @@
extern void pascal_print_typedef (struct type *, struct symbol *,
struct ui_file *);
@@ -2470,10 +2427,10 @@ Index: gdb-7.99.90.20170420/gdb/p-lang.h
const struct value_print_options *);
extern struct type **const (pascal_builtin_types[]);
-Index: gdb-7.99.90.20170420/gdb/p-valprint.c
+Index: gdb-8.0/gdb/p-valprint.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/p-valprint.c 2017-04-20 23:08:54.171394834 +0200
-+++ gdb-7.99.90.20170420/gdb/p-valprint.c 2017-04-20 23:08:56.989410713 +0200
+--- gdb-8.0.orig/gdb/p-valprint.c 2017-08-19 20:04:59.809780726 +0200
++++ gdb-8.0/gdb/p-valprint.c 2017-08-19 20:05:10.080876813 +0200
@@ -59,7 +59,7 @@
void
@@ -2494,10 +2451,10 @@ Index: gdb-7.99.90.20170420/gdb/p-valprint.c
struct type *char_type;
CORE_ADDR addr;
int want_space = 0;
-Index: gdb-7.99.90.20170420/gdb/ppc-linux-nat.c
+Index: gdb-8.0/gdb/ppc-linux-nat.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/ppc-linux-nat.c 2017-04-20 23:08:54.172394840 +0200
-+++ gdb-7.99.90.20170420/gdb/ppc-linux-nat.c 2017-04-20 23:08:56.989410713 +0200
+--- gdb-8.0.orig/gdb/ppc-linux-nat.c 2017-08-19 20:04:59.809780726 +0200
++++ gdb-8.0/gdb/ppc-linux-nat.c 2017-08-19 20:05:10.080876813 +0200
@@ -1445,7 +1445,7 @@
static int
@@ -2507,10 +2464,10 @@ Index: gdb-7.99.90.20170420/gdb/ppc-linux-nat.c
{
/* Handle sub-8-byte quantities. */
if (len <= 0)
-Index: gdb-7.99.90.20170420/gdb/printcmd.c
+Index: gdb-8.0/gdb/printcmd.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/printcmd.c 2017-04-20 23:08:54.173394846 +0200
-+++ gdb-7.99.90.20170420/gdb/printcmd.c 2017-04-20 23:08:56.990410719 +0200
+--- gdb-8.0.orig/gdb/printcmd.c 2017-08-19 20:04:59.810780735 +0200
++++ gdb-8.0/gdb/printcmd.c 2017-08-19 20:05:10.081876823 +0200
@@ -280,7 +280,7 @@
struct ui_file *stream)
{
@@ -2529,10 +2486,10 @@ Index: gdb-7.99.90.20170420/gdb/printcmd.c
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
/* String printing should go through val_print_scalar_formatted. */
-Index: gdb-7.99.90.20170420/gdb/procfs.c
+Index: gdb-8.0/gdb/procfs.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/procfs.c 2017-04-20 23:08:54.173394846 +0200
-+++ gdb-7.99.90.20170420/gdb/procfs.c 2017-04-20 23:08:56.991410725 +0200
+--- gdb-8.0.orig/gdb/procfs.c 2017-08-19 20:04:59.811780744 +0200
++++ gdb-8.0/gdb/procfs.c 2017-08-19 20:05:10.082876832 +0200
@@ -4864,7 +4864,7 @@
static int
@@ -2542,10 +2499,10 @@ Index: gdb-7.99.90.20170420/gdb/procfs.c
{
/* The man page for proc(4) on Solaris 2.6 and up says that the
system can support "thousands" of hardware watchpoints, but gives
-Index: gdb-7.99.90.20170420/gdb/regcache.c
+Index: gdb-8.0/gdb/regcache.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/regcache.c 2017-04-20 23:08:54.174394851 +0200
-+++ gdb-7.99.90.20170420/gdb/regcache.c 2017-04-20 23:08:56.991410725 +0200
+--- gdb-8.0.orig/gdb/regcache.c 2017-08-19 20:04:59.811780744 +0200
++++ gdb-8.0/gdb/regcache.c 2017-08-19 20:05:10.082876832 +0200
@@ -988,7 +988,7 @@
static enum register_status
@@ -2591,10 +2548,10 @@ Index: gdb-7.99.90.20170420/gdb/regcache.c
{
struct regcache_descr *descr = regcache->descr;
-Index: gdb-7.99.90.20170420/gdb/regcache.h
+Index: gdb-8.0/gdb/regcache.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/regcache.h 2017-04-20 23:08:54.174394851 +0200
-+++ gdb-7.99.90.20170420/gdb/regcache.h 2017-04-20 23:08:56.991410725 +0200
+--- gdb-8.0.orig/gdb/regcache.h 2017-08-19 20:04:59.812780754 +0200
++++ gdb-8.0/gdb/regcache.h 2017-08-19 20:05:10.083876841 +0200
@@ -94,9 +94,9 @@
extern enum register_status
@@ -2622,10 +2579,10 @@ Index: gdb-7.99.90.20170420/gdb/regcache.h
/* Special routines to read/write the PC. */
-Index: gdb-7.99.90.20170420/gdb/remote.c
+Index: gdb-8.0/gdb/remote.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/remote.c 2017-04-20 23:08:54.177394868 +0200
-+++ gdb-7.99.90.20170420/gdb/remote.c 2017-04-20 23:08:56.993410736 +0200
+--- gdb-8.0.orig/gdb/remote.c 2017-08-19 20:04:59.814780772 +0200
++++ gdb-8.0/gdb/remote.c 2017-08-19 20:05:10.085876860 +0200
@@ -9915,7 +9915,7 @@
static int
@@ -2635,10 +2592,10 @@ Index: gdb-7.99.90.20170420/gdb/remote.c
{
if (remote_hw_watchpoint_length_limit == 0)
return 0;
-Index: gdb-7.99.90.20170420/gdb/spu-multiarch.c
+Index: gdb-8.0/gdb/spu-multiarch.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/spu-multiarch.c 2017-04-20 23:08:54.177394868 +0200
-+++ gdb-7.99.90.20170420/gdb/spu-multiarch.c 2017-04-20 23:08:56.994410742 +0200
+--- gdb-8.0.orig/gdb/spu-multiarch.c 2017-08-19 20:04:59.814780772 +0200
++++ gdb-8.0/gdb/spu-multiarch.c 2017-08-19 20:05:10.085876860 +0200
@@ -127,7 +127,7 @@
/* Override the to_region_ok_for_hw_watchpoint routine. */
static int
@@ -2648,10 +2605,10 @@ Index: gdb-7.99.90.20170420/gdb/spu-multiarch.c
{
struct target_ops *ops_beneath = find_target_beneath (self);
-Index: gdb-7.99.90.20170420/gdb/stack.c
+Index: gdb-8.0/gdb/stack.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/stack.c 2017-04-20 23:08:54.178394874 +0200
-+++ gdb-7.99.90.20170420/gdb/stack.c 2017-04-20 23:08:56.994410742 +0200
+--- gdb-8.0.orig/gdb/stack.c 2017-08-19 20:04:59.815780782 +0200
++++ gdb-8.0/gdb/stack.c 2017-08-19 20:05:10.086876869 +0200
@@ -189,7 +189,7 @@
argument (not just the first nameless argument). */
@@ -2690,10 +2647,10 @@ Index: gdb-7.99.90.20170420/gdb/stack.c
if (highest_offset == -1)
start = gdbarch_frame_args_skip (get_frame_arch (frame));
-Index: gdb-7.99.90.20170420/gdb/symmisc.c
+Index: gdb-8.0/gdb/symmisc.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/symmisc.c 2017-04-20 23:08:54.178394874 +0200
-+++ gdb-7.99.90.20170420/gdb/symmisc.c 2017-04-20 23:08:56.994410742 +0200
+--- gdb-8.0.orig/gdb/symmisc.c 2017-08-19 20:04:59.815780782 +0200
++++ gdb-8.0/gdb/symmisc.c 2017-08-19 20:05:10.086876869 +0200
@@ -604,11 +604,11 @@
case LOC_CONST_BYTES:
@@ -2709,10 +2666,10 @@ Index: gdb-7.99.90.20170420/gdb/symmisc.c
for (i = 0; i < TYPE_LENGTH (type); i++)
fprintf_filtered (outfile, " %02x",
(unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
-Index: gdb-7.99.90.20170420/gdb/target.c
+Index: gdb-8.0/gdb/target.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/target.c 2017-04-20 23:08:54.179394879 +0200
-+++ gdb-7.99.90.20170420/gdb/target.c 2017-04-20 23:08:56.995410747 +0200
+--- gdb-8.0.orig/gdb/target.c 2017-08-19 20:04:59.816780791 +0200
++++ gdb-8.0/gdb/target.c 2017-08-19 20:05:10.087876879 +0200
@@ -57,7 +57,7 @@
CORE_ADDR, CORE_ADDR, int);
@@ -2731,10 +2688,10 @@ Index: gdb-7.99.90.20170420/gdb/target.c
{
return (len <= gdbarch_ptr_bit (target_gdbarch ()) / TARGET_CHAR_BIT);
}
-Index: gdb-7.99.90.20170420/gdb/target.h
+Index: gdb-8.0/gdb/target.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/target.h 2017-04-20 23:08:54.180394885 +0200
-+++ gdb-7.99.90.20170420/gdb/target.h 2017-04-20 23:08:56.996410753 +0200
+--- gdb-8.0.orig/gdb/target.h 2017-08-19 20:04:59.816780791 +0200
++++ gdb-8.0/gdb/target.h 2017-08-19 20:05:10.088876888 +0200
@@ -555,7 +555,7 @@
/* Documentation of this routine is provided with the corresponding
target_* macro. */
@@ -2744,10 +2701,10 @@ Index: gdb-7.99.90.20170420/gdb/target.h
TARGET_DEFAULT_FUNC (default_region_ok_for_hw_watchpoint);
int (*to_can_accel_watchpoint_condition) (struct target_ops *,
-Index: gdb-7.99.90.20170420/gdb/tracepoint.c
+Index: gdb-8.0/gdb/tracepoint.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/tracepoint.c 2017-04-20 23:08:54.182394896 +0200
-+++ gdb-7.99.90.20170420/gdb/tracepoint.c 2017-04-20 23:08:56.997410758 +0200
+--- gdb-8.0.orig/gdb/tracepoint.c 2017-08-19 20:04:59.817780800 +0200
++++ gdb-8.0/gdb/tracepoint.c 2017-08-19 20:05:10.088876888 +0200
@@ -904,10 +904,10 @@
void
collection_list::add_memrange (struct gdbarch *gdbarch,
@@ -2841,10 +2798,10 @@ Index: gdb-7.99.90.20170420/gdb/tracepoint.c
}
if (BLOCK_FUNCTION (block))
break;
-Index: gdb-7.99.90.20170420/gdb/valarith.c
+Index: gdb-8.0/gdb/valarith.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/valarith.c 2017-04-20 23:08:54.182394896 +0200
-+++ gdb-7.99.90.20170420/gdb/valarith.c 2017-04-20 23:08:56.997410758 +0200
+--- gdb-8.0.orig/gdb/valarith.c 2017-08-19 20:04:59.818780810 +0200
++++ gdb-8.0/gdb/valarith.c 2017-08-19 20:05:10.089876897 +0200
@@ -188,7 +188,7 @@
to doubles, but no longer does. */
@@ -2887,10 +2844,10 @@ Index: gdb-7.99.90.20170420/gdb/valarith.c
for (i = 0; i < len; i++)
{
-Index: gdb-7.99.90.20170420/gdb/valops.c
+Index: gdb-8.0/gdb/valops.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/valops.c 2017-04-20 23:08:54.184394908 +0200
-+++ gdb-7.99.90.20170420/gdb/valops.c 2017-04-20 23:08:56.998410764 +0200
+--- gdb-8.0.orig/gdb/valops.c 2017-08-19 20:04:59.819780819 +0200
++++ gdb-8.0/gdb/valops.c 2017-08-19 20:05:10.090876907 +0200
@@ -79,7 +79,7 @@
int, int);
@@ -2924,7 +2881,7 @@ Index: gdb-7.99.90.20170420/gdb/valops.c
LONGEST low_bound, high_bound, new_length;
if (get_discrete_bounds (range_type, &low_bound, &high_bound) < 0)
-@@ -1064,7 +1064,7 @@
+@@ -1065,7 +1065,7 @@
{
const gdb_byte *dest_buffer;
CORE_ADDR changed_addr;
@@ -2933,7 +2890,7 @@ Index: gdb-7.99.90.20170420/gdb/valops.c
gdb_byte buffer[sizeof (LONGEST)];
if (value_bitsize (toval))
-@@ -3339,7 +3339,7 @@
+@@ -3340,7 +3340,7 @@
the form "DOMAIN::NAME". */
static struct value *
@@ -2942,7 +2899,7 @@ Index: gdb-7.99.90.20170420/gdb/valops.c
struct type *curtype, const char *name,
struct type *intype,
int want_address,
-@@ -3373,7 +3373,7 @@
+@@ -3374,7 +3374,7 @@
if (want_address)
return value_from_longest
(lookup_memberptr_type (TYPE_FIELD_TYPE (t, i), domain),
@@ -2951,7 +2908,7 @@ Index: gdb-7.99.90.20170420/gdb/valops.c
else if (noside != EVAL_NORMAL)
return allocate_value (TYPE_FIELD_TYPE (t, i));
else
-@@ -3541,7 +3541,7 @@
+@@ -3542,7 +3542,7 @@
for (i = TYPE_N_BASECLASSES (t) - 1; i >= 0; i--)
{
struct value *v;
@@ -2960,7 +2917,7 @@ Index: gdb-7.99.90.20170420/gdb/valops.c
if (BASETYPE_VIA_VIRTUAL (t, i))
base_offset = 0;
-@@ -3690,7 +3690,7 @@
+@@ -3691,7 +3691,7 @@
struct value *
value_full_object (struct value *argp,
struct type *rtype,
@@ -2969,10 +2926,10 @@ Index: gdb-7.99.90.20170420/gdb/valops.c
int xusing_enc)
{
struct type *real_type;
-Index: gdb-7.99.90.20170420/gdb/valprint.c
+Index: gdb-8.0/gdb/valprint.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/valprint.c 2017-04-20 23:08:54.185394913 +0200
-+++ gdb-7.99.90.20170420/gdb/valprint.c 2017-04-20 23:08:56.998410764 +0200
+--- gdb-8.0.orig/gdb/valprint.c 2017-08-19 20:04:59.820780828 +0200
++++ gdb-8.0/gdb/valprint.c 2017-08-19 20:05:10.090876907 +0200
@@ -933,7 +933,7 @@
void
@@ -3032,10 +2989,10 @@ Index: gdb-7.99.90.20170420/gdb/valprint.c
const char *encoding, int force_ellipses,
int quote_char, int c_style_terminator,
const struct value_print_options *options)
-Index: gdb-7.99.90.20170420/gdb/valprint.h
+Index: gdb-8.0/gdb/valprint.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/valprint.h 2017-04-20 23:08:54.186394919 +0200
-+++ gdb-7.99.90.20170420/gdb/valprint.h 2017-04-20 23:08:56.998410764 +0200
+--- gdb-8.0.orig/gdb/valprint.h 2017-08-19 20:04:59.820780828 +0200
++++ gdb-8.0/gdb/valprint.h 2017-08-19 20:05:10.090876907 +0200
@@ -119,7 +119,7 @@
CORE_ADDR, struct ui_file *, int,
struct value *,
@@ -3072,10 +3029,10 @@ Index: gdb-7.99.90.20170420/gdb/valprint.h
const char *encoding, int force_ellipses,
int quote_char, int c_style_terminator,
const struct value_print_options *options);
-Index: gdb-7.99.90.20170420/gdb/value.c
+Index: gdb-8.0/gdb/value.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/value.c 2017-04-20 23:08:54.187394924 +0200
-+++ gdb-7.99.90.20170420/gdb/value.c 2017-04-20 23:08:56.999410770 +0200
+--- gdb-8.0.orig/gdb/value.c 2017-08-19 20:04:59.821780838 +0200
++++ gdb-8.0/gdb/value.c 2017-08-19 20:05:10.091876916 +0200
@@ -367,7 +367,8 @@
}
@@ -3109,10 +3066,10 @@ Index: gdb-7.99.90.20170420/gdb/value.c
{
mark_value_bits_optimized_out (value,
offset * TARGET_CHAR_BIT,
-Index: gdb-7.99.90.20170420/gdb/value.h
+Index: gdb-8.0/gdb/value.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/value.h 2017-04-20 23:08:54.187394924 +0200
-+++ gdb-7.99.90.20170420/gdb/value.h 2017-04-20 23:08:56.999410770 +0200
+--- gdb-8.0.orig/gdb/value.h 2017-08-19 20:04:59.822780847 +0200
++++ gdb-8.0/gdb/value.h 2017-08-19 20:05:10.092876925 +0200
@@ -246,7 +246,7 @@
/* If non-NULL, this is used to determine whether the indicated bits
of VALUE are a synthetic pointer. */
@@ -3141,7 +3098,7 @@ Index: gdb-7.99.90.20170420/gdb/value.h
/* Mark VALUE's content bits starting at OFFSET and extending for
LENGTH bits as optimized out. */
-@@ -820,12 +821,11 @@
+@@ -819,12 +820,11 @@
int fieldno,
struct type *arg_type);
@@ -3155,7 +3112,7 @@ Index: gdb-7.99.90.20170420/gdb/value.h
extern struct value *value_cast_pointers (struct type *, struct value *, int);
-@@ -1114,10 +1114,11 @@
+@@ -1113,10 +1113,11 @@
extern struct value *find_function_in_inferior (const char *,
struct objfile **);
@@ -3169,10 +3126,10 @@ Index: gdb-7.99.90.20170420/gdb/value.h
/* User function handler. */
-Index: gdb-7.99.90.20170420/gdb/s390-linux-nat.c
+Index: gdb-8.0/gdb/s390-linux-nat.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/s390-linux-nat.c 2017-04-20 23:08:54.188394930 +0200
-+++ gdb-7.99.90.20170420/gdb/s390-linux-nat.c 2017-04-20 23:08:57.000410775 +0200
+--- gdb-8.0.orig/gdb/s390-linux-nat.c 2017-08-19 20:04:59.822780847 +0200
++++ gdb-8.0/gdb/s390-linux-nat.c 2017-08-19 20:05:10.092876925 +0200
@@ -900,7 +900,7 @@
static int
@@ -3182,10 +3139,10 @@ Index: gdb-7.99.90.20170420/gdb/s390-linux-nat.c
{
return 1;
}
-Index: gdb-7.99.90.20170420/gdb/target-delegates.c
+Index: gdb-8.0/gdb/target-delegates.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/target-delegates.c 2017-04-20 23:08:54.189394936 +0200
-+++ gdb-7.99.90.20170420/gdb/target-delegates.c 2017-04-20 23:08:57.000410775 +0200
+--- gdb-8.0.orig/gdb/target-delegates.c 2017-08-19 20:04:59.823780856 +0200
++++ gdb-8.0/gdb/target-delegates.c 2017-08-19 20:05:10.093876935 +0200
@@ -760,14 +760,14 @@
}
@@ -3212,10 +3169,10 @@ Index: gdb-7.99.90.20170420/gdb/target-delegates.c
fputs_unfiltered (") = ", gdb_stdlog);
target_debug_print_int (result);
fputs_unfiltered ("\n", gdb_stdlog);
-Index: gdb-7.99.90.20170420/gdb/aarch64-linux-nat.c
+Index: gdb-8.0/gdb/aarch64-linux-nat.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/aarch64-linux-nat.c 2017-04-20 23:08:54.189394936 +0200
-+++ gdb-7.99.90.20170420/gdb/aarch64-linux-nat.c 2017-04-20 23:08:57.001410781 +0200
+--- gdb-8.0.orig/gdb/aarch64-linux-nat.c 2017-08-19 20:04:59.823780856 +0200
++++ gdb-8.0/gdb/aarch64-linux-nat.c 2017-08-19 20:05:10.093876935 +0200
@@ -708,7 +708,7 @@
static int
@@ -3225,10 +3182,10 @@ Index: gdb-7.99.90.20170420/gdb/aarch64-linux-nat.c
{
return aarch64_linux_region_ok_for_watchpoint (addr, len);
}
-Index: gdb-7.99.90.20170420/gdb/nat/x86-dregs.c
+Index: gdb-8.0/gdb/nat/x86-dregs.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/nat/x86-dregs.c 2017-04-20 23:08:54.189394936 +0200
-+++ gdb-7.99.90.20170420/gdb/nat/x86-dregs.c 2017-04-20 23:08:57.001410781 +0200
+--- gdb-8.0.orig/gdb/nat/x86-dregs.c 2017-08-19 20:04:59.823780856 +0200
++++ gdb-8.0/gdb/nat/x86-dregs.c 2017-08-19 20:05:10.093876935 +0200
@@ -384,7 +384,7 @@
static int
@@ -3247,10 +3204,10 @@ Index: gdb-7.99.90.20170420/gdb/nat/x86-dregs.c
{
int nregs;
-Index: gdb-7.99.90.20170420/gdb/compile/compile-c-support.c
+Index: gdb-8.0/gdb/compile/compile-c-support.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/compile/compile-c-support.c 2017-04-20 23:08:54.189394936 +0200
-+++ gdb-7.99.90.20170420/gdb/compile/compile-c-support.c 2017-04-20 23:08:57.001410781 +0200
+--- gdb-8.0.orig/gdb/compile/compile-c-support.c 2017-08-19 20:04:59.824780866 +0200
++++ gdb-8.0/gdb/compile/compile-c-support.c 2017-08-19 20:05:10.093876935 +0200
@@ -309,11 +309,11 @@
default:
@@ -3265,10 +3222,10 @@ Index: gdb-7.99.90.20170420/gdb/compile/compile-c-support.c
}
fputs_unfiltered (";\n", stream);
-Index: gdb-7.99.90.20170420/gdb/nat/x86-dregs.h
+Index: gdb-8.0/gdb/nat/x86-dregs.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/nat/x86-dregs.h 2017-04-20 23:08:54.190394942 +0200
-+++ gdb-7.99.90.20170420/gdb/nat/x86-dregs.h 2017-04-20 23:08:57.001410781 +0200
+--- gdb-8.0.orig/gdb/nat/x86-dregs.h 2017-08-19 20:04:59.824780866 +0200
++++ gdb-8.0/gdb/nat/x86-dregs.h 2017-08-19 20:05:10.094876944 +0200
@@ -116,7 +116,7 @@
/* Return non-zero if we can watch a memory region that starts at
address ADDR and whose length is LEN bytes. */
@@ -3278,10 +3235,10 @@ Index: gdb-7.99.90.20170420/gdb/nat/x86-dregs.h
/* If the inferior has some break/watchpoint that triggered, set the
address associated with that break/watchpoint and return true.
-Index: gdb-7.99.90.20170420/gdb/x86-nat.c
+Index: gdb-8.0/gdb/x86-nat.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/x86-nat.c 2017-04-20 23:08:54.190394942 +0200
-+++ gdb-7.99.90.20170420/gdb/x86-nat.c 2017-04-20 23:08:57.001410781 +0200
+--- gdb-8.0.orig/gdb/x86-nat.c 2017-08-19 20:04:59.824780866 +0200
++++ gdb-8.0/gdb/x86-nat.c 2017-08-19 20:05:10.094876944 +0200
@@ -174,7 +174,7 @@
static int
@@ -3291,10 +3248,10 @@ Index: gdb-7.99.90.20170420/gdb/x86-nat.c
{
struct x86_debug_reg_state *state
= x86_debug_reg_state (ptid_get_pid (inferior_ptid));
-Index: gdb-7.99.90.20170420/gdb/rust-lang.c
+Index: gdb-8.0/gdb/rust-lang.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/rust-lang.c 2017-04-20 23:08:54.190394942 +0200
-+++ gdb-7.99.90.20170420/gdb/rust-lang.c 2017-04-20 23:08:57.002410787 +0200
+--- gdb-8.0.orig/gdb/rust-lang.c 2017-08-19 20:04:59.824780866 +0200
++++ gdb-8.0/gdb/rust-lang.c 2017-08-19 20:05:10.094876944 +0200
@@ -439,7 +439,7 @@
static void
@@ -3313,10 +3270,10 @@ Index: gdb-7.99.90.20170420/gdb/rust-lang.c
CORE_ADDR address, struct ui_file *stream, int recurse,
struct value *val,
const struct value_print_options *options)
-Index: gdb-7.99.90.20170420/gdb/arch-utils.c
+Index: gdb-8.0/gdb/arch-utils.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/arch-utils.c 2017-04-20 23:08:54.191394947 +0200
-+++ gdb-7.99.90.20170420/gdb/arch-utils.c 2017-04-20 23:08:57.002410787 +0200
+--- gdb-8.0.orig/gdb/arch-utils.c 2017-08-19 20:04:59.825780875 +0200
++++ gdb-8.0/gdb/arch-utils.c 2017-08-19 20:05:10.095876953 +0200
@@ -247,7 +247,7 @@
const struct floatformat **
@@ -3326,10 +3283,10 @@ Index: gdb-7.99.90.20170420/gdb/arch-utils.c
{
const struct floatformat **format = NULL;
-Index: gdb-7.99.90.20170420/gdb/arch-utils.h
+Index: gdb-8.0/gdb/arch-utils.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/arch-utils.h 2017-04-20 23:08:54.191394947 +0200
-+++ gdb-7.99.90.20170420/gdb/arch-utils.h 2017-04-20 23:08:57.002410787 +0200
+--- gdb-8.0.orig/gdb/arch-utils.h 2017-08-19 20:04:59.825780875 +0200
++++ gdb-8.0/gdb/arch-utils.h 2017-08-19 20:05:10.095876953 +0200
@@ -144,7 +144,7 @@
/* Default implementation of gdbarch_floatformat_for_type. */
extern const struct floatformat **
@@ -3339,10 +3296,10 @@ Index: gdb-7.99.90.20170420/gdb/arch-utils.h
extern CORE_ADDR generic_skip_trampoline_code (struct frame_info *frame,
CORE_ADDR pc);
-Index: gdb-7.99.90.20170420/gdb/findcmd.c
+Index: gdb-8.0/gdb/findcmd.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/findcmd.c 2017-04-20 23:08:54.191394947 +0200
-+++ gdb-7.99.90.20170420/gdb/findcmd.c 2017-04-20 23:08:57.002410787 +0200
+--- gdb-8.0.orig/gdb/findcmd.c 2017-08-19 20:04:59.825780875 +0200
++++ gdb-8.0/gdb/findcmd.c 2017-08-19 20:05:10.095876953 +0200
@@ -180,7 +180,7 @@
need to grow the pattern buf. */
pattern_buf_size_need = (pattern_buf_end - pattern_buf
@@ -3352,10 +3309,10 @@ Index: gdb-7.99.90.20170420/gdb/findcmd.c
if (pattern_buf_size_need > pattern_buf_size)
{
size_t current_offset = pattern_buf_end - pattern_buf;
-Index: gdb-7.99.90.20170420/gdb/gdbarch.c
+Index: gdb-8.0/gdb/gdbarch.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/gdbarch.c 2017-04-20 23:08:54.192394953 +0200
-+++ gdb-7.99.90.20170420/gdb/gdbarch.c 2017-04-20 23:08:57.003410792 +0200
+--- gdb-8.0.orig/gdb/gdbarch.c 2017-08-19 20:04:59.826780885 +0200
++++ gdb-8.0/gdb/gdbarch.c 2017-08-19 20:05:10.096876963 +0200
@@ -1806,7 +1806,7 @@
}
@@ -3365,10 +3322,10 @@ Index: gdb-7.99.90.20170420/gdb/gdbarch.c
{
gdb_assert (gdbarch != NULL);
gdb_assert (gdbarch->floatformat_for_type != NULL);
-Index: gdb-7.99.90.20170420/gdb/gdbarch.h
+Index: gdb-8.0/gdb/gdbarch.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/gdbarch.h 2017-04-20 23:08:54.192394953 +0200
-+++ gdb-7.99.90.20170420/gdb/gdbarch.h 2017-04-20 23:08:57.004410798 +0200
+--- gdb-8.0.orig/gdb/gdbarch.h 2017-08-19 20:04:59.826780885 +0200
++++ gdb-8.0/gdb/gdbarch.h 2017-08-19 20:05:10.096876963 +0200
@@ -203,8 +203,8 @@
NAME, if non-NULL, is the type name, which may be used to distinguish
different target formats of the same length. */
@@ -3380,10 +3337,10 @@ Index: gdb-7.99.90.20170420/gdb/gdbarch.h
extern void set_gdbarch_floatformat_for_type (struct gdbarch *gdbarch, gdbarch_floatformat_for_type_ftype *floatformat_for_type);
/* For most targets, a pointer on the target and its representation as an
-Index: gdb-7.99.90.20170420/gdb/gdbarch.sh
+Index: gdb-8.0/gdb/gdbarch.sh
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/gdbarch.sh 2017-04-20 23:08:54.193394958 +0200
-+++ gdb-7.99.90.20170420/gdb/gdbarch.sh 2017-04-20 23:08:57.004410798 +0200
+--- gdb-8.0.orig/gdb/gdbarch.sh 2017-08-19 20:04:59.827780894 +0200
++++ gdb-8.0/gdb/gdbarch.sh 2017-08-19 20:05:10.097876972 +0200
@@ -392,7 +392,7 @@
# Returns the floating-point format to be used for values of length LENGTH.
# NAME, if non-NULL, is the type name, which may be used to distinguish
@@ -3393,10 +3350,10 @@ Index: gdb-7.99.90.20170420/gdb/gdbarch.sh
# For most targets, a pointer on the target and its representation as an
# address in GDB have the same size and "look the same". For such a
-Index: gdb-7.99.90.20170420/gdb/i386-tdep.c
+Index: gdb-8.0/gdb/i386-tdep.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/i386-tdep.c 2017-04-20 23:08:54.194394964 +0200
-+++ gdb-7.99.90.20170420/gdb/i386-tdep.c 2017-04-20 23:08:57.005410804 +0200
+--- gdb-8.0.orig/gdb/i386-tdep.c 2017-08-19 20:04:59.828780903 +0200
++++ gdb-8.0/gdb/i386-tdep.c 2017-08-19 20:05:10.098876982 +0200
@@ -8180,7 +8180,7 @@
const struct floatformat **
@@ -3406,10 +3363,10 @@ Index: gdb-7.99.90.20170420/gdb/i386-tdep.c
{
if (len == 128 && name)
if (strcmp (name, "__float128") == 0
-Index: gdb-7.99.90.20170420/gdb/ppc-linux-tdep.c
+Index: gdb-8.0/gdb/ppc-linux-tdep.c
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/ppc-linux-tdep.c 2017-04-20 23:08:54.195394970 +0200
-+++ gdb-7.99.90.20170420/gdb/ppc-linux-tdep.c 2017-04-20 23:08:57.006410809 +0200
+--- gdb-8.0.orig/gdb/ppc-linux-tdep.c 2017-08-19 20:04:59.829780913 +0200
++++ gdb-8.0/gdb/ppc-linux-tdep.c 2017-08-19 20:05:10.098876982 +0200
@@ -1632,7 +1632,7 @@
const struct floatformat **
@@ -3419,10 +3376,10 @@ Index: gdb-7.99.90.20170420/gdb/ppc-linux-tdep.c
{
if (len == 128 && name)
if (strcmp (name, "__float128") == 0
-Index: gdb-7.99.90.20170420/gdb/tracepoint.h
+Index: gdb-8.0/gdb/tracepoint.h
===================================================================
---- gdb-7.99.90.20170420.orig/gdb/tracepoint.h 2017-04-20 23:08:54.195394970 +0200
-+++ gdb-7.99.90.20170420/gdb/tracepoint.h 2017-04-20 23:08:57.006410809 +0200
+--- gdb-8.0.orig/gdb/tracepoint.h 2017-08-19 20:04:59.829780913 +0200
++++ gdb-8.0/gdb/tracepoint.h 2017-08-19 20:05:10.099876991 +0200
@@ -254,7 +254,7 @@
void add_register (unsigned int regno);
void add_memrange (struct gdbarch *gdbarch,
diff --git a/gdb-rhbz795424-bitpos-21of25.patch b/gdb-rhbz795424-bitpos-21of25.patch
index 0fa7ead..4ee7b25 100644
--- a/gdb-rhbz795424-bitpos-21of25.patch
+++ b/gdb-rhbz795424-bitpos-21of25.patch
@@ -52,11 +52,11 @@ Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
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-7.10.90.20160211/gdb/alpha-tdep.c 2016-02-11 20:57:05.385891225 +0100
-@@ -413,6 +413,13 @@
+--- gdb-8.0.orig/gdb/alpha-tdep.c 2017-08-19 20:07:45.469330496 +0200
++++ gdb-8.0/gdb/alpha-tdep.c 2017-08-19 20:07:50.670379152 +0200
+@@ -414,6 +414,13 @@
accumulate_size = 0;
else
accumulate_size -= sizeof(arg_reg_buffer);
@@ -70,11 +70,11 @@ Index: gdb-7.10.90.20160211/gdb/alpha-tdep.c
sp -= accumulate_size;
/* 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-7.10.90.20160211/gdb/cp-valprint.c 2016-02-11 20:57:05.385891225 +0100
-@@ -536,6 +536,8 @@
+--- gdb-8.0.orig/gdb/cp-valprint.c 2017-08-19 20:07:45.470330505 +0200
++++ gdb-8.0/gdb/cp-valprint.c 2017-08-19 20:07:50.670379152 +0200
+@@ -537,6 +537,8 @@
gdb_byte *buf;
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));
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-7.10.90.20160211/gdb/dwarf2loc.c 2016-02-11 20:57:05.386891231 +0100
-@@ -1744,6 +1744,8 @@
-
- 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 @@
+--- gdb-8.0.orig/gdb/findcmd.c 2017-08-19 20:07:45.472330524 +0200
++++ gdb-8.0/gdb/findcmd.c 2017-08-19 20:07:50.672379171 +0200
+@@ -186,6 +186,7 @@
size_t current_offset = pattern_buf_end - pattern_buf;
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_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-7.10.90.20160211/gdb/p-valprint.c 2016-02-11 20:57:05.387891238 +0100
-@@ -769,6 +769,7 @@
+--- gdb-8.0.orig/gdb/p-valprint.c 2017-08-19 20:07:45.472330524 +0200
++++ gdb-8.0/gdb/p-valprint.c 2017-08-19 20:07:50.673379180 +0200
+@@ -772,6 +772,7 @@
gdb_byte *buf;
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));
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-7.10.90.20160211/gdb/utils.c 2016-02-11 20:57:05.388891244 +0100
-@@ -2837,6 +2837,18 @@
+--- gdb-8.0.orig/gdb/utils.c 2017-08-19 20:07:45.473330533 +0200
++++ gdb-8.0/gdb/utils.c 2017-08-19 20:07:50.673379180 +0200
+@@ -2776,6 +2776,18 @@
return addr;
}
@@ -151,11 +130,11 @@ Index: gdb-7.10.90.20160211/gdb/utils.c
char *
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-7.10.90.20160211/gdb/valops.c 2016-02-11 20:57:05.389891251 +0100
-@@ -2057,6 +2057,7 @@
+--- gdb-8.0.orig/gdb/valops.c 2017-08-19 20:07:45.474330542 +0200
++++ gdb-8.0/gdb/valops.c 2017-08-19 20:07:50.674379190 +0200
+@@ -2100,6 +2100,7 @@
struct cleanup *back_to;
CORE_ADDR address;
@@ -163,11 +142,11 @@ Index: gdb-7.10.90.20160211/gdb/valops.c
tmp = (gdb_byte *) xmalloc (TYPE_LENGTH (baseclass));
back_to = make_cleanup (xfree, tmp);
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-7.10.90.20160211/gdb/value.c 2016-02-11 20:58:35.095480877 +0100
-@@ -935,6 +935,7 @@
+--- gdb-8.0.orig/gdb/value.c 2017-08-19 20:07:45.476330561 +0200
++++ gdb-8.0/gdb/value.c 2017-08-19 20:07:50.675379199 +0200
+@@ -936,6 +936,7 @@
description correctly. */
check_typedef (type);
@@ -175,7 +154,7 @@ Index: gdb-7.10.90.20160211/gdb/value.c
val = XCNEW (struct value);
val->contents = NULL;
val->next = all_values;
-@@ -1034,6 +1035,8 @@
+@@ -1033,6 +1034,8 @@
static void
allocate_value_contents (struct value *val)
{
@@ -184,7 +163,7 @@ Index: gdb-7.10.90.20160211/gdb/value.c
if (!val->contents)
{
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)))
{
check_type_length_before_alloc (new_encl_type);
@@ -192,10 +171,10 @@ Index: gdb-7.10.90.20160211/gdb/value.c
val->contents
= (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-7.10.90.20160211/gdb/vax-tdep.c 2016-02-11 20:57:05.391891264 +0100
+--- gdb-8.0.orig/gdb/vax-tdep.c 2017-08-19 20:07:45.476330561 +0200
++++ gdb-8.0/gdb/vax-tdep.c 2017-08-19 20:07:50.675379199 +0200
@@ -219,6 +219,7 @@
ULONGEST addr;
@@ -204,11 +183,11 @@ Index: gdb-7.10.90.20160211/gdb/vax-tdep.c
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-7.10.90.20160211/gdb/defs.h 2016-02-11 20:57:05.391891264 +0100
-@@ -690,4 +690,6 @@
+--- gdb-8.0.orig/gdb/defs.h 2017-08-19 20:07:45.476330561 +0200
++++ gdb-8.0/gdb/defs.h 2017-08-19 20:07:50.676379208 +0200
+@@ -750,4 +750,6 @@
#include "utils.h"
diff --git a/gdb.spec b/gdb.spec
index a123a48..23c8d4c 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -26,7 +26,7 @@ Version: 8.0
# 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.
-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
Group: Development/Debuggers
@@ -689,6 +689,43 @@ Patch1155: gdb-rhbz1398387-tab-crash-test.patch
#=push+jan
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
# RL_STATE_FEDORA_GDB would not be found for:
# Patch642: gdb-readline62-ask-more-rh.patch
@@ -1012,6 +1049,41 @@ find -name "*.info*"|xargs rm -f
%patch690 -p1
%patch698 -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
%patch812 -p1
%patch813 -p1
@@ -1643,6 +1715,9 @@ then
fi
%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
- Backport a fix for clang && -gsplit-dwarf debuggees (RH BZ 1482892).
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-06-27 23:58 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-06-27 23:58 [rpms/gdb] gdb-17.2-rebase-f44: [s390x] Backport arch12 support and other s390x fixes (RH BZ 1420304) Jan Kratochvil
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox