- Support AVX registers (BZ 578250).
This commit is contained in:
parent
78b04abd3b
commit
cb6c86a414
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,751 @@
|
|||
[ Backported. ]
|
||||
|
||||
commit cb928c67c90cfb5bbb0636d91855b95e51ad275d
|
||||
Author: Daniel Jacobowitz <dan@debian.org>
|
||||
Date: Mon Mar 1 17:19:21 2010 +0000
|
||||
|
||||
* gdbtypes.c (append_composite_type_field_raw): New.
|
||||
(append_composite_type_field_aligned): Use the new function.
|
||||
* gdbtypes.h (append_composite_type_field_raw): Declare.
|
||||
* target-descriptions.c (struct tdesc_type_field): Add start and end.
|
||||
(struct tdesc_type_flag): New type.
|
||||
(struct tdesc_type): Add TDESC_TYPE_STRUCT and TDESC_TYPE_FLAGS to
|
||||
kind. Add size to u.u. Add u.f for flags.
|
||||
(tdesc_gdb_type): Handle TDESC_TYPE_STRUCT and TDESC_TYPE_FLAGS.
|
||||
(tdesc_free_type): Likewise.
|
||||
(tdesc_create_struct, tdesc_set_struct_size, tdesc_create_flags): New.
|
||||
(tdesc_add_field): Handle TDESC_TYPE_STRUCT.
|
||||
(tdesc_add_bitfield, tdesc_add_flag): New.
|
||||
* target-descriptions.h (tdesc_create_struct, tdesc_set_struct_size)
|
||||
(tdesc_create_flags, tdesc_add_bitfield, tdesc_add_flag): Declare.
|
||||
* xml-tdesc.c (struct tdesc_parsing_data): Rename current_union to
|
||||
current_type. Add current_type_size and current_type_is_flags.
|
||||
(tdesc_start_union): Clear the new fields.
|
||||
(tdesc_start_struct, tdesc_start_flags): New.
|
||||
(tdesc_start_field): Handle struct fields, including bitfields.
|
||||
(field_attributes): Make type optional. Add start and end.
|
||||
(union_children): Rename to struct_union_children.
|
||||
(union_attributes): Rename to struct_union_attributes. Add optional
|
||||
size.
|
||||
(flags_attributes): New.
|
||||
(feature_children): Add struct and flags.
|
||||
* features/gdb-target.dtd: Add flags and struct to features.
|
||||
Make field type optional. Add field start and end.
|
||||
|
||||
doc/
|
||||
* gdb.texinfo (Types): Describe <struct> and <flags>.
|
||||
|
||||
testsuite/
|
||||
* gdb.xml/extra-regs.xml: Add struct1, struct2, and flags
|
||||
types. Add structreg, bitfields, and flags registers.
|
||||
* gdb.xml/tdesc-regs.exp: Test structreg and bitfields
|
||||
registers.
|
||||
|
||||
--- gdb-7.1-p0/gdb/doc/gdb.texinfo 2010-04-03 20:24:51.000000000 +0200
|
||||
+++ gdb-7.1/gdb/doc/gdb.texinfo 2010-04-03 21:04:13.000000000 +0200
|
||||
@@ -33115,6 +33115,47 @@ each of which has a @var{name} and a @va
|
||||
</union>
|
||||
@end smallexample
|
||||
|
||||
+@cindex <struct>
|
||||
+If a register's value is composed from several separate values, define
|
||||
+it with a structure type. There are two forms of the @samp{<struct>}
|
||||
+element; a @samp{<struct>} element must either contain only bitfields
|
||||
+or contain no bitfields. If the structure contains only bitfields,
|
||||
+its total size in bytes must be specified, each bitfield must have an
|
||||
+explicit start and end, and bitfields are automatically assigned an
|
||||
+integer type. The field's @var{start} should be less than or
|
||||
+equal to its @var{end}, and zero represents the least significant bit.
|
||||
+
|
||||
+@smallexample
|
||||
+<struct id="@var{id}" size="@var{size}">
|
||||
+ <field name="@var{name}" start="@var{start}" end="@var{end}"/>
|
||||
+ @dots{}
|
||||
+</struct>
|
||||
+@end smallexample
|
||||
+
|
||||
+If the structure contains no bitfields, then each field has an
|
||||
+explicit type, and no implicit padding is added.
|
||||
+
|
||||
+@smallexample
|
||||
+<struct id="@var{id}">
|
||||
+ <field name="@var{name}" type="@var{type}"/>
|
||||
+ @dots{}
|
||||
+</struct>
|
||||
+@end smallexample
|
||||
+
|
||||
+@cindex <flags>
|
||||
+If a register's value is a series of single-bit flags, define it with
|
||||
+a flags type. The @samp{<flags>} element has an explicit @var{size}
|
||||
+and contains one or more @samp{<field>} elements. Each field has a
|
||||
+@var{name}, a @var{start}, and an @var{end}. Only single-bit flags
|
||||
+are supported.
|
||||
+
|
||||
+@smallexample
|
||||
+<flags id="@var{id}" size="@var{size}">
|
||||
+ <field name="@var{name}" start="@var{start}" end="@var{end}"/>
|
||||
+ @dots{}
|
||||
+</flags>
|
||||
+@end smallexample
|
||||
+
|
||||
@subsection Registers
|
||||
@cindex <reg>
|
||||
|
||||
--- gdb-7.1-p0/gdb/features/gdb-target.dtd 2010-01-01 08:31:48.000000000 +0100
|
||||
+++ gdb-7.1/gdb/features/gdb-target.dtd 2010-04-03 21:04:13.000000000 +0200
|
||||
@@ -19,7 +19,8 @@
|
||||
|
||||
<!ELEMENT compatible (#PCDATA)>
|
||||
|
||||
-<!ELEMENT feature ((vector | union)*, reg*)>
|
||||
+<!ELEMENT feature
|
||||
+ ((vector | flags | struct | union )*, reg*)>
|
||||
<!ATTLIST feature
|
||||
name ID #REQUIRED>
|
||||
|
||||
@@ -39,6 +40,16 @@
|
||||
type CDATA #REQUIRED
|
||||
count CDATA #REQUIRED>
|
||||
|
||||
+<!ELEMENT flags (field+)>
|
||||
+<!ATTLIST flags
|
||||
+ id CDATA #REQUIRED
|
||||
+ size CDATA #REQUIRED>
|
||||
+
|
||||
+<!ELEMENT struct (field+)>
|
||||
+<!ATTLIST struct
|
||||
+ id CDATA #REQUIRED
|
||||
+ size CDATA #IMPLIED>
|
||||
+
|
||||
<!ELEMENT union (field+)>
|
||||
<!ATTLIST union
|
||||
id CDATA #REQUIRED>
|
||||
@@ -46,7 +57,9 @@
|
||||
<!ELEMENT field EMPTY>
|
||||
<!ATTLIST field
|
||||
name CDATA #REQUIRED
|
||||
- type CDATA #REQUIRED>
|
||||
+ type CDATA #IMPLIED
|
||||
+ start CDATA #IMPLIED
|
||||
+ end CDATA #IMPLIED>
|
||||
|
||||
<!ENTITY % xinclude SYSTEM "xinclude.dtd">
|
||||
%xinclude;
|
||||
--- gdb-7.1-p0/gdb/gdbtypes.c 2010-04-03 20:24:51.000000000 +0200
|
||||
+++ gdb-7.1/gdb/gdbtypes.c 2010-04-03 21:04:13.000000000 +0200
|
||||
@@ -3798,10 +3798,11 @@ arch_composite_type (struct gdbarch *gdb
|
||||
}
|
||||
|
||||
/* Add new field with name NAME and type FIELD to composite type T.
|
||||
- ALIGNMENT (if non-zero) specifies the minimum field alignment. */
|
||||
-void
|
||||
-append_composite_type_field_aligned (struct type *t, char *name,
|
||||
- struct type *field, int alignment)
|
||||
+ Do not set the field's position or adjust the type's length;
|
||||
+ the caller should do so. Return the new field. */
|
||||
+struct field *
|
||||
+append_composite_type_field_raw (struct type *t, char *name,
|
||||
+ struct type *field)
|
||||
{
|
||||
struct field *f;
|
||||
TYPE_NFIELDS (t) = TYPE_NFIELDS (t) + 1;
|
||||
@@ -3811,6 +3812,16 @@ append_composite_type_field_aligned (str
|
||||
memset (f, 0, sizeof f[0]);
|
||||
FIELD_TYPE (f[0]) = field;
|
||||
FIELD_NAME (f[0]) = name;
|
||||
+ return f;
|
||||
+}
|
||||
+
|
||||
+/* Add new field with name NAME and type FIELD to composite type T.
|
||||
+ ALIGNMENT (if non-zero) specifies the minimum field alignment. */
|
||||
+void
|
||||
+append_composite_type_field_aligned (struct type *t, char *name,
|
||||
+ struct type *field, int alignment)
|
||||
+{
|
||||
+ struct field *f = append_composite_type_field_raw (t, name, field);
|
||||
if (TYPE_CODE (t) == TYPE_CODE_UNION)
|
||||
{
|
||||
if (TYPE_LENGTH (t) < TYPE_LENGTH (field))
|
||||
--- gdb-7.1-p0/gdb/gdbtypes.h 2010-04-03 20:24:51.000000000 +0200
|
||||
+++ gdb-7.1/gdb/gdbtypes.h 2010-04-03 21:04:13.000000000 +0200
|
||||
@@ -1395,6 +1395,8 @@ extern void append_composite_type_field_
|
||||
char *name,
|
||||
struct type *field,
|
||||
int alignment);
|
||||
+struct field *append_composite_type_field_raw (struct type *t, char *name,
|
||||
+ struct type *field);
|
||||
|
||||
/* Helper functions to construct a bit flags type. An initially empty
|
||||
type is created using arch_flag_type(). Flags are then added using
|
||||
--- gdb-7.1-p0/gdb/target-descriptions.c 2010-02-10 19:45:02.000000000 +0100
|
||||
+++ gdb-7.1/gdb/target-descriptions.c 2010-04-03 21:04:13.000000000 +0200
|
||||
@@ -90,9 +90,17 @@ typedef struct tdesc_type_field
|
||||
{
|
||||
char *name;
|
||||
struct tdesc_type *type;
|
||||
+ int start, end;
|
||||
} tdesc_type_field;
|
||||
DEF_VEC_O(tdesc_type_field);
|
||||
|
||||
+typedef struct tdesc_type_flag
|
||||
+{
|
||||
+ char *name;
|
||||
+ int start;
|
||||
+} tdesc_type_flag;
|
||||
+DEF_VEC_O(tdesc_type_flag);
|
||||
+
|
||||
typedef struct tdesc_type
|
||||
{
|
||||
/* The name of this type. */
|
||||
@@ -123,7 +131,9 @@ typedef struct tdesc_type
|
||||
|
||||
/* Types defined by a target feature. */
|
||||
TDESC_TYPE_VECTOR,
|
||||
- TDESC_TYPE_UNION
|
||||
+ TDESC_TYPE_STRUCT,
|
||||
+ TDESC_TYPE_UNION,
|
||||
+ TDESC_TYPE_FLAGS
|
||||
} kind;
|
||||
|
||||
/* Kind-specific data. */
|
||||
@@ -136,11 +146,19 @@ typedef struct tdesc_type
|
||||
int count;
|
||||
} v;
|
||||
|
||||
- /* Union type. */
|
||||
+ /* Struct or union type. */
|
||||
struct
|
||||
{
|
||||
VEC(tdesc_type_field) *fields;
|
||||
+ LONGEST size;
|
||||
} u;
|
||||
+
|
||||
+ /* Flags type. */
|
||||
+ struct
|
||||
+ {
|
||||
+ VEC(tdesc_type_flag) *flags;
|
||||
+ LONGEST size;
|
||||
+ } f;
|
||||
} u;
|
||||
} *tdesc_type_p;
|
||||
DEF_VEC_P(tdesc_type_p);
|
||||
@@ -652,6 +670,66 @@ tdesc_gdb_type (struct gdbarch *gdbarch,
|
||||
return type;
|
||||
}
|
||||
|
||||
+ case TDESC_TYPE_STRUCT:
|
||||
+ {
|
||||
+ struct type *type, *field_type;
|
||||
+ struct tdesc_type_field *f;
|
||||
+ int ix;
|
||||
+
|
||||
+ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
|
||||
+ TYPE_NAME (type) = xstrdup (tdesc_type->name);
|
||||
+ TYPE_TAG_NAME (type) = TYPE_NAME (type);
|
||||
+
|
||||
+ for (ix = 0;
|
||||
+ VEC_iterate (tdesc_type_field, tdesc_type->u.u.fields, ix, f);
|
||||
+ ix++)
|
||||
+ {
|
||||
+ if (f->type == NULL)
|
||||
+ {
|
||||
+ /* Bitfield. */
|
||||
+ struct field *fld;
|
||||
+ struct type *field_type;
|
||||
+ int bitsize, total_size;
|
||||
+
|
||||
+ /* This invariant should be preserved while creating
|
||||
+ types. */
|
||||
+ gdb_assert (tdesc_type->u.u.size != 0);
|
||||
+ if (tdesc_type->u.u.size > 4)
|
||||
+ field_type = builtin_type (gdbarch)->builtin_uint64;
|
||||
+ else
|
||||
+ field_type = builtin_type (gdbarch)->builtin_uint32;
|
||||
+
|
||||
+ fld = append_composite_type_field_raw (type, xstrdup (f->name),
|
||||
+ field_type);
|
||||
+
|
||||
+ /* For little-endian, BITPOS counts from the LSB of
|
||||
+ the structure and marks the LSB of the field. For
|
||||
+ big-endian, BITPOS counts from the MSB of the
|
||||
+ structure and marks the MSB of the field. Either
|
||||
+ way, it is the number of bits to the "left" of the
|
||||
+ field. To calculate this in big-endian, we need
|
||||
+ the total size of the structure. */
|
||||
+ bitsize = f->end - f->start + 1;
|
||||
+ total_size = tdesc_type->u.u.size * TARGET_CHAR_BIT;
|
||||
+ if (gdbarch_bits_big_endian (gdbarch))
|
||||
+ FIELD_BITPOS (fld[0]) = total_size - f->start - bitsize;
|
||||
+ else
|
||||
+ FIELD_BITPOS (fld[0]) = f->start;
|
||||
+ FIELD_BITSIZE (fld[0]) = bitsize;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ field_type = tdesc_gdb_type (gdbarch, f->type);
|
||||
+ append_composite_type_field (type, xstrdup (f->name),
|
||||
+ field_type);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (tdesc_type->u.u.size != 0)
|
||||
+ TYPE_LENGTH (type) = tdesc_type->u.u.size;
|
||||
+ return type;
|
||||
+ }
|
||||
+
|
||||
case TDESC_TYPE_UNION:
|
||||
{
|
||||
struct type *type, *field_type;
|
||||
@@ -668,12 +746,30 @@ tdesc_gdb_type (struct gdbarch *gdbarch,
|
||||
field_type = tdesc_gdb_type (gdbarch, f->type);
|
||||
append_composite_type_field (type, xstrdup (f->name), field_type);
|
||||
|
||||
- /* If any of the children of this union are vectors, flag the
|
||||
+ /* If any of the children of a union are vectors, flag the
|
||||
union as a vector also. This allows e.g. a union of two
|
||||
vector types to show up automatically in "info vector". */
|
||||
if (TYPE_VECTOR (field_type))
|
||||
TYPE_VECTOR (type) = 1;
|
||||
}
|
||||
+ return type;
|
||||
+ }
|
||||
+
|
||||
+ case TDESC_TYPE_FLAGS:
|
||||
+ {
|
||||
+ struct type *type, *field_type;
|
||||
+ struct tdesc_type_flag *f;
|
||||
+ int ix;
|
||||
+
|
||||
+ type = arch_flags_type (gdbarch, xstrdup (tdesc_type->name),
|
||||
+ tdesc_type->u.f.size);
|
||||
+ for (ix = 0;
|
||||
+ VEC_iterate (tdesc_type_flag, tdesc_type->u.f.flags, ix, f);
|
||||
+ ix++)
|
||||
+ /* Note that contrary to the function name, this call will
|
||||
+ just set the properties of an already-allocated
|
||||
+ field. */
|
||||
+ append_flags_type_flag (type, f->start, f->name);
|
||||
|
||||
return type;
|
||||
}
|
||||
@@ -1161,6 +1257,7 @@ tdesc_free_type (struct tdesc_type *type
|
||||
|
||||
switch (type->kind)
|
||||
{
|
||||
+ case TDESC_TYPE_STRUCT:
|
||||
case TDESC_TYPE_UNION:
|
||||
{
|
||||
struct tdesc_type_field *f;
|
||||
@@ -1175,6 +1272,20 @@ tdesc_free_type (struct tdesc_type *type
|
||||
}
|
||||
break;
|
||||
|
||||
+ case TDESC_TYPE_FLAGS:
|
||||
+ {
|
||||
+ struct tdesc_type_flag *f;
|
||||
+ int ix;
|
||||
+
|
||||
+ for (ix = 0;
|
||||
+ VEC_iterate (tdesc_type_flag, type->u.f.flags, ix, f);
|
||||
+ ix++)
|
||||
+ xfree (f->name);
|
||||
+
|
||||
+ VEC_free (tdesc_type_flag, type->u.f.flags);
|
||||
+ }
|
||||
+ break;
|
||||
+
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -1199,6 +1310,29 @@ tdesc_create_vector (struct tdesc_featur
|
||||
}
|
||||
|
||||
struct tdesc_type *
|
||||
+tdesc_create_struct (struct tdesc_feature *feature, const char *name)
|
||||
+{
|
||||
+ struct tdesc_type *type = XZALLOC (struct tdesc_type);
|
||||
+
|
||||
+ type->name = xstrdup (name);
|
||||
+ type->kind = TDESC_TYPE_STRUCT;
|
||||
+
|
||||
+ VEC_safe_push (tdesc_type_p, feature->types, type);
|
||||
+ return type;
|
||||
+}
|
||||
+
|
||||
+/* Set the total length of TYPE. Structs which contain bitfields may
|
||||
+ omit the reserved bits, so the end of the last field may not
|
||||
+ suffice. */
|
||||
+
|
||||
+void
|
||||
+tdesc_set_struct_size (struct tdesc_type *type, LONGEST size)
|
||||
+{
|
||||
+ gdb_assert (type->kind == TDESC_TYPE_STRUCT);
|
||||
+ type->u.u.size = size;
|
||||
+}
|
||||
+
|
||||
+struct tdesc_type *
|
||||
tdesc_create_union (struct tdesc_feature *feature, const char *name)
|
||||
{
|
||||
struct tdesc_type *type = XZALLOC (struct tdesc_type);
|
||||
@@ -1210,13 +1344,32 @@ tdesc_create_union (struct tdesc_feature
|
||||
return type;
|
||||
}
|
||||
|
||||
+struct tdesc_type *
|
||||
+tdesc_create_flags (struct tdesc_feature *feature, const char *name,
|
||||
+ LONGEST size)
|
||||
+{
|
||||
+ struct tdesc_type *type = XZALLOC (struct tdesc_type);
|
||||
+
|
||||
+ type->name = xstrdup (name);
|
||||
+ type->kind = TDESC_TYPE_FLAGS;
|
||||
+ type->u.f.size = size;
|
||||
+
|
||||
+ VEC_safe_push (tdesc_type_p, feature->types, type);
|
||||
+ return type;
|
||||
+}
|
||||
+
|
||||
+/* Add a new field. Return a temporary pointer to the field, which
|
||||
+ is only valid until the next call to tdesc_add_field (the vector
|
||||
+ might be reallocated). */
|
||||
+
|
||||
void
|
||||
tdesc_add_field (struct tdesc_type *type, const char *field_name,
|
||||
struct tdesc_type *field_type)
|
||||
{
|
||||
struct tdesc_type_field f = { 0 };
|
||||
|
||||
- gdb_assert (type->kind == TDESC_TYPE_UNION);
|
||||
+ gdb_assert (type->kind == TDESC_TYPE_UNION
|
||||
+ || type->kind == TDESC_TYPE_STRUCT);
|
||||
|
||||
f.name = xstrdup (field_name);
|
||||
f.type = field_type;
|
||||
@@ -1224,6 +1377,37 @@ tdesc_add_field (struct tdesc_type *type
|
||||
VEC_safe_push (tdesc_type_field, type->u.u.fields, &f);
|
||||
}
|
||||
|
||||
+/* Add a new bitfield. */
|
||||
+
|
||||
+void
|
||||
+tdesc_add_bitfield (struct tdesc_type *type, const char *field_name,
|
||||
+ int start, int end)
|
||||
+{
|
||||
+ struct tdesc_type_field f = { 0 };
|
||||
+
|
||||
+ gdb_assert (type->kind == TDESC_TYPE_STRUCT);
|
||||
+
|
||||
+ f.name = xstrdup (field_name);
|
||||
+ f.start = start;
|
||||
+ f.end = end;
|
||||
+
|
||||
+ VEC_safe_push (tdesc_type_field, type->u.u.fields, &f);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+tdesc_add_flag (struct tdesc_type *type, int start,
|
||||
+ const char *flag_name)
|
||||
+{
|
||||
+ struct tdesc_type_flag f = { 0 };
|
||||
+
|
||||
+ gdb_assert (type->kind == TDESC_TYPE_FLAGS);
|
||||
+
|
||||
+ f.name = xstrdup (flag_name);
|
||||
+ f.start = start;
|
||||
+
|
||||
+ VEC_safe_push (tdesc_type_flag, type->u.f.flags, &f);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
tdesc_free_feature (struct tdesc_feature *feature)
|
||||
{
|
||||
--- gdb-7.1-p0/gdb/target-descriptions.h 2010-02-10 19:45:03.000000000 +0100
|
||||
+++ gdb-7.1/gdb/target-descriptions.h 2010-04-03 21:04:13.000000000 +0200
|
||||
@@ -205,10 +205,20 @@ struct tdesc_type *tdesc_create_vector (
|
||||
const char *name,
|
||||
struct tdesc_type *field_type,
|
||||
int count);
|
||||
+struct tdesc_type *tdesc_create_struct (struct tdesc_feature *feature,
|
||||
+ const char *name);
|
||||
+void tdesc_set_struct_size (struct tdesc_type *type, LONGEST size);
|
||||
struct tdesc_type *tdesc_create_union (struct tdesc_feature *feature,
|
||||
const char *name);
|
||||
+struct tdesc_type *tdesc_create_flags (struct tdesc_feature *feature,
|
||||
+ const char *name,
|
||||
+ LONGEST size);
|
||||
void tdesc_add_field (struct tdesc_type *type, const char *field_name,
|
||||
struct tdesc_type *field_type);
|
||||
+void tdesc_add_bitfield (struct tdesc_type *type, const char *field_name,
|
||||
+ int start, int end);
|
||||
+void tdesc_add_flag (struct tdesc_type *type, int start,
|
||||
+ const char *flag_name);
|
||||
void tdesc_create_reg (struct tdesc_feature *feature, const char *name,
|
||||
int regnum, int save_restore, const char *group,
|
||||
int bitsize, const char *type);
|
||||
--- gdb-7.1-p0/gdb/testsuite/gdb.xml/extra-regs.xml 2007-02-08 22:00:36.000000000 +0100
|
||||
+++ gdb-7.1/gdb/testsuite/gdb.xml/extra-regs.xml 2010-04-03 21:04:13.000000000 +0200
|
||||
@@ -8,9 +8,27 @@
|
||||
<field name="v2" type="v2int16"/>
|
||||
</union>
|
||||
|
||||
+ <struct id="struct1">
|
||||
+ <field name="v4" type="v4int8"/>
|
||||
+ <field name="v2" type="v2int16"/>
|
||||
+ </struct>
|
||||
+
|
||||
+ <struct id="struct2" size="8">
|
||||
+ <field name="f1" start="0" end="34"/>
|
||||
+ <field name="f2" start="63" end="63"/>
|
||||
+ </struct>
|
||||
+
|
||||
+ <flags id="flags" size="4">
|
||||
+ <field name="X" start="0" end="0"/>
|
||||
+ <field name="Y" start="2" end="2"/>
|
||||
+ </flags>
|
||||
+
|
||||
<reg name="extrareg" bitsize="32"/>
|
||||
<reg name="uintreg" bitsize="32" type="uint32"/>
|
||||
<reg name="vecreg" bitsize="32" type="v4int8"/>
|
||||
<reg name="unionreg" bitsize="32" type="vecint"/>
|
||||
+ <reg name="structreg" bitsize="64" type="struct1"/>
|
||||
+ <reg name="bitfields" bitsize="64" type="struct2"/>
|
||||
+ <reg name="flags" bitsize="32" type="flags"/>
|
||||
</feature>
|
||||
</target>
|
||||
--- gdb-7.1-p0/gdb/testsuite/gdb.xml/tdesc-regs.exp 2010-04-03 20:59:52.000000000 +0200
|
||||
+++ gdb-7.1/gdb/testsuite/gdb.xml/tdesc-regs.exp 2010-04-03 21:04:13.000000000 +0200
|
||||
@@ -141,6 +141,11 @@ gdb_test "ptype \$vecreg" "type = int8_t
|
||||
gdb_test "ptype \$unionreg" \
|
||||
"type = union {\r\n *v4int8 v4;\r\n *v2int16 v2;\r\n}"
|
||||
gdb_test "ptype \$unionreg.v4" "type = int8_t \\\[4\\\]"
|
||||
+gdb_test "ptype \$structreg" \
|
||||
+ "type = struct struct1 {\r\n *v4int8 v4;\r\n *v2int16 v2;\r\n}"
|
||||
+gdb_test "ptype \$structreg.v4" "type = int8_t \\\[4\\\]"
|
||||
+gdb_test "ptype \$bitfields" \
|
||||
+ "type = struct struct2 {\r\n *uint64_t f1 : 35;\r\n *uint64_t f2 : 1;\r\n}"
|
||||
|
||||
load_description "core-only.xml" ""
|
||||
# The extra register from the previous description should be gone.
|
||||
--- gdb-7.1-p0/gdb/xml-tdesc.c 2010-01-01 08:31:46.000000000 +0100
|
||||
+++ gdb-7.1/gdb/xml-tdesc.c 2010-04-03 21:04:13.000000000 +0200
|
||||
@@ -85,8 +85,15 @@ struct tdesc_parsing_data
|
||||
it does not have its own. This starts at zero. */
|
||||
int next_regnum;
|
||||
|
||||
- /* The union we are currently parsing, or last parsed. */
|
||||
- struct tdesc_type *current_union;
|
||||
+ /* The struct or union we are currently parsing, or last parsed. */
|
||||
+ struct tdesc_type *current_type;
|
||||
+
|
||||
+ /* The byte size of the current struct type, if specified. Zero
|
||||
+ if not specified. */
|
||||
+ int current_type_size;
|
||||
+
|
||||
+ /* Whether the current type is a flags type. */
|
||||
+ int current_type_is_flags;
|
||||
};
|
||||
|
||||
/* Handle the end of an <architecture> element and its value. */
|
||||
@@ -229,11 +236,57 @@ tdesc_start_union (struct gdb_xml_parser
|
||||
struct tdesc_parsing_data *data = user_data;
|
||||
char *id = VEC_index (gdb_xml_value_s, attributes, 0)->value;
|
||||
|
||||
- data->current_union = tdesc_create_union (data->current_feature, id);
|
||||
+ data->current_type = tdesc_create_union (data->current_feature, id);
|
||||
+ data->current_type_size = 0;
|
||||
+ data->current_type_is_flags = 0;
|
||||
+}
|
||||
+
|
||||
+/* Handle the start of a <struct> element. Initialize the type and
|
||||
+ record it with the current feature. */
|
||||
+
|
||||
+static void
|
||||
+tdesc_start_struct (struct gdb_xml_parser *parser,
|
||||
+ const struct gdb_xml_element *element,
|
||||
+ void *user_data, VEC(gdb_xml_value_s) *attributes)
|
||||
+{
|
||||
+ struct tdesc_parsing_data *data = user_data;
|
||||
+ char *id = VEC_index (gdb_xml_value_s, attributes, 0)->value;
|
||||
+ struct tdesc_type *type;
|
||||
+
|
||||
+ type = tdesc_create_struct (data->current_feature, id);
|
||||
+ data->current_type = type;
|
||||
+ data->current_type_size = 0;
|
||||
+ data->current_type_is_flags = 0;
|
||||
+
|
||||
+ if (VEC_length (gdb_xml_value_s, attributes) > 1)
|
||||
+ {
|
||||
+ int size = (int) * (ULONGEST *)
|
||||
+ VEC_index (gdb_xml_value_s, attributes, 1)->value;
|
||||
+ tdesc_set_struct_size (type, size);
|
||||
+ data->current_type_size = size;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+tdesc_start_flags (struct gdb_xml_parser *parser,
|
||||
+ const struct gdb_xml_element *element,
|
||||
+ void *user_data, VEC(gdb_xml_value_s) *attributes)
|
||||
+{
|
||||
+ struct tdesc_parsing_data *data = user_data;
|
||||
+ char *id = VEC_index (gdb_xml_value_s, attributes, 0)->value;
|
||||
+ int length = (int) * (ULONGEST *)
|
||||
+ VEC_index (gdb_xml_value_s, attributes, 1)->value;
|
||||
+ struct tdesc_type *type;
|
||||
+
|
||||
+ type = tdesc_create_flags (data->current_feature, id, length);
|
||||
+
|
||||
+ data->current_type = type;
|
||||
+ data->current_type_size = 0;
|
||||
+ data->current_type_is_flags = 1;
|
||||
}
|
||||
|
||||
/* Handle the start of a <field> element. Attach the field to the
|
||||
- current union. */
|
||||
+ current struct or union. */
|
||||
|
||||
static void
|
||||
tdesc_start_field (struct gdb_xml_parser *parser,
|
||||
@@ -241,20 +294,84 @@ tdesc_start_field (struct gdb_xml_parser
|
||||
void *user_data, VEC(gdb_xml_value_s) *attributes)
|
||||
{
|
||||
struct tdesc_parsing_data *data = user_data;
|
||||
+ int ix = 0, length;
|
||||
struct gdb_xml_value *attrs = VEC_address (gdb_xml_value_s, attributes);
|
||||
struct tdesc_type *field_type;
|
||||
char *field_name, *field_type_id;
|
||||
+ int start, end;
|
||||
|
||||
- field_name = attrs[0].value;
|
||||
- field_type_id = attrs[1].value;
|
||||
+ length = VEC_length (gdb_xml_value_s, attributes);
|
||||
|
||||
- field_type = tdesc_named_type (data->current_feature, field_type_id);
|
||||
- if (field_type == NULL)
|
||||
- gdb_xml_error (parser, _("Union field \"%s\" references undefined "
|
||||
- "type \"%s\""),
|
||||
- field_name, field_type_id);
|
||||
+ field_name = attrs[ix++].value;
|
||||
+
|
||||
+ if (ix < length && strcmp (attrs[ix].name, "type") == 0)
|
||||
+ field_type_id = attrs[ix++].value;
|
||||
+ else
|
||||
+ field_type_id = NULL;
|
||||
+
|
||||
+ if (ix < length && strcmp (attrs[ix].name, "start") == 0)
|
||||
+ start = * (ULONGEST *) attrs[ix++].value;
|
||||
+ else
|
||||
+ start = -1;
|
||||
+
|
||||
+ if (ix < length && strcmp (attrs[ix].name, "end") == 0)
|
||||
+ end = * (ULONGEST *) attrs[ix++].value;
|
||||
+ else
|
||||
+ end = -1;
|
||||
+
|
||||
+ if (field_type_id != NULL)
|
||||
+ {
|
||||
+ if (data->current_type_is_flags)
|
||||
+ gdb_xml_error (parser, _("Cannot add typed field \"%s\" to flags"),
|
||||
+ field_name);
|
||||
+ if (data->current_type_size != 0)
|
||||
+ gdb_xml_error (parser,
|
||||
+ _("Explicitly sized type can not contain non-bitfield \"%s\""),
|
||||
+ field_name);
|
||||
+
|
||||
+ field_type = tdesc_named_type (data->current_feature, field_type_id);
|
||||
+ if (field_type == NULL)
|
||||
+ gdb_xml_error (parser, _("Field \"%s\" references undefined "
|
||||
+ "type \"%s\""),
|
||||
+ field_name, field_type_id);
|
||||
+
|
||||
+ tdesc_add_field (data->current_type, field_name, field_type);
|
||||
+ }
|
||||
+ else if (start != -1 && end != -1)
|
||||
+ {
|
||||
+ struct tdesc_type *t = data->current_type;
|
||||
+
|
||||
+ if (data->current_type_is_flags)
|
||||
+ tdesc_add_flag (t, start, field_name);
|
||||
+ else
|
||||
+ {
|
||||
+ if (data->current_type_size == 0)
|
||||
+ gdb_xml_error (parser,
|
||||
+ _("Implicitly sized type can not contain bitfield \"%s\""),
|
||||
+ field_name);
|
||||
+
|
||||
+ if (end >= 64)
|
||||
+ gdb_xml_error (parser,
|
||||
+ _("Bitfield \"%s\" goes past 64 bits (unsupported)"),
|
||||
+ field_name);
|
||||
+
|
||||
+ /* 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);
|
||||
|
||||
- tdesc_add_field (data->current_union, field_name, field_type);
|
||||
+ if (end >= data->current_type_size * TARGET_CHAR_BIT)
|
||||
+ gdb_xml_error (parser, _("Bitfield \"%s\" does not fit in struct"));
|
||||
+
|
||||
+ tdesc_add_bitfield (t, field_name, start, end);
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ gdb_xml_error (parser, _("Field \"%s\" has neither type nor bit position"),
|
||||
+ field_name);
|
||||
}
|
||||
|
||||
/* Handle the start of a <vector> element. Initialize the type and
|
||||
@@ -287,11 +404,13 @@ tdesc_start_vector (struct gdb_xml_parse
|
||||
|
||||
static const struct gdb_xml_attribute field_attributes[] = {
|
||||
{ "name", GDB_XML_AF_NONE, NULL, NULL },
|
||||
- { "type", GDB_XML_AF_NONE, NULL, NULL },
|
||||
+ { "type", GDB_XML_AF_OPTIONAL, NULL, NULL },
|
||||
+ { "start", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
|
||||
+ { "end", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
|
||||
{ NULL, GDB_XML_AF_NONE, NULL, NULL }
|
||||
};
|
||||
|
||||
-static const struct gdb_xml_element union_children[] = {
|
||||
+static const struct gdb_xml_element struct_union_children[] = {
|
||||
{ "field", field_attributes, NULL, GDB_XML_EF_REPEATABLE,
|
||||
tdesc_start_field, NULL },
|
||||
{ NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
|
||||
@@ -308,8 +427,15 @@ static const struct gdb_xml_attribute re
|
||||
{ NULL, GDB_XML_AF_NONE, NULL, NULL }
|
||||
};
|
||||
|
||||
-static const struct gdb_xml_attribute union_attributes[] = {
|
||||
+static const struct gdb_xml_attribute struct_union_attributes[] = {
|
||||
{ "id", GDB_XML_AF_NONE, NULL, NULL },
|
||||
+ { "size", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL},
|
||||
+ { NULL, GDB_XML_AF_NONE, NULL, NULL }
|
||||
+};
|
||||
+
|
||||
+static const struct gdb_xml_attribute flags_attributes[] = {
|
||||
+ { "id", GDB_XML_AF_NONE, NULL, NULL },
|
||||
+ { "size", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL},
|
||||
{ NULL, GDB_XML_AF_NONE, NULL, NULL }
|
||||
};
|
||||
|
||||
@@ -329,9 +455,15 @@ static const struct gdb_xml_element feat
|
||||
{ "reg", reg_attributes, NULL,
|
||||
GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
|
||||
tdesc_start_reg, NULL },
|
||||
- { "union", union_attributes, union_children,
|
||||
+ { "struct", struct_union_attributes, struct_union_children,
|
||||
+ GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
|
||||
+ tdesc_start_struct, NULL },
|
||||
+ { "union", struct_union_attributes, struct_union_children,
|
||||
GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
|
||||
tdesc_start_union, NULL },
|
||||
+ { "flags", flags_attributes, struct_union_children,
|
||||
+ GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
|
||||
+ tdesc_start_flags, NULL },
|
||||
{ "vector", vector_attributes, NULL,
|
||||
GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
|
||||
tdesc_start_vector, NULL },
|
|
@ -0,0 +1,457 @@
|
|||
[ Backported. ]
|
||||
|
||||
commit 0257d639d42f896a359993ae8adb5792e280f65f
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Mon Mar 1 17:26:02 2010 +0000
|
||||
|
||||
Remove TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.
|
||||
|
||||
2010-03-01 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* target-descriptions.c (tdesc_type): Remove
|
||||
TDESC_TYPE_I386_EFLAGS and TDESC_TYPE_I386_MXCSR.
|
||||
(tdesc_predefined_types): Likewise.
|
||||
(tdesc_gdb_type): Likewise. Pass NULL to append_flags_type_flag
|
||||
if flag name is empty.
|
||||
(maint_print_c_tdesc_cmd): Handle TDESC_TYPE_FLAGS.
|
||||
|
||||
* features/i386/32bit-core.xml: Define i386_eflags.
|
||||
* features/i386/64bit-core.xml: Likewise.
|
||||
|
||||
* features/i386/32bit-sse.xml: Define i386_mxcsr.
|
||||
* features/i386/64bit-sse.xml: Likewise.
|
||||
|
||||
* features/i386/amd64-linux.c: Regenerated.
|
||||
* features/i386/amd64.c: Likewise.
|
||||
* features/i386/i386-linux.c: Likewise.
|
||||
* features/i386/i386.c: Likewise.
|
||||
|
||||
--- gdb-7.1-p1/gdb/features/i386/32bit-core.xml 2010-02-08 06:08:46.000000000 +0100
|
||||
+++ gdb-7.1/gdb/features/i386/32bit-core.xml 2010-04-03 21:06:12.000000000 +0200
|
||||
@@ -7,6 +7,26 @@
|
||||
|
||||
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
||||
<feature name="org.gnu.gdb.i386.core">
|
||||
+ <flags id="i386_eflags" size="4">
|
||||
+ <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"/>
|
||||
<reg name="ecx" bitsize="32" type="int32"/>
|
||||
<reg name="edx" bitsize="32" type="int32"/>
|
||||
--- gdb-7.1-p1/gdb/features/i386/32bit-sse.xml 2010-02-08 06:08:46.000000000 +0100
|
||||
+++ gdb-7.1/gdb/features/i386/32bit-sse.xml 2010-04-03 21:06:12.000000000 +0200
|
||||
@@ -22,6 +22,22 @@
|
||||
<field name="v2_int64" type="v2i64"/>
|
||||
<field name="uint128" type="uint128"/>
|
||||
</union>
|
||||
+ <flags id="i386_mxcsr" size="4">
|
||||
+ <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"/>
|
||||
<reg name="xmm1" bitsize="128" type="vec128"/>
|
||||
--- gdb-7.1-p1/gdb/features/i386/64bit-core.xml 2010-02-08 06:08:46.000000000 +0100
|
||||
+++ gdb-7.1/gdb/features/i386/64bit-core.xml 2010-04-03 21:06:12.000000000 +0200
|
||||
@@ -7,6 +7,26 @@
|
||||
|
||||
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
||||
<feature name="org.gnu.gdb.i386.core">
|
||||
+ <flags id="i386_eflags" size="4">
|
||||
+ <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"/>
|
||||
<reg name="rbx" bitsize="64" type="int64"/>
|
||||
<reg name="rcx" bitsize="64" type="int64"/>
|
||||
--- gdb-7.1-p1/gdb/features/i386/64bit-sse.xml 2010-02-08 06:08:46.000000000 +0100
|
||||
+++ gdb-7.1/gdb/features/i386/64bit-sse.xml 2010-04-03 21:06:12.000000000 +0200
|
||||
@@ -22,6 +22,22 @@
|
||||
<field name="v2_int64" type="v2i64"/>
|
||||
<field name="uint128" type="uint128"/>
|
||||
</union>
|
||||
+ <flags id="i386_mxcsr" size="4">
|
||||
+ <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"/>
|
||||
<reg name="xmm1" bitsize="128" type="vec128"/>
|
||||
--- gdb-7.1-p1/gdb/features/i386/amd64-linux.c 2010-02-08 06:08:46.000000000 +0100
|
||||
+++ gdb-7.1/gdb/features/i386/amd64-linux.c 2010-04-03 21:06:12.000000000 +0200
|
||||
@@ -17,6 +17,25 @@ initialize_tdesc_amd64_linux (void)
|
||||
set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
|
||||
|
||||
feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
|
||||
+ field_type = tdesc_create_flags (feature, "i386_eflags", 4);
|
||||
+ tdesc_add_flag (field_type, 0, "CF");
|
||||
+ tdesc_add_flag (field_type, 1, "");
|
||||
+ tdesc_add_flag (field_type, 2, "PF");
|
||||
+ tdesc_add_flag (field_type, 4, "AF");
|
||||
+ tdesc_add_flag (field_type, 6, "ZF");
|
||||
+ tdesc_add_flag (field_type, 7, "SF");
|
||||
+ tdesc_add_flag (field_type, 8, "TF");
|
||||
+ tdesc_add_flag (field_type, 9, "IF");
|
||||
+ tdesc_add_flag (field_type, 10, "DF");
|
||||
+ tdesc_add_flag (field_type, 11, "OF");
|
||||
+ tdesc_add_flag (field_type, 14, "NT");
|
||||
+ tdesc_add_flag (field_type, 16, "RF");
|
||||
+ tdesc_add_flag (field_type, 17, "VM");
|
||||
+ tdesc_add_flag (field_type, 18, "AC");
|
||||
+ tdesc_add_flag (field_type, 19, "VIF");
|
||||
+ tdesc_add_flag (field_type, 20, "VIP");
|
||||
+ tdesc_add_flag (field_type, 21, "ID");
|
||||
+
|
||||
tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
|
||||
tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
|
||||
tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
|
||||
@@ -93,6 +112,22 @@ initialize_tdesc_amd64_linux (void)
|
||||
field_type = tdesc_named_type (feature, "uint128");
|
||||
tdesc_add_field (type, "uint128", field_type);
|
||||
|
||||
+ field_type = tdesc_create_flags (feature, "i386_mxcsr", 4);
|
||||
+ tdesc_add_flag (field_type, 0, "IE");
|
||||
+ tdesc_add_flag (field_type, 1, "DE");
|
||||
+ tdesc_add_flag (field_type, 2, "ZE");
|
||||
+ tdesc_add_flag (field_type, 3, "OE");
|
||||
+ tdesc_add_flag (field_type, 4, "UE");
|
||||
+ tdesc_add_flag (field_type, 5, "PE");
|
||||
+ tdesc_add_flag (field_type, 6, "DAZ");
|
||||
+ tdesc_add_flag (field_type, 7, "IM");
|
||||
+ tdesc_add_flag (field_type, 8, "DM");
|
||||
+ tdesc_add_flag (field_type, 9, "ZM");
|
||||
+ tdesc_add_flag (field_type, 10, "OM");
|
||||
+ tdesc_add_flag (field_type, 11, "UM");
|
||||
+ tdesc_add_flag (field_type, 12, "PM");
|
||||
+ tdesc_add_flag (field_type, 15, "FZ");
|
||||
+
|
||||
tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
|
||||
tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
|
||||
tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
|
||||
--- gdb-7.1-p1/gdb/features/i386/amd64.c 2010-02-08 06:08:46.000000000 +0100
|
||||
+++ gdb-7.1/gdb/features/i386/amd64.c 2010-04-03 21:06:12.000000000 +0200
|
||||
@@ -15,6 +15,25 @@ initialize_tdesc_amd64 (void)
|
||||
set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
|
||||
|
||||
feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
|
||||
+ field_type = tdesc_create_flags (feature, "i386_eflags", 4);
|
||||
+ tdesc_add_flag (field_type, 0, "CF");
|
||||
+ tdesc_add_flag (field_type, 1, "");
|
||||
+ tdesc_add_flag (field_type, 2, "PF");
|
||||
+ tdesc_add_flag (field_type, 4, "AF");
|
||||
+ tdesc_add_flag (field_type, 6, "ZF");
|
||||
+ tdesc_add_flag (field_type, 7, "SF");
|
||||
+ tdesc_add_flag (field_type, 8, "TF");
|
||||
+ tdesc_add_flag (field_type, 9, "IF");
|
||||
+ tdesc_add_flag (field_type, 10, "DF");
|
||||
+ tdesc_add_flag (field_type, 11, "OF");
|
||||
+ tdesc_add_flag (field_type, 14, "NT");
|
||||
+ tdesc_add_flag (field_type, 16, "RF");
|
||||
+ tdesc_add_flag (field_type, 17, "VM");
|
||||
+ tdesc_add_flag (field_type, 18, "AC");
|
||||
+ tdesc_add_flag (field_type, 19, "VIF");
|
||||
+ tdesc_add_flag (field_type, 20, "VIP");
|
||||
+ tdesc_add_flag (field_type, 21, "ID");
|
||||
+
|
||||
tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
|
||||
tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
|
||||
tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
|
||||
@@ -91,6 +110,22 @@ initialize_tdesc_amd64 (void)
|
||||
field_type = tdesc_named_type (feature, "uint128");
|
||||
tdesc_add_field (type, "uint128", field_type);
|
||||
|
||||
+ field_type = tdesc_create_flags (feature, "i386_mxcsr", 4);
|
||||
+ tdesc_add_flag (field_type, 0, "IE");
|
||||
+ tdesc_add_flag (field_type, 1, "DE");
|
||||
+ tdesc_add_flag (field_type, 2, "ZE");
|
||||
+ tdesc_add_flag (field_type, 3, "OE");
|
||||
+ tdesc_add_flag (field_type, 4, "UE");
|
||||
+ tdesc_add_flag (field_type, 5, "PE");
|
||||
+ tdesc_add_flag (field_type, 6, "DAZ");
|
||||
+ tdesc_add_flag (field_type, 7, "IM");
|
||||
+ tdesc_add_flag (field_type, 8, "DM");
|
||||
+ tdesc_add_flag (field_type, 9, "ZM");
|
||||
+ tdesc_add_flag (field_type, 10, "OM");
|
||||
+ tdesc_add_flag (field_type, 11, "UM");
|
||||
+ tdesc_add_flag (field_type, 12, "PM");
|
||||
+ tdesc_add_flag (field_type, 15, "FZ");
|
||||
+
|
||||
tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
|
||||
tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
|
||||
tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
|
||||
--- gdb-7.1-p1/gdb/features/i386/i386-linux.c 2010-02-08 06:08:46.000000000 +0100
|
||||
+++ gdb-7.1/gdb/features/i386/i386-linux.c 2010-04-03 21:06:12.000000000 +0200
|
||||
@@ -17,6 +17,25 @@ initialize_tdesc_i386_linux (void)
|
||||
set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
|
||||
|
||||
feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
|
||||
+ field_type = tdesc_create_flags (feature, "i386_eflags", 4);
|
||||
+ tdesc_add_flag (field_type, 0, "CF");
|
||||
+ tdesc_add_flag (field_type, 1, "");
|
||||
+ tdesc_add_flag (field_type, 2, "PF");
|
||||
+ tdesc_add_flag (field_type, 4, "AF");
|
||||
+ tdesc_add_flag (field_type, 6, "ZF");
|
||||
+ tdesc_add_flag (field_type, 7, "SF");
|
||||
+ tdesc_add_flag (field_type, 8, "TF");
|
||||
+ tdesc_add_flag (field_type, 9, "IF");
|
||||
+ tdesc_add_flag (field_type, 10, "DF");
|
||||
+ tdesc_add_flag (field_type, 11, "OF");
|
||||
+ tdesc_add_flag (field_type, 14, "NT");
|
||||
+ tdesc_add_flag (field_type, 16, "RF");
|
||||
+ tdesc_add_flag (field_type, 17, "VM");
|
||||
+ tdesc_add_flag (field_type, 18, "AC");
|
||||
+ tdesc_add_flag (field_type, 19, "VIF");
|
||||
+ tdesc_add_flag (field_type, 20, "VIP");
|
||||
+ tdesc_add_flag (field_type, 21, "ID");
|
||||
+
|
||||
tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
|
||||
tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
|
||||
tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
|
||||
@@ -88,6 +107,22 @@ initialize_tdesc_i386_linux (void)
|
||||
field_type = tdesc_named_type (feature, "uint128");
|
||||
tdesc_add_field (type, "uint128", field_type);
|
||||
|
||||
+ field_type = tdesc_create_flags (feature, "i386_mxcsr", 4);
|
||||
+ tdesc_add_flag (field_type, 0, "IE");
|
||||
+ tdesc_add_flag (field_type, 1, "DE");
|
||||
+ tdesc_add_flag (field_type, 2, "ZE");
|
||||
+ tdesc_add_flag (field_type, 3, "OE");
|
||||
+ tdesc_add_flag (field_type, 4, "UE");
|
||||
+ tdesc_add_flag (field_type, 5, "PE");
|
||||
+ tdesc_add_flag (field_type, 6, "DAZ");
|
||||
+ tdesc_add_flag (field_type, 7, "IM");
|
||||
+ tdesc_add_flag (field_type, 8, "DM");
|
||||
+ tdesc_add_flag (field_type, 9, "ZM");
|
||||
+ tdesc_add_flag (field_type, 10, "OM");
|
||||
+ tdesc_add_flag (field_type, 11, "UM");
|
||||
+ tdesc_add_flag (field_type, 12, "PM");
|
||||
+ tdesc_add_flag (field_type, 15, "FZ");
|
||||
+
|
||||
tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
|
||||
tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
|
||||
tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
|
||||
--- gdb-7.1-p1/gdb/features/i386/i386.c 2010-02-08 06:08:46.000000000 +0100
|
||||
+++ gdb-7.1/gdb/features/i386/i386.c 2010-04-03 21:06:12.000000000 +0200
|
||||
@@ -15,6 +15,25 @@ initialize_tdesc_i386 (void)
|
||||
set_tdesc_architecture (result, bfd_scan_arch ("i386"));
|
||||
|
||||
feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
|
||||
+ field_type = tdesc_create_flags (feature, "i386_eflags", 4);
|
||||
+ tdesc_add_flag (field_type, 0, "CF");
|
||||
+ tdesc_add_flag (field_type, 1, "");
|
||||
+ tdesc_add_flag (field_type, 2, "PF");
|
||||
+ tdesc_add_flag (field_type, 4, "AF");
|
||||
+ tdesc_add_flag (field_type, 6, "ZF");
|
||||
+ tdesc_add_flag (field_type, 7, "SF");
|
||||
+ tdesc_add_flag (field_type, 8, "TF");
|
||||
+ tdesc_add_flag (field_type, 9, "IF");
|
||||
+ tdesc_add_flag (field_type, 10, "DF");
|
||||
+ tdesc_add_flag (field_type, 11, "OF");
|
||||
+ tdesc_add_flag (field_type, 14, "NT");
|
||||
+ tdesc_add_flag (field_type, 16, "RF");
|
||||
+ tdesc_add_flag (field_type, 17, "VM");
|
||||
+ tdesc_add_flag (field_type, 18, "AC");
|
||||
+ tdesc_add_flag (field_type, 19, "VIF");
|
||||
+ tdesc_add_flag (field_type, 20, "VIP");
|
||||
+ tdesc_add_flag (field_type, 21, "ID");
|
||||
+
|
||||
tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
|
||||
tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
|
||||
tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
|
||||
@@ -83,6 +102,22 @@ initialize_tdesc_i386 (void)
|
||||
field_type = tdesc_named_type (feature, "uint128");
|
||||
tdesc_add_field (type, "uint128", field_type);
|
||||
|
||||
+ field_type = tdesc_create_flags (feature, "i386_mxcsr", 4);
|
||||
+ tdesc_add_flag (field_type, 0, "IE");
|
||||
+ tdesc_add_flag (field_type, 1, "DE");
|
||||
+ tdesc_add_flag (field_type, 2, "ZE");
|
||||
+ tdesc_add_flag (field_type, 3, "OE");
|
||||
+ tdesc_add_flag (field_type, 4, "UE");
|
||||
+ tdesc_add_flag (field_type, 5, "PE");
|
||||
+ tdesc_add_flag (field_type, 6, "DAZ");
|
||||
+ tdesc_add_flag (field_type, 7, "IM");
|
||||
+ tdesc_add_flag (field_type, 8, "DM");
|
||||
+ tdesc_add_flag (field_type, 9, "ZM");
|
||||
+ tdesc_add_flag (field_type, 10, "OM");
|
||||
+ tdesc_add_flag (field_type, 11, "UM");
|
||||
+ tdesc_add_flag (field_type, 12, "PM");
|
||||
+ tdesc_add_flag (field_type, 15, "FZ");
|
||||
+
|
||||
tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
|
||||
tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
|
||||
tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
|
||||
--- gdb-7.1-p1/gdb/target-descriptions.c 2010-04-03 21:04:13.000000000 +0200
|
||||
+++ gdb-7.1/gdb/target-descriptions.c 2010-04-03 21:06:12.000000000 +0200
|
||||
@@ -126,8 +126,6 @@ typedef struct tdesc_type
|
||||
TDESC_TYPE_IEEE_DOUBLE,
|
||||
TDESC_TYPE_ARM_FPA_EXT,
|
||||
TDESC_TYPE_I387_EXT,
|
||||
- TDESC_TYPE_I386_EFLAGS,
|
||||
- TDESC_TYPE_I386_MXCSR,
|
||||
|
||||
/* Types defined by a target feature. */
|
||||
TDESC_TYPE_VECTOR,
|
||||
@@ -483,9 +481,7 @@ static struct tdesc_type tdesc_predefine
|
||||
{ "ieee_single", TDESC_TYPE_IEEE_SINGLE },
|
||||
{ "ieee_double", TDESC_TYPE_IEEE_DOUBLE },
|
||||
{ "arm_fpa_ext", TDESC_TYPE_ARM_FPA_EXT },
|
||||
- { "i387_ext", TDESC_TYPE_I387_EXT },
|
||||
- { "i386_eflags", TDESC_TYPE_I386_EFLAGS },
|
||||
- { "i386_mxcsr", TDESC_TYPE_I386_MXCSR }
|
||||
+ { "i387_ext", TDESC_TYPE_I387_EXT }
|
||||
};
|
||||
|
||||
/* Return the type associated with ID in the context of FEATURE, or
|
||||
@@ -607,57 +603,6 @@ tdesc_gdb_type (struct gdbarch *gdbarch,
|
||||
return arch_float_type (gdbarch, -1, "builtin_type_i387_ext",
|
||||
floatformats_i387_ext);
|
||||
|
||||
- case TDESC_TYPE_I386_EFLAGS:
|
||||
- {
|
||||
- struct type *type;
|
||||
-
|
||||
- type = arch_flags_type (gdbarch, "builtin_type_i386_eflags", 4);
|
||||
- append_flags_type_flag (type, 0, "CF");
|
||||
- append_flags_type_flag (type, 1, NULL);
|
||||
- append_flags_type_flag (type, 2, "PF");
|
||||
- append_flags_type_flag (type, 4, "AF");
|
||||
- append_flags_type_flag (type, 6, "ZF");
|
||||
- append_flags_type_flag (type, 7, "SF");
|
||||
- append_flags_type_flag (type, 8, "TF");
|
||||
- append_flags_type_flag (type, 9, "IF");
|
||||
- append_flags_type_flag (type, 10, "DF");
|
||||
- append_flags_type_flag (type, 11, "OF");
|
||||
- append_flags_type_flag (type, 14, "NT");
|
||||
- append_flags_type_flag (type, 16, "RF");
|
||||
- append_flags_type_flag (type, 17, "VM");
|
||||
- append_flags_type_flag (type, 18, "AC");
|
||||
- append_flags_type_flag (type, 19, "VIF");
|
||||
- append_flags_type_flag (type, 20, "VIP");
|
||||
- append_flags_type_flag (type, 21, "ID");
|
||||
-
|
||||
- return type;
|
||||
- }
|
||||
- break;
|
||||
-
|
||||
- case TDESC_TYPE_I386_MXCSR:
|
||||
- {
|
||||
- struct type *type;
|
||||
-
|
||||
- type = arch_flags_type (gdbarch, "builtin_type_i386_mxcsr", 4);
|
||||
- append_flags_type_flag (type, 0, "IE");
|
||||
- append_flags_type_flag (type, 1, "DE");
|
||||
- append_flags_type_flag (type, 2, "ZE");
|
||||
- append_flags_type_flag (type, 3, "OE");
|
||||
- append_flags_type_flag (type, 4, "UE");
|
||||
- append_flags_type_flag (type, 5, "PE");
|
||||
- append_flags_type_flag (type, 6, "DAZ");
|
||||
- append_flags_type_flag (type, 7, "IM");
|
||||
- append_flags_type_flag (type, 8, "DM");
|
||||
- append_flags_type_flag (type, 9, "ZM");
|
||||
- append_flags_type_flag (type, 10, "OM");
|
||||
- append_flags_type_flag (type, 11, "UM");
|
||||
- append_flags_type_flag (type, 12, "PM");
|
||||
- append_flags_type_flag (type, 15, "FZ");
|
||||
-
|
||||
- return type;
|
||||
- }
|
||||
- break;
|
||||
-
|
||||
/* Types defined by a target feature. */
|
||||
case TDESC_TYPE_VECTOR:
|
||||
{
|
||||
@@ -769,7 +714,8 @@ tdesc_gdb_type (struct gdbarch *gdbarch,
|
||||
/* Note that contrary to the function name, this call will
|
||||
just set the properties of an already-allocated
|
||||
field. */
|
||||
- append_flags_type_flag (type, f->start, f->name);
|
||||
+ append_flags_type_flag (type, f->start,
|
||||
+ *f->name ? f->name : NULL);
|
||||
|
||||
return type;
|
||||
}
|
||||
@@ -1602,6 +1548,7 @@ maint_print_c_tdesc_cmd (char *args, int
|
||||
struct tdesc_reg *reg;
|
||||
struct tdesc_type *type;
|
||||
struct tdesc_type_field *f;
|
||||
+ struct tdesc_type_flag *flag;
|
||||
int ix, ix2, ix3;
|
||||
|
||||
/* Use the global target-supplied description, not the current
|
||||
@@ -1715,6 +1662,18 @@ maint_print_c_tdesc_cmd (char *args, int
|
||||
f->name);
|
||||
}
|
||||
break;
|
||||
+ case TDESC_TYPE_FLAGS:
|
||||
+ printf_unfiltered
|
||||
+ (" field_type = tdesc_create_flags (feature, \"%s\", %d);\n",
|
||||
+ type->name, (int) type->u.f.size);
|
||||
+ for (ix3 = 0;
|
||||
+ VEC_iterate (tdesc_type_flag, type->u.f.flags, ix3,
|
||||
+ flag);
|
||||
+ ix3++)
|
||||
+ printf_unfiltered
|
||||
+ (" tdesc_add_flag (field_type, %d, \"%s\");\n",
|
||||
+ flag->start, flag->name);
|
||||
+ break;
|
||||
default:
|
||||
error (_("C output is not supported type \"%s\"."), type->name);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,30 @@
|
|||
[ Backported. ]
|
||||
|
||||
commit 6448aace637843e8e7c021d7f8c5d5d5fdd71974
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Wed Mar 3 20:19:48 2010 +0000
|
||||
|
||||
Mention improvement for X86 general purpose registers.
|
||||
|
||||
2010-03-03 H.J. Lu <hongjiu.lu@intel.com>
|
||||
Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* NEWS: Add X86 general purpose registers section.
|
||||
|
||||
--- gdb-7.1-p3/gdb/NEWS 2010-03-18 22:01:55.000000000 +0100
|
||||
+++ gdb-7.1/gdb/NEWS 2010-04-03 21:07:46.000000000 +0200
|
||||
@@ -438,6 +438,14 @@ GDB will now correctly handle all of:
|
||||
now support hardware watchpoints, and will use them automatically
|
||||
as appropriate.
|
||||
|
||||
+* X86 general purpose registers
|
||||
+
|
||||
+ GDB now supports reading/writing byte, word and double-word x86
|
||||
+ general purpose registers directly. This means you can use, say,
|
||||
+ $ah or $ax to refer, respectively, to the byte register AH and
|
||||
+ 16-bit word register AX that are actually portions of the 32-bit
|
||||
+ register EAX or 64-bit register RAX.
|
||||
+
|
||||
* Python scripting
|
||||
|
||||
GDB now has support for scripting using Python. Whether this is
|
|
@ -0,0 +1,35 @@
|
|||
[ Backported. ]
|
||||
|
||||
commit 49f8d1c24c639d891f58a3b9feda425833b702fb
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Fri Mar 12 15:12:34 2010 +0000
|
||||
|
||||
Restore sp for x86.
|
||||
|
||||
2010-03-12 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* amd64-tdep.c (amd64_word_names): Replace "sp" with "".
|
||||
* i386-tdep.c (i386_word_names): Likewise.
|
||||
|
||||
--- gdb-7.1-p4/gdb/amd64-tdep.c 2010-04-03 21:06:52.000000000 +0200
|
||||
+++ gdb-7.1/gdb/amd64-tdep.c 2010-04-03 21:08:21.000000000 +0200
|
||||
@@ -222,7 +222,7 @@ static const char *amd64_byte_names[] =
|
||||
|
||||
static const char *amd64_word_names[] =
|
||||
{
|
||||
- "ax", "bx", "cx", "dx", "si", "di", "bp", "sp",
|
||||
+ "ax", "bx", "cx", "dx", "si", "di", "bp", "",
|
||||
"r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
|
||||
};
|
||||
|
||||
--- gdb-7.1-p4/gdb/i386-tdep.c 2010-04-03 21:06:52.000000000 +0200
|
||||
+++ gdb-7.1/gdb/i386-tdep.c 2010-04-03 21:08:21.000000000 +0200
|
||||
@@ -94,7 +94,7 @@ static const char *i386_byte_names[] =
|
||||
static const char *i386_word_names[] =
|
||||
{
|
||||
"ax", "cx", "dx", "bx",
|
||||
- "sp", "bp", "si", "di"
|
||||
+ "", "bp", "si", "di"
|
||||
};
|
||||
|
||||
/* MMX register? */
|
|
@ -0,0 +1,183 @@
|
|||
[ Backported. ]
|
||||
|
||||
commit d5ea7042210f5ad319ad19910bce13fd5717c6d6
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Tue Mar 30 15:45:08 2010 +0000
|
||||
|
||||
Add xmlRegisters= to qSupported packet.
|
||||
|
||||
gdb/
|
||||
|
||||
2010-03-30 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* NEWS: Mention xmlRegisters= in qSupported packet.
|
||||
|
||||
* i386-tdep.c: Include "remote.h".
|
||||
(_initialize_i386_tdep): Call register_remote_support_xml.
|
||||
|
||||
* remote.c (remote_support_xml): New.
|
||||
(register_remote_support_xml): Likewise.
|
||||
(remote_query_supported_append): Likewise.
|
||||
(remote_query_supported): Support remote_support_xml.
|
||||
|
||||
* remote.h (register_remote_support_xml): New.
|
||||
|
||||
gdb/doc/
|
||||
|
||||
2010-03-30 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* gdb.texinfo (General Query Packets): Add xmlRegisters.
|
||||
|
||||
--- gdb-7.1-p5/gdb/NEWS 2010-04-03 21:07:46.000000000 +0200
|
||||
+++ gdb-7.1/gdb/NEWS 2010-04-03 21:10:06.000000000 +0200
|
||||
@@ -1,6 +1,11 @@
|
||||
What has changed in GDB?
|
||||
(Organized release by release)
|
||||
|
||||
+*** Changes since GDB 7.1
|
||||
+
|
||||
+* GDB now sends xmlRegisters= in qSupported packet to indicate that
|
||||
+ it understands register description.
|
||||
+
|
||||
*** Changes in GDB 7.1
|
||||
|
||||
* C++ Improvements
|
||||
--- gdb-7.1-p5/gdb/doc/gdb.texinfo 2010-04-03 21:04:13.000000000 +0200
|
||||
+++ gdb-7.1/gdb/doc/gdb.texinfo 2010-04-03 21:09:29.000000000 +0200
|
||||
@@ -30292,6 +30292,12 @@ extensions to the remote protocol. @val
|
||||
extensions unless the stub also reports that it supports them by
|
||||
including @samp{multiprocess+} in its @samp{qSupported} reply.
|
||||
@xref{multiprocess extensions}, for details.
|
||||
+
|
||||
+@item xmlRegisters
|
||||
+This feature indicates that @value{GDBN} supports the XML target
|
||||
+description. If the stub sees @samp{xmlRegisters=} with target
|
||||
+specific strings separated by a comma, it will report register
|
||||
+description.
|
||||
@end table
|
||||
|
||||
Stubs should ignore any unknown values for
|
||||
--- gdb-7.1-p5/gdb/i386-tdep.c 2010-04-03 21:08:21.000000000 +0200
|
||||
+++ gdb-7.1/gdb/i386-tdep.c 2010-04-03 21:09:29.000000000 +0200
|
||||
@@ -44,6 +44,7 @@
|
||||
#include "value.h"
|
||||
#include "dis-asm.h"
|
||||
#include "disasm.h"
|
||||
+#include "remote.h"
|
||||
|
||||
#include "gdb_assert.h"
|
||||
#include "gdb_string.h"
|
||||
@@ -6000,4 +6001,7 @@ is \"default\"."),
|
||||
|
||||
/* Initialize the standard target descriptions. */
|
||||
initialize_tdesc_i386 ();
|
||||
+
|
||||
+ /* Tell remote stub that we support XML target description. */
|
||||
+ register_remote_support_xml ("i386");
|
||||
}
|
||||
--- gdb-7.1-p5/gdb/remote.c 2010-04-03 20:24:51.000000000 +0200
|
||||
+++ gdb-7.1/gdb/remote.c 2010-04-03 21:09:29.000000000 +0200
|
||||
@@ -3467,6 +3467,53 @@ static struct protocol_feature remote_pr
|
||||
PACKET_bs },
|
||||
};
|
||||
|
||||
+static char *remote_support_xml;
|
||||
+
|
||||
+/* Register string appended to "xmlRegisters=" in qSupported query. */
|
||||
+
|
||||
+void
|
||||
+register_remote_support_xml (const char *xml ATTRIBUTE_UNUSED)
|
||||
+{
|
||||
+#if defined(HAVE_LIBEXPAT)
|
||||
+ if (remote_support_xml == NULL)
|
||||
+ remote_support_xml = concat ("xmlRegisters=", xml, NULL);
|
||||
+ else
|
||||
+ {
|
||||
+ char *copy = xstrdup (remote_support_xml + 13);
|
||||
+ char *p = strtok (copy, ",");
|
||||
+
|
||||
+ do
|
||||
+ {
|
||||
+ if (strcmp (p, xml) == 0)
|
||||
+ {
|
||||
+ /* already there */
|
||||
+ xfree (copy);
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+ while ((p = strtok (NULL, ",")) != NULL);
|
||||
+ xfree (copy);
|
||||
+
|
||||
+ p = concat (remote_support_xml, ",", xml, NULL);
|
||||
+ xfree (remote_support_xml);
|
||||
+ remote_support_xml = p;
|
||||
+ }
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static char *
|
||||
+remote_query_supported_append (char *msg, const char *append)
|
||||
+{
|
||||
+ if (msg)
|
||||
+ {
|
||||
+ char *p = concat (msg, ";", append, NULL);
|
||||
+ xfree (msg);
|
||||
+ return p;
|
||||
+ }
|
||||
+ else
|
||||
+ return xstrdup (append);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
remote_query_supported (void)
|
||||
{
|
||||
@@ -3485,24 +3532,27 @@ remote_query_supported (void)
|
||||
rs->buf[0] = 0;
|
||||
if (remote_protocol_packets[PACKET_qSupported].support != PACKET_DISABLE)
|
||||
{
|
||||
+ char *q = NULL;
|
||||
const char *qsupported = gdbarch_qsupported (target_gdbarch);
|
||||
+
|
||||
+ if (rs->extended)
|
||||
+ q = remote_query_supported_append (q, "multiprocess+");
|
||||
+
|
||||
if (qsupported)
|
||||
+ q = remote_query_supported_append (q, qsupported);
|
||||
+
|
||||
+ if (remote_support_xml)
|
||||
+ q = remote_query_supported_append (q, remote_support_xml);
|
||||
+
|
||||
+ if (q)
|
||||
{
|
||||
- char *q;
|
||||
- if (rs->extended)
|
||||
- q = concat ("qSupported:multiprocess+;", qsupported, NULL);
|
||||
- else
|
||||
- q = concat ("qSupported:", qsupported, NULL);
|
||||
- putpkt (q);
|
||||
+ char *p = concat ("qSupported:", q, NULL);
|
||||
xfree (q);
|
||||
+ putpkt (p);
|
||||
+ xfree (p);
|
||||
}
|
||||
else
|
||||
- {
|
||||
- if (rs->extended)
|
||||
- putpkt ("qSupported:multiprocess+");
|
||||
- else
|
||||
- putpkt ("qSupported");
|
||||
- }
|
||||
+ putpkt ("qSupported");
|
||||
|
||||
getpkt (&rs->buf, &rs->buf_size, 0);
|
||||
|
||||
--- gdb-7.1-p5/gdb/remote.h 2010-01-01 08:31:41.000000000 +0100
|
||||
+++ gdb-7.1/gdb/remote.h 2010-04-03 21:09:29.000000000 +0200
|
||||
@@ -66,6 +66,7 @@ extern void (*deprecated_target_wait_loo
|
||||
|
||||
void register_remote_g_packet_guess (struct gdbarch *gdbarch, int bytes,
|
||||
const struct target_desc *tdesc);
|
||||
+void register_remote_support_xml (const char *);
|
||||
|
||||
void remote_file_put (const char *local_file, const char *remote_file,
|
||||
int from_tty);
|
|
@ -0,0 +1,32 @@
|
|||
[ Backported. ]
|
||||
|
||||
commit 684341392f3ca6703dc28dac548d3051811bff47
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Tue Mar 30 18:37:03 2010 +0000
|
||||
|
||||
Add org.gnu.gdb.i386.avx.
|
||||
|
||||
2010-03-30 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* gdb.texinfo (i386 Features): Add org.gnu.gdb.i386.avx.
|
||||
|
||||
--- gdb-7.1-p6/gdb/doc/gdb.texinfo 2010-04-03 21:09:29.000000000 +0200
|
||||
+++ gdb-7.1/gdb/doc/gdb.texinfo 2010-04-03 21:10:57.000000000 +0200
|
||||
@@ -33380,6 +33380,17 @@ describe registers:
|
||||
@samp{mxcsr}
|
||||
@end itemize
|
||||
|
||||
+The @samp{org.gnu.gdb.i386.avx} feature is optional. It should
|
||||
+describe the upper 128 bits of @sc{ymm} registers:
|
||||
+
|
||||
+@itemize @minus
|
||||
+@item
|
||||
+@samp{ymm0h} through @samp{ymm7h} for i386
|
||||
+@item
|
||||
+@samp{ymm0h} through @samp{ymm15h} for amd64
|
||||
+@item
|
||||
+@end itemize
|
||||
+
|
||||
The @samp{org.gnu.gdb.i386.linux} feature is optional. It should
|
||||
describe a single register, @samp{orig_eax}.
|
||||
|
|
@ -0,0 +1,183 @@
|
|||
[ Backported. ]
|
||||
|
||||
commit 5362e5e1dc4cfac24fbd58773aaa7a82c615b662
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Thu Apr 1 20:02:07 2010 +0000
|
||||
|
||||
Support "ah", "bh", "ch", "dh" on amd64.
|
||||
|
||||
gdb/
|
||||
|
||||
2010-04-01 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* amd64-tdep.c (amd64_byte_names): Add "ah", "bh", "ch", "dh".
|
||||
(AMD64_NUM_LOWER_BYTE_REGS): New.
|
||||
(amd64_pseudo_register_read): Handle "ah", "bh", "ch", "dh".
|
||||
(amd64_pseudo_register_write): Likewise.
|
||||
(amd64_init_abi): Set num_byte_regs to 20.
|
||||
|
||||
gdb/testsuite/
|
||||
|
||||
2010-04-01 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* gdb.arch/amd64-byte.exp: Check "ah", "bh", "ch", "dh".
|
||||
|
||||
--- gdb-7.1-p7/gdb/amd64-tdep.c 2010-04-03 21:08:21.000000000 +0200
|
||||
+++ gdb-7.1/gdb/amd64-tdep.c 2010-04-03 21:11:41.000000000 +0200
|
||||
@@ -215,9 +215,13 @@ amd64_arch_reg_to_regnum (int reg)
|
||||
static const char *amd64_byte_names[] =
|
||||
{
|
||||
"al", "bl", "cl", "dl", "sil", "dil", "bpl", "spl",
|
||||
- "r8l", "r9l", "r10l", "r11l", "r12l", "r13l", "r14l", "r15l"
|
||||
+ "r8l", "r9l", "r10l", "r11l", "r12l", "r13l", "r14l", "r15l",
|
||||
+ "ah", "bh", "ch", "dh"
|
||||
};
|
||||
|
||||
+/* Number of lower byte registers. */
|
||||
+#define AMD64_NUM_LOWER_BYTE_REGS 16
|
||||
+
|
||||
/* Register names for word pseudo-registers. */
|
||||
|
||||
static const char *amd64_word_names[] =
|
||||
@@ -263,8 +267,18 @@ amd64_pseudo_register_read (struct gdbar
|
||||
int gpnum = regnum - tdep->al_regnum;
|
||||
|
||||
/* Extract (always little endian). */
|
||||
- regcache_raw_read (regcache, gpnum, raw_buf);
|
||||
- memcpy (buf, raw_buf, 1);
|
||||
+ if (gpnum >= AMD64_NUM_LOWER_BYTE_REGS)
|
||||
+ {
|
||||
+ /* Special handling for AH, BH, CH, DH. */
|
||||
+ regcache_raw_read (regcache,
|
||||
+ gpnum - AMD64_NUM_LOWER_BYTE_REGS, raw_buf);
|
||||
+ memcpy (buf, raw_buf + 1, 1);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ regcache_raw_read (regcache, gpnum, raw_buf);
|
||||
+ memcpy (buf, raw_buf, 1);
|
||||
+ }
|
||||
}
|
||||
else if (i386_dword_regnum_p (gdbarch, regnum))
|
||||
{
|
||||
@@ -289,12 +303,26 @@ amd64_pseudo_register_write (struct gdba
|
||||
{
|
||||
int gpnum = regnum - tdep->al_regnum;
|
||||
|
||||
- /* Read ... */
|
||||
- regcache_raw_read (regcache, gpnum, raw_buf);
|
||||
- /* ... Modify ... (always little endian). */
|
||||
- memcpy (raw_buf, buf, 1);
|
||||
- /* ... Write. */
|
||||
- regcache_raw_write (regcache, gpnum, raw_buf);
|
||||
+ if (gpnum >= AMD64_NUM_LOWER_BYTE_REGS)
|
||||
+ {
|
||||
+ /* Read ... AH, BH, CH, DH. */
|
||||
+ regcache_raw_read (regcache,
|
||||
+ gpnum - AMD64_NUM_LOWER_BYTE_REGS, raw_buf);
|
||||
+ /* ... Modify ... (always little endian). */
|
||||
+ memcpy (raw_buf + 1, buf, 1);
|
||||
+ /* ... Write. */
|
||||
+ regcache_raw_write (regcache,
|
||||
+ gpnum - AMD64_NUM_LOWER_BYTE_REGS, raw_buf);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ /* Read ... */
|
||||
+ regcache_raw_read (regcache, gpnum, raw_buf);
|
||||
+ /* ... Modify ... (always little endian). */
|
||||
+ memcpy (raw_buf, buf, 1);
|
||||
+ /* ... Write. */
|
||||
+ regcache_raw_write (regcache, gpnum, raw_buf);
|
||||
+ }
|
||||
}
|
||||
else if (i386_dword_regnum_p (gdbarch, regnum))
|
||||
{
|
||||
@@ -2233,7 +2261,7 @@ amd64_init_abi (struct gdbarch_info info
|
||||
tdep->num_core_regs = AMD64_NUM_GREGS + I387_NUM_REGS;
|
||||
tdep->register_names = amd64_register_names;
|
||||
|
||||
- tdep->num_byte_regs = 16;
|
||||
+ tdep->num_byte_regs = 20;
|
||||
tdep->num_word_regs = 16;
|
||||
tdep->num_dword_regs = 16;
|
||||
/* Avoid wiring in the MMX registers for now. */
|
||||
--- gdb-7.1-p7/gdb/testsuite/gdb.arch/amd64-byte.exp 2010-04-03 21:06:52.000000000 +0200
|
||||
+++ gdb-7.1/gdb/testsuite/gdb.arch/amd64-byte.exp 2010-04-03 21:11:41.000000000 +0200
|
||||
@@ -52,7 +52,6 @@ if ![runto_main] then {
|
||||
gdb_suppress_tests
|
||||
}
|
||||
|
||||
-set nr_regs 14
|
||||
set byte_regs(1) al
|
||||
set byte_regs(2) bl
|
||||
set byte_regs(3) cl
|
||||
@@ -67,6 +66,10 @@ set byte_regs(11) r12l
|
||||
set byte_regs(12) r13l
|
||||
set byte_regs(13) r14l
|
||||
set byte_regs(14) r15l
|
||||
+set byte_regs(15) ah
|
||||
+set byte_regs(16) bh
|
||||
+set byte_regs(17) ch
|
||||
+set byte_regs(18) dh
|
||||
|
||||
gdb_test "break [gdb_get_line_number "first breakpoint here"]" \
|
||||
"Breakpoint .* at .*${srcfile}.*" \
|
||||
@@ -79,12 +82,19 @@ for { set r 1 } { $r <= 6 } { incr r }
|
||||
"check contents of %$byte_regs($r)"
|
||||
}
|
||||
|
||||
+for { set r 1 } { $r <= 4 } { incr r } {
|
||||
+ set h [expr $r + 14]
|
||||
+ gdb_test "print/x \$$byte_regs($h)" \
|
||||
+ ".. = 0x[format %x $r]2" \
|
||||
+ "check contents of %$byte_regs($h)"
|
||||
+}
|
||||
+
|
||||
gdb_test "break [gdb_get_line_number "second breakpoint here"]" \
|
||||
"Breakpoint .* at .*${srcfile}.*" \
|
||||
"set second breakpoint in main"
|
||||
gdb_continue_to_breakpoint "continue to second breakpoint in main"
|
||||
|
||||
-for { set r 7 } { $r <= $nr_regs } { incr r } {
|
||||
+for { set r 7 } { $r <= 14 } { incr r } {
|
||||
gdb_test "print/x \$$byte_regs($r)" \
|
||||
".. = 0x[format %x $r]1" \
|
||||
"check contents of %$byte_regs($r)"
|
||||
@@ -94,6 +104,11 @@ for { set r 1 } { $r <= 6 } { incr r }
|
||||
gdb_test "set var \$$byte_regs($r) = $r" "" "set %$byte_regs($r)"
|
||||
}
|
||||
|
||||
+for { set r 1 } { $r <= 4 } { incr r } {
|
||||
+ set h [expr $r + 14]
|
||||
+ gdb_test "set var \$$byte_regs($h) = $h" "" "set %$byte_regs($h)"
|
||||
+}
|
||||
+
|
||||
gdb_test "break [gdb_get_line_number "third breakpoint here"]" \
|
||||
"Breakpoint .* at .*${srcfile}.*" \
|
||||
"set third breakpoint in main"
|
||||
@@ -105,7 +120,14 @@ for { set r 1 } { $r <= 6 } { incr r }
|
||||
"check contents of %$byte_regs($r)"
|
||||
}
|
||||
|
||||
-for { set r 7 } { $r <= $nr_regs } { incr r } {
|
||||
+for { set r 1 } { $r <= 4 } { incr r } {
|
||||
+ set h [expr $r + 14]
|
||||
+ gdb_test "print \$$byte_regs($h)" \
|
||||
+ ".. = $h" \
|
||||
+ "check contents of %$byte_regs($h)"
|
||||
+}
|
||||
+
|
||||
+for { set r 7 } { $r <= 14 } { incr r } {
|
||||
gdb_test "set var \$$byte_regs($r) = $r" "" "set %$byte_regs($r)"
|
||||
}
|
||||
|
||||
@@ -114,7 +136,7 @@ gdb_test "break [gdb_get_line_number "fo
|
||||
"set forth breakpoint in main"
|
||||
gdb_continue_to_breakpoint "continue to forth breakpoint in main"
|
||||
|
||||
-for { set r 7 } { $r <= $nr_regs } { incr r } {
|
||||
+for { set r 7 } { $r <= 14 } { incr r } {
|
||||
gdb_test "print \$$byte_regs($r)" \
|
||||
".. = $r" \
|
||||
"check contents of %$byte_regs($r)"
|
File diff suppressed because it is too large
Load Diff
27
gdb.spec
27
gdb.spec
|
@ -36,7 +36,7 @@ Version: 7.1
|
|||
|
||||
# The release always contains a leading reserved number, start it at 1.
|
||||
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
||||
Release: 5%{?_with_upstream:.upstream}%{dist}
|
||||
Release: 6%{?_with_upstream:.upstream}%{dist}
|
||||
|
||||
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and GFDL and BSD and Public Domain
|
||||
Group: Development/Debuggers
|
||||
|
@ -444,6 +444,18 @@ Patch437: gdb-using-directive-leak.patch
|
|||
# Fix dangling displays in separate debuginfo (BZ 574483).
|
||||
Patch438: gdb-bz574483-display-sepdebug.patch
|
||||
|
||||
# Support AVX registers (BZ 578250).
|
||||
Patch439: gdb-bz578250-avx-01of10.patch
|
||||
Patch440: gdb-bz578250-avx-02of10.patch
|
||||
Patch441: gdb-bz578250-avx-03of10.patch
|
||||
Patch442: gdb-bz578250-avx-04of10.patch
|
||||
Patch443: gdb-bz578250-avx-05of10.patch
|
||||
Patch444: gdb-bz578250-avx-06of10.patch
|
||||
Patch445: gdb-bz578250-avx-07of10.patch
|
||||
Patch446: gdb-bz578250-avx-08of10.patch
|
||||
Patch447: gdb-bz578250-avx-09of10.patch
|
||||
Patch448: gdb-bz578250-avx-10of10.patch
|
||||
|
||||
BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
|
||||
Requires: readline%{?_isa}
|
||||
BuildRequires: readline-devel%{?_isa}
|
||||
|
@ -699,6 +711,16 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
|||
%patch436 -p1
|
||||
%patch437 -p1
|
||||
%patch438 -p1
|
||||
%patch439 -p1
|
||||
%patch440 -p1
|
||||
%patch441 -p1
|
||||
%patch442 -p1
|
||||
%patch443 -p1
|
||||
%patch444 -p1
|
||||
%patch445 -p1
|
||||
%patch446 -p1
|
||||
%patch447 -p1
|
||||
%patch448 -p1
|
||||
|
||||
%patch415 -p1
|
||||
%patch393 -p1
|
||||
|
@ -1031,6 +1053,9 @@ fi
|
|||
%endif
|
||||
|
||||
%changelog
|
||||
* Sat Apr 3 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.1-6.fc13
|
||||
- Support AVX registers (BZ 578250).
|
||||
|
||||
* Sat Apr 3 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.1-5.fc13
|
||||
- Fix dangling displays in separate debuginfo (BZ 574483).
|
||||
|
||||
|
|
Loading…
Reference in New Issue