[4/5] : Enhancements to "flags": i386 cleanup

Message ID 94eb2c03bed8e14298053a213ae2@google.com
State New, archived
Headers

Commit Message

Doug Evans Aug. 15, 2016, 7:27 p.m. UTC
  Pedro Alves writes:
  > On 08/08/2016 09:33 PM, Doug Evans wrote:
  >
  > > Hi.
  > > Sorry for the trouble.
  > >
  > > I think(!) these two patches fix things.
  > > Basically, I made "end" required again, and made single bit fields
  > > default to bool,
  > > and then tweaked a couple of xml files to minimize changes.
  > >
  > > https://sourceware.org/ml/gdb-patches/2016-08/msg00105.html
  > > https://sourceware.org/ml/gdb-patches/2016-08/msg00106.html
  > >
  > > It occurs to me I need to update the docs too.
  > > Additional patch to follow.
  >
  > Thanks!  All looks good to me.

Here is what I committed (to main and gdb-7.12-branch).
Same as before except I needed to update a testcase.

2016-08-15  Doug Evans  <dje@google.com>

	* features/aarch64-core.xml (cpsr_flags): Elide "type" and specify
	"end" in all fields.
	* features/aarch64.c: Regenerate.
	* features/i386/32bit-mpx.xml (_bndcfgu): Specify type of "preserved"
	and "enabled" fields. Correct size of "enabled" field.
	* features/i386/64bit-mpx.xml (_bndcfgu): Specify type of "preserved"
	and "enabled" fields.
	* features/i386/i386-avx-mpx-linux.c: Regenerate.
	* features/i386/i386-avx-mpx.c: Regenerate.
	* features/i386/i386-avx512-linux.c: Regenerate.
	* features/i386/i386-avx512.c: Regenerate.
	* features/i386/i386-mpx-linux.c: Regenerate.
	* features/i386/i386-mpx.c: Regenerate.
	* xml-tdesc.c (tdesc_start_field): Require "end" spec.  Single bit
	fields default to "bool" type.

	Revert 2016-03-15  Doug Evans  <dje@google.com>
	* features/i386/32bit-core.xml (i386_eflags): Remove "end" spec.
	* features/i386/32bit-sse.xml (i386_eflags): Ditto.
	* features/i386/64bit-core.xml (i386_eflags): Ditto.
	* features/i386/64bit-sse.xml (i386_eflags): Ditto.
	* features/i386/x32-core.xml (i386_eflags): Ditto.

	doc/
	* gdb.texinfo (Target Description Format): Update docs on "end"
	field spec and field default type.

	testsuite/
	* gdb.xml/extra-regs.xml: Update, end field now required, default type
	for single bitfields is bool.
	* gdb.xml/tdesc-regs.exp: Ditto.
  

Comments

Pedro Alves Oct. 6, 2016, 11:22 a.m. UTC | #1
On 08/15/2016 08:27 PM, Doug Evans wrote:

> Here is what I committed (to main and gdb-7.12-branch).
> Same as before except I needed to update a testcase.

I was looking at closing PR 20448 [1], but then noticed that
the back compatibility was still broken on master.  Turned out that the 
problem was simply that the fix never actually made it to master.  I've pushed
it to master now, after re-regenerating the features c files.  That
regenerated a couple newer files that have gone in meanwhile:

       * features/arc-arcompact.c: Regenerate.
       * features/arc-v2.c: Regenerate.

That raises a point that I'll follow up on in the other subthread.

[1] - https://sourceware.org/bugzilla/show_bug.cgi?id=20448

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index f5dde61..0b5ec39 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -40681,16 +40681,13 @@  Bitfield values may be named with the empty  
string, @samp{""},
  in which case the field is ``filler'' and its value is not printed.
  Not all bits need to be specified, so ``filler'' fields are optional.

-The @var{start} value is required, and @var{end} and @var{type}
-are optional.
+The @var{start} and @var{end} values are required, and @var{type}
+is optional.
  The field's @var{start} must be less than or equal to its @var{end},
  and zero represents the least significant bit.
-The default value of @var{end} is @var{start}, a single bit field.

-The default value of @var{type} depends on whether the
-@var{end} was specified.  If @var{end} is specified then the default
-value of @var{type} is an unsigned integer.  If @var{end} is unspecified
-then the default value of @var{type} is @code{bool}.
+The default value of @var{type} is @code{bool} for single bit fields,
+and an unsigned integer otherwise.

  Which to choose?  Structures or flags?

diff --git a/gdb/features/aarch64-core.xml b/gdb/features/aarch64-core.xml
index 8f96296..7ff064d 100644
--- a/gdb/features/aarch64-core.xml
+++ b/gdb/features/aarch64-core.xml
@@ -44,23 +44,23 @@ 
    <reg name="pc" bitsize="64" type="code_ptr"/>

    <flags id="cpsr_flags" size="4">
-    <field name="SP" start="0" type="bool"/>
+    <field name="SP" start="0" end="0"/>
      <field name="" start="1" end="1"/>
      <field name="EL" start="2" end="3"/>
-    <field name="nRW" start="4" type="bool"/>
+    <field name="nRW" start="4" end="4"/>
      <field name="" start="5" end="5"/>
-    <field name="F" start="6" type="bool"/>
-    <field name="I" start="7" type="bool"/>
-    <field name="A" start="8" type="bool"/>
-    <field name="D" start="9" type="bool"/>
+    <field name="F" start="6" end="6"/>
+    <field name="I" start="7" end="7"/>
+    <field name="A" start="8" end="8"/>
+    <field name="D" start="9" end="9"/>

-    <field name="IL" start="20" type="bool"/>
-    <field name="SS" start="21" type="bool"/>
+    <field name="IL" start="20" end="20"/>
+    <field name="SS" start="21" end="21"/>

-    <field name="V" start="28" type="bool"/>
-    <field name="C" start="29" type="bool"/>
-    <field name="Z" start="30" type="bool"/>
-    <field name="N" start="31" type="bool"/>
+    <field name="V" start="28" end="28"/>
+    <field name="C" start="29" end="29"/>
+    <field name="Z" start="30" end="30"/>
+    <field name="N" start="31" end="31"/>
    </flags>
    <reg name="cpsr" bitsize="32" type="cpsr_flags"/>

diff --git a/gdb/features/aarch64.c b/gdb/features/aarch64.c
index cec6956..e9eaed8 100644
--- a/gdb/features/aarch64.c
+++ b/gdb/features/aarch64.c
@@ -19,10 +19,10 @@  initialize_tdesc_aarch64 (void)
    feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.core");
    type = tdesc_create_flags (feature, "cpsr_flags", 4);
    tdesc_add_flag (type, 0, "SP");
-  tdesc_add_bitfield (type, "", 1, 1);
+  tdesc_add_flag (type, 1, "");
    tdesc_add_bitfield (type, "EL", 2, 3);
    tdesc_add_flag (type, 4, "nRW");
-  tdesc_add_bitfield (type, "", 5, 5);
+  tdesc_add_flag (type, 5, "");
    tdesc_add_flag (type, 6, "F");
    tdesc_add_flag (type, 7, "I");
    tdesc_add_flag (type, 8, "A");
diff --git a/gdb/features/i386/32bit-core.xml  
b/gdb/features/i386/32bit-core.xml
index b00d913..a27863f 100644
--- a/gdb/features/i386/32bit-core.xml
+++ b/gdb/features/i386/32bit-core.xml
@@ -8,23 +8,23 @@ 
  <!DOCTYPE feature SYSTEM "gdb-target.dtd">
  <feature name="org.gnu.gdb.i386.core">
    <flags id="i386_eflags" size="4">
-    <field name="CF" start="0"/>
-    <field name="" start="1"/>
-    <field name="PF" start="2"/>
-    <field name="AF" start="4"/>
-    <field name="ZF" start="6"/>
-    <field name="SF" start="7"/>
-    <field name="TF" start="8"/>
-    <field name="IF" start="9"/>
-    <field name="DF" start="10"/>
-    <field name="OF" start="11"/>
-    <field name="NT" start="14"/>
-    <field name="RF" start="16"/>
-    <field name="VM" start="17"/>
-    <field name="AC" start="18"/>
-    <field name="VIF" start="19"/>
-    <field name="VIP" start="20"/>
-    <field name="ID" start="21"/>
+    <field name="CF" start="0" end="0"/>
+    <field name="" start="1" end="1"/>
+    <field name="PF" start="2" end="2"/>
+    <field name="AF" start="4" end="4"/>
+    <field name="ZF" start="6" end="6"/>
+    <field name="SF" start="7" end="7"/>
+    <field name="TF" start="8" end="8"/>
+    <field name="IF" start="9" end="9"/>
+    <field name="DF" start="10" end="10"/>
+    <field name="OF" start="11" end="11"/>
+    <field name="NT" start="14" end="14"/>
+    <field name="RF" start="16" end="16"/>
+    <field name="VM" start="17" end="17"/>
+    <field name="AC" start="18" end="18"/>
+    <field name="VIF" start="19" end="19"/>
+    <field name="VIP" start="20" end="20"/>
+    <field name="ID" start="21" end="21"/>
    </flags>

    <reg name="eax" bitsize="32" type="int32"/>
diff --git a/gdb/features/i386/32bit-mpx.xml  
b/gdb/features/i386/32bit-mpx.xml
index b1c0615..8d319cf 100644
--- a/gdb/features/i386/32bit-mpx.xml
+++ b/gdb/features/i386/32bit-mpx.xml
@@ -25,8 +25,10 @@ 
    <struct id="_bndcfgu" size="8">
      <field name="base" start="12" end="31" />
      <field name="reserved" start="2" end="11"/>
-    <field name="preserved" start="1" end="1"/>
-    <field name="enabled" start="0" end="1"/>
+    <!-- Explicitly set the type here, otherwise it defaults to bool.
+         Perhaps this should be uint32, but the container type has size  
8.  -->
+    <field name="preserved" start="1" end="1" type="uint64"/>
+    <field name="enabled" start="0" end="0" type="uint64"/>
    </struct>

     <union id="cfgu">
diff --git a/gdb/features/i386/32bit-sse.xml  
b/gdb/features/i386/32bit-sse.xml
index 4448a7e..5a44d1e 100644
--- a/gdb/features/i386/32bit-sse.xml
+++ b/gdb/features/i386/32bit-sse.xml
@@ -23,20 +23,20 @@ 
      <field name="uint128" type="uint128"/>
    </union>
    <flags id="i386_mxcsr" size="4">
-    <field name="IE" start="0"/>
-    <field name="DE" start="1"/>
-    <field name="ZE" start="2"/>
-    <field name="OE" start="3"/>
-    <field name="UE" start="4"/>
-    <field name="PE" start="5"/>
-    <field name="DAZ" start="6"/>
-    <field name="IM" start="7"/>
-    <field name="DM" start="8"/>
-    <field name="ZM" start="9"/>
-    <field name="OM" start="10"/>
-    <field name="UM" start="11"/>
-    <field name="PM" start="12"/>
-    <field name="FZ" start="15"/>
+    <field name="IE" start="0" end="0"/>
+    <field name="DE" start="1" end="1"/>
+    <field name="ZE" start="2" end="2"/>
+    <field name="OE" start="3" end="3"/>
+    <field name="UE" start="4" end="4"/>
+    <field name="PE" start="5" end="5"/>
+    <field name="DAZ" start="6" end="6"/>
+    <field name="IM" start="7" end="7"/>
+    <field name="DM" start="8" end="8"/>
+    <field name="ZM" start="9" end="9"/>
+    <field name="OM" start="10" end="10"/>
+    <field name="UM" start="11" end="11"/>
+    <field name="PM" start="12" end="12"/>
+    <field name="FZ" start="15" end="15"/>
    </flags>

    <reg name="xmm0" bitsize="128" type="vec128" regnum="32"/>
diff --git a/gdb/features/i386/64bit-core.xml  
b/gdb/features/i386/64bit-core.xml
index 6e847c1..92f4e87 100644
--- a/gdb/features/i386/64bit-core.xml
+++ b/gdb/features/i386/64bit-core.xml
@@ -8,23 +8,23 @@ 
  <!DOCTYPE feature SYSTEM "gdb-target.dtd">
  <feature name="org.gnu.gdb.i386.core">
    <flags id="i386_eflags" size="4">
-    <field name="CF" start="0"/>
-    <field name="" start="1"/>
-    <field name="PF" start="2"/>
-    <field name="AF" start="4"/>
-    <field name="ZF" start="6"/>
-    <field name="SF" start="7"/>
-    <field name="TF" start="8"/>
-    <field name="IF" start="9"/>
-    <field name="DF" start="10"/>
-    <field name="OF" start="11"/>
-    <field name="NT" start="14"/>
-    <field name="RF" start="16"/>
-    <field name="VM" start="17"/>
-    <field name="AC" start="18"/>
-    <field name="VIF" start="19"/>
-    <field name="VIP" start="20"/>
-    <field name="ID" start="21"/>
+    <field name="CF" start="0" end="0"/>
+    <field name="" start="1" end="1"/>
+    <field name="PF" start="2" end="2"/>
+    <field name="AF" start="4" end="4"/>
+    <field name="ZF" start="6" end="6"/>
+    <field name="SF" start="7" end="7"/>
+    <field name="TF" start="8" end="8"/>
+    <field name="IF" start="9" end="9"/>
+    <field name="DF" start="10" end="10"/>
+    <field name="OF" start="11" end="11"/>
+    <field name="NT" start="14" end="14"/>
+    <field name="RF" start="16" end="16"/>
+    <field name="VM" start="17" end="17"/>
+    <field name="AC" start="18" end="18"/>
+    <field name="VIF" start="19" end="19"/>
+    <field name="VIP" start="20" end="20"/>
+    <field name="ID" start="21" end="21"/>
    </flags>

    <reg name="rax" bitsize="64" type="int64"/>
diff --git a/gdb/features/i386/64bit-mpx.xml  
b/gdb/features/i386/64bit-mpx.xml
index 279b537..877cc0f 100644
--- a/gdb/features/i386/64bit-mpx.xml
+++ b/gdb/features/i386/64bit-mpx.xml
@@ -25,8 +25,9 @@ 
    <struct id="_bndcfgu" size="8">
      <field name="base" start="12" end="63"/>
      <field name="reserved" start="2" end="11"/>
-    <field name="preserved" start="1" end="1"/>
-    <field name="enabled" start="0" end="0"/>
+    <!-- Explicitly set the type here, otherwise it defaults to bool.  -->
+    <field name="preserved" start="1" end="1" type="uint64"/>
+    <field name="enabled" start="0" end="0" type="uint64"/>
    </struct>

     <union id="cfgu">
diff --git a/gdb/features/i386/64bit-sse.xml  
b/gdb/features/i386/64bit-sse.xml
index dd6a850..2a5271e 100644
--- a/gdb/features/i386/64bit-sse.xml
+++ b/gdb/features/i386/64bit-sse.xml
@@ -23,20 +23,20 @@ 
      <field name="uint128" type="uint128"/>
    </union>
    <flags id="i386_mxcsr" size="4">
-    <field name="IE" start="0"/>
-    <field name="DE" start="1"/>
-    <field name="ZE" start="2"/>
-    <field name="OE" start="3"/>
-    <field name="UE" start="4"/>
-    <field name="PE" start="5"/>
-    <field name="DAZ" start="6"/>
-    <field name="IM" start="7"/>
-    <field name="DM" start="8"/>
-    <field name="ZM" start="9"/>
-    <field name="OM" start="10"/>
-    <field name="UM" start="11"/>
-    <field name="PM" start="12"/>
-    <field name="FZ" start="15"/>
+    <field name="IE" start="0" end="0"/>
+    <field name="DE" start="1" end="1"/>
+    <field name="ZE" start="2" end="2"/>
+    <field name="OE" start="3" end="3"/>
+    <field name="UE" start="4" end="4"/>
+    <field name="PE" start="5" end="5"/>
+    <field name="DAZ" start="6" end="6"/>
+    <field name="IM" start="7" end="7"/>
+    <field name="DM" start="8" end="8"/>
+    <field name="ZM" start="9" end="9"/>
+    <field name="OM" start="10" end="10"/>
+    <field name="UM" start="11" end="11"/>
+    <field name="PM" start="12" end="12"/>
+    <field name="FZ" start="15" end="15"/>
    </flags>

    <reg name="xmm0" bitsize="128" type="vec128" regnum="40"/>
diff --git a/gdb/features/i386/i386-avx-mpx-linux.c  
b/gdb/features/i386/i386-avx-mpx-linux.c
index 941f2b3..4b27bfc 100644
--- a/gdb/features/i386/i386-avx-mpx-linux.c
+++ b/gdb/features/i386/i386-avx-mpx-linux.c
@@ -168,7 +168,7 @@  initialize_tdesc_i386_avx_mpx_linux (void)
    tdesc_add_bitfield (type, "base", 12, 31);
    tdesc_add_bitfield (type, "reserved", 2, 11);
    tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 1);
+  tdesc_add_bitfield (type, "enabled", 0, 0);

    type = tdesc_create_union (feature, "cfgu");
    field_type = tdesc_named_type (feature, "data_ptr");
diff --git a/gdb/features/i386/i386-avx-mpx.c  
b/gdb/features/i386/i386-avx-mpx.c
index d822aac..b27b40a 100644
--- a/gdb/features/i386/i386-avx-mpx.c
+++ b/gdb/features/i386/i386-avx-mpx.c
@@ -163,7 +163,7 @@  initialize_tdesc_i386_avx_mpx (void)
    tdesc_add_bitfield (type, "base", 12, 31);
    tdesc_add_bitfield (type, "reserved", 2, 11);
    tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 1);
+  tdesc_add_bitfield (type, "enabled", 0, 0);

    type = tdesc_create_union (feature, "cfgu");
    field_type = tdesc_named_type (feature, "data_ptr");
diff --git a/gdb/features/i386/i386-avx512-linux.c  
b/gdb/features/i386/i386-avx512-linux.c
index 47a3319..0d3ab22 100644
--- a/gdb/features/i386/i386-avx512-linux.c
+++ b/gdb/features/i386/i386-avx512-linux.c
@@ -168,7 +168,7 @@  initialize_tdesc_i386_avx512_linux (void)
    tdesc_add_bitfield (type, "base", 12, 31);
    tdesc_add_bitfield (type, "reserved", 2, 11);
    tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 1);
+  tdesc_add_bitfield (type, "enabled", 0, 0);

    type = tdesc_create_union (feature, "cfgu");
    field_type = tdesc_named_type (feature, "data_ptr");
diff --git a/gdb/features/i386/i386-avx512.c  
b/gdb/features/i386/i386-avx512.c
index 6e8cb55..1cb68a1 100644
--- a/gdb/features/i386/i386-avx512.c
+++ b/gdb/features/i386/i386-avx512.c
@@ -163,7 +163,7 @@  initialize_tdesc_i386_avx512 (void)
    tdesc_add_bitfield (type, "base", 12, 31);
    tdesc_add_bitfield (type, "reserved", 2, 11);
    tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 1);
+  tdesc_add_bitfield (type, "enabled", 0, 0);

    type = tdesc_create_union (feature, "cfgu");
    field_type = tdesc_named_type (feature, "data_ptr");
diff --git a/gdb/features/i386/i386-mpx-linux.c  
b/gdb/features/i386/i386-mpx-linux.c
index 298b7ff..43ea192 100644
--- a/gdb/features/i386/i386-mpx-linux.c
+++ b/gdb/features/i386/i386-mpx-linux.c
@@ -158,7 +158,7 @@  initialize_tdesc_i386_mpx_linux (void)
    tdesc_add_bitfield (type, "base", 12, 31);
    tdesc_add_bitfield (type, "reserved", 2, 11);
    tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 1);
+  tdesc_add_bitfield (type, "enabled", 0, 0);

    type = tdesc_create_union (feature, "cfgu");
    field_type = tdesc_named_type (feature, "data_ptr");
diff --git a/gdb/features/i386/i386-mpx.c b/gdb/features/i386/i386-mpx.c
index c19af55..e832d2e 100644
--- a/gdb/features/i386/i386-mpx.c
+++ b/gdb/features/i386/i386-mpx.c
@@ -153,7 +153,7 @@  initialize_tdesc_i386_mpx (void)
    tdesc_add_bitfield (type, "base", 12, 31);
    tdesc_add_bitfield (type, "reserved", 2, 11);
    tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 1);
+  tdesc_add_bitfield (type, "enabled", 0, 0);

    type = tdesc_create_union (feature, "cfgu");
    field_type = tdesc_named_type (feature, "data_ptr");
diff --git a/gdb/features/i386/x32-core.xml b/gdb/features/i386/x32-core.xml
index c03cdea..ab51ffc 100644
--- a/gdb/features/i386/x32-core.xml
+++ b/gdb/features/i386/x32-core.xml
@@ -8,23 +8,23 @@ 
  <!DOCTYPE feature SYSTEM "gdb-target.dtd">
  <feature name="org.gnu.gdb.i386.core">
    <flags id="i386_eflags" size="4">
-    <field name="CF" start="0"/>
-    <field name="" start="1"/>
-    <field name="PF" start="2"/>
-    <field name="AF" start="4"/>
-    <field name="ZF" start="6"/>
-    <field name="SF" start="7"/>
-    <field name="TF" start="8"/>
-    <field name="IF" start="9"/>
-    <field name="DF" start="10"/>
-    <field name="OF" start="11"/>
-    <field name="NT" start="14"/>
-    <field name="RF" start="16"/>
-    <field name="VM" start="17"/>
-    <field name="AC" start="18"/>
-    <field name="VIF" start="19"/>
-    <field name="VIP" start="20"/>
-    <field name="ID" start="21"/>
+    <field name="CF" start="0" end="0"/>
+    <field name="" start="1" end="1"/>
+    <field name="PF" start="2" end="2"/>
+    <field name="AF" start="4" end="4"/>
+    <field name="ZF" start="6" end="6"/>
+    <field name="SF" start="7" end="7"/>
+    <field name="TF" start="8" end="8"/>
+    <field name="IF" start="9" end="9"/>
+    <field name="DF" start="10" end="10"/>
+    <field name="OF" start="11" end="11"/>
+    <field name="NT" start="14" end="14"/>
+    <field name="RF" start="16" end="16"/>
+    <field name="VM" start="17" end="17"/>
+    <field name="AC" start="18" end="18"/>
+    <field name="VIF" start="19" end="19"/>
+    <field name="VIP" start="20" end="20"/>
+    <field name="ID" start="21" end="21"/>
    </flags>

    <reg name="rax" bitsize="64" type="int64"/>
diff --git a/gdb/testsuite/gdb.xml/extra-regs.xml  
b/gdb/testsuite/gdb.xml/extra-regs.xml
index cbbaf76..997d659 100644
--- a/gdb/testsuite/gdb.xml/extra-regs.xml
+++ b/gdb/testsuite/gdb.xml/extra-regs.xml
@@ -15,12 +15,12 @@ 

      <struct id="struct2" size="8">
        <field name="f1" start="0" end="34"/>
-      <field name="f2" start="63" end="63"/>
+      <field name="f2" start="63" end="63" type="uint64"/>
      </struct>

      <flags id="flags" size="4">
        <field name="X" start="0" end="0"/>
-      <field name="Y" start="2" end="2"/>
+      <field name="Y" start="2" end="2" type="uint32"/>
      </flags>

      <enum id="Z_values" size="4">
@@ -31,18 +31,16 @@ 
      </enum>

      <flags id="mixed_flags" size="4">
-      <!-- Elided end and type. -->
-      <field name="A" start="0"/>
-      <!-- Elided end, unsigned int. -->
-      <field name="B" start="1" type="uint32"/>
-      <!-- Elided end, bool. -->
-      <field name="C" start="2" type="bool"/>
-      <!-- Elided type, single bitfield. -->
-      <field name="D" start="3" end="3"/>
+      <!-- Elided type. -->
+      <field name="A" start="0" end="0"/>
+      <!-- Elided type, multiple bits. -->
+      <field name="B" start="1" end="3"/>
+      <!-- Bool. -->
+      <field name="C" start="4" end="4" type="bool"/>
+      <!-- Unsigned int. -->
+      <field name="D" start="5" end="5" type="uint32"/>
        <!-- Anonymous field. -->
-      <field name="" start="4" end="5"/>
-      <!-- Multi-bit bitfield, elided type. -->
-      <field name="E" start="6" end="7"/>
+      <field name="" start="6" end="7"/>
        <!-- Enum bitfield. -->
        <field name="Z" start="8" end="9" type="Z_values"/>
      </flags>
diff --git a/gdb/testsuite/gdb.xml/tdesc-regs.exp  
b/gdb/testsuite/gdb.xml/tdesc-regs.exp
index c197e28..e7d8c74 100644
--- a/gdb/testsuite/gdb.xml/tdesc-regs.exp
+++ b/gdb/testsuite/gdb.xml/tdesc-regs.exp
@@ -170,9 +170,9 @@  gdb_test "ptype \$structreg.v4" "type = int8_t  
__attribute__ \\(\\(vector_size\\
  gdb_test "ptype \$bitfields" \
      "type = struct struct2 {\r\n *uint64_t f1 : 35;\r\n *uint64_t f2 :  
1;\r\n}"
  gdb_test "ptype \$flags" \
-    "type = flag flags {\r\n *uint32_t X @0;\r\n *uint32_t Y @2;\r\n}"
+    "type = flag flags {\r\n *bool X @0;\r\n *uint32_t Y @2;\r\n}"
  gdb_test "ptype \$mixed_flags" \
-    "type = flag mixed_flags {\r\n *bool A @0;\r\n *uint32_t B @1;\r\n  
*bool C @2;\r\n *uint32_t D @3;\r\n *uint32_t @4-5;\r\n *uint32_t E  
@6-7;\r\n *enum {yes = 1, no = 0, maybe = 2, so} Z @8-9;\r\n}"
+    "type = flag mixed_flags {\r\n *bool A @0;\r\n *uint32_t B @1-3;\r\n  
*bool C @4;\r\n *uint32_t D @5;\r\n *uint32_t @6-7;\r\n *enum {yes = 1, no  
= 0, maybe = 2, so} Z @8-9;\r\n}"

  load_description "core-only.xml" "" "test-regs.xml"
  # The extra register from the previous description should be gone.
diff --git a/gdb/xml-tdesc.c b/gdb/xml-tdesc.c
index aa58385..eeaf79b 100644
--- a/gdb/xml-tdesc.c
+++ b/gdb/xml-tdesc.c
@@ -382,13 +382,19 @@  tdesc_start_field (struct gdb_xml_parser *parser,
      {
        struct tdesc_type *t = data->current_type;

+      /* Older versions of gdb can't handle elided end values.
+         Stick with that for now, to help ensure backward compatibility.
+	 E.g., If a newer gdbserver is talking to an older gdb.  */
+      if (end == -1)
+	gdb_xml_error (parser, _("Missing end value"));
+
        if (data->current_type_size == 0)
  	gdb_xml_error (parser,
  		       _("Bitfields must live in explicitly sized types"));

        if (field_type_id != NULL
  	  && strcmp (field_type_id, "bool") == 0
-	  && !(start == end || end == -1))
+	  && start != end)
  	{
  	  gdb_xml_error (parser,
  			 _("Boolean fields must be one bit in size"));
@@ -400,29 +406,20 @@  tdesc_start_field (struct gdb_xml_parser *parser,
  			 "64 bits (unsupported)"),
  		       field_name);

-      if (end != -1)
-	{
-	  /* Assume that the bit numbering in XML is "lsb-zero".  Most
-	     architectures other than PowerPC use this ordering.  In the
-	     future, we can add an XML tag to indicate "msb-zero"
-	     numbering.  */
-	  if (start > end)
-	    gdb_xml_error (parser, _("Bitfield \"%s\" has start after end"),
-			   field_name);
-	  if (end >= data->current_type_size * TARGET_CHAR_BIT)
-	    gdb_xml_error (parser,
-			   _("Bitfield \"%s\" does not fit in struct"));
-	}
+      /* Assume that the bit numbering in XML is "lsb-zero".  Most
+	 architectures other than PowerPC use this ordering.  In the
+	 future, we can add an XML tag to indicate "msb-zero" numbering.  */
+      if (start > end)
+	gdb_xml_error (parser, _("Bitfield \"%s\" has start after end"),
+		       field_name);
+      if (end >= data->current_type_size * TARGET_CHAR_BIT)
+	gdb_xml_error (parser,
+		       _("Bitfield \"%s\" does not fit in struct"));

-      if (end == -1)
-	{
-	  if (field_type != NULL)
-	    tdesc_add_typed_bitfield (t, field_name, start, start, field_type);
-	  else
-	    tdesc_add_flag (t, start, field_name);
-	}
-      else if (field_type != NULL)
+      if (field_type != NULL)
  	tdesc_add_typed_bitfield (t, field_name, start, end, field_type);
+      else if (start == end)
+	tdesc_add_flag (t, start, field_name);
        else
  	tdesc_add_bitfield (t, field_name, start, end);
      }