This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH 4/5]: Enhancements to "flags": i386 cleanup
- From: Doug Evans <dje at google dot com>
- To: Pedro Alves <palves at redhat dot com>
- Cc: gdb-patches <gdb-patches at sourceware dot org>, Wei-cheng Wang <cole945 at gmail dot com>
- Date: Mon, 15 Aug 2016 19:27:59 +0000
- Subject: Re: [PATCH 4/5]: Enhancements to "flags": i386 cleanup
- Authentication-results: sourceware.org; auth=none
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.
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);
}