* amd64-tdep.c (amd64_sse_type): Remove.

(amd64_register_info): Use i386_eflags_type and i386_sse_type
where appropriate.
(AMD64_NUM_REGS): Use ARRAY_SIZE.
(amd64_register_type): Remove code to build amd_sse_type.
* i386-tdep.c (i386_eflag_type): New variable.
(i386_mmx_type, i386_sse_type): Make global.
(i386_init_types): New function.
(i386_build_mmx_type, i386_build_sse_type): Remove functions.
(i386_register_type): Return i386_eflag_type, i386_sse_type and
i386_mmx_type when appropriate.
(_initialize_i386_tdep): Call i386_init_types.
* i386-tdep.h (i386_eflags_type, i386_mmx_type, i386_sse_type):
Declare extern.
Based on a previous patch form Michal Ludvig:
This commit is contained in:
Mark Kettenis 2006-01-18 21:26:47 +00:00
parent 4f2aea11c7
commit 5ae96ec1ab
4 changed files with 119 additions and 102 deletions

View File

@ -1,5 +1,21 @@
2006-01-18 Mark Kettenis <kettenis@gnu.org>
Based on a previous patch form Michal Ludvig:
* amd64-tdep.c (amd64_sse_type): Remove.
(amd64_register_info): Use i386_eflags_type and i386_sse_type
where appropriate.
(AMD64_NUM_REGS): Use ARRAY_SIZE.
(amd64_register_type): Remove code to build amd_sse_type.
* i386-tdep.c (i386_eflag_type): New variable.
(i386_mmx_type, i386_sse_type): Make global.
(i386_init_types): New function.
(i386_build_mmx_type, i386_build_sse_type): Remove functions.
(i386_register_type): Return i386_eflag_type, i386_sse_type and
i386_mmx_type when appropriate.
(_initialize_i386_tdep): Call i386_init_types.
* i386-tdep.h (i386_eflags_type, i386_mmx_type, i386_sse_type):
Declare extern.
Based on a previous patch form Michal Ludvig:
* gdbtypes.c (append_flags_type_flag, init_flags_type): New
functions.

View File

@ -1,7 +1,9 @@
/* Target-dependent code for AMD64.
Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
Inc. Contributed by Jiri Smid, SuSE Labs.
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
Contributed by Jiri Smid, SuSE Labs.
This file is part of GDB.
@ -55,8 +57,6 @@ struct amd64_register_info
struct type **type;
};
static struct type *amd64_sse_type;
static struct amd64_register_info const amd64_register_info[] =
{
{ "rax", &builtin_type_int64 },
@ -78,7 +78,7 @@ static struct amd64_register_info const amd64_register_info[] =
{ "r14", &builtin_type_int64 },
{ "r15", &builtin_type_int64 },
{ "rip", &builtin_type_void_func_ptr },
{ "eflags", &builtin_type_int32 },
{ "eflags", &i386_eflags_type },
{ "cs", &builtin_type_int32 },
{ "ss", &builtin_type_int32 },
{ "ds", &builtin_type_int32 },
@ -105,28 +105,27 @@ static struct amd64_register_info const amd64_register_info[] =
{ "fop", &builtin_type_int32 },
/* %xmm0 is register number 40. */
{ "xmm0", &amd64_sse_type },
{ "xmm1", &amd64_sse_type },
{ "xmm2", &amd64_sse_type },
{ "xmm3", &amd64_sse_type },
{ "xmm4", &amd64_sse_type },
{ "xmm5", &amd64_sse_type },
{ "xmm6", &amd64_sse_type },
{ "xmm7", &amd64_sse_type },
{ "xmm8", &amd64_sse_type },
{ "xmm9", &amd64_sse_type },
{ "xmm10", &amd64_sse_type },
{ "xmm11", &amd64_sse_type },
{ "xmm12", &amd64_sse_type },
{ "xmm13", &amd64_sse_type },
{ "xmm14", &amd64_sse_type },
{ "xmm15", &amd64_sse_type },
{ "xmm0", &i386_sse_type },
{ "xmm1", &i386_sse_type },
{ "xmm2", &i386_sse_type },
{ "xmm3", &i386_sse_type },
{ "xmm4", &i386_sse_type },
{ "xmm5", &i386_sse_type },
{ "xmm6", &i386_sse_type },
{ "xmm7", &i386_sse_type },
{ "xmm8", &i386_sse_type },
{ "xmm9", &i386_sse_type },
{ "xmm10", &i386_sse_type },
{ "xmm11", &i386_sse_type },
{ "xmm12", &i386_sse_type },
{ "xmm13", &i386_sse_type },
{ "xmm14", &i386_sse_type },
{ "xmm15", &i386_sse_type },
{ "mxcsr", &builtin_type_int32 }
};
/* Total number of registers. */
#define AMD64_NUM_REGS \
(sizeof (amd64_register_info) / sizeof (amd64_register_info[0]))
#define AMD64_NUM_REGS ARRAY_SIZE (amd64_register_info)
/* Return the name of register REGNUM. */
@ -145,33 +144,9 @@ amd64_register_name (int regnum)
static struct type *
amd64_register_type (struct gdbarch *gdbarch, int regnum)
{
struct type *t;
gdb_assert (regnum >= 0 && regnum < AMD64_NUM_REGS);
/* ??? Unfortunately, amd64_init_abi is called too early, and so we
cannot create the amd64_sse_type early enough to avoid any check
at this point. */
t = *amd64_register_info[regnum].type;
if (t != NULL)
return t;
gdb_assert (amd64_sse_type == NULL);
t = init_composite_type ("__gdb_builtin_type_vec128i", TYPE_CODE_UNION);
append_composite_type_field (t, "v4_float", builtin_type_v4_float);
append_composite_type_field (t, "v2_double", builtin_type_v2_double);
append_composite_type_field (t, "v16_int8", builtin_type_v16_int8);
append_composite_type_field (t, "v8_int16", builtin_type_v8_int16);
append_composite_type_field (t, "v4_int32", builtin_type_v4_int32);
append_composite_type_field (t, "v2_int64", builtin_type_v2_int64);
append_composite_type_field (t, "uint128", builtin_type_int128);
TYPE_FLAGS (t) |= TYPE_FLAG_VECTOR;
TYPE_NAME (t) = "builtin_type_vec128i";
amd64_sse_type = t;
return t;
return *amd64_register_info[regnum].type;
}
/* DWARF Register Number Mapping as defined in the System V psABI,

View File

@ -1,8 +1,8 @@
/* Intel 386 target-dependent stuff.
Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software
Foundation, Inc.
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of GDB.
@ -1524,17 +1524,42 @@ i386_return_value (struct gdbarch *gdbarch, struct type *type,
}
/* Types for the MMX and SSE registers. */
static struct type *i386_mmx_type;
static struct type *i386_sse_type;
/* Type for %eflags. */
struct type *i386_eflags_type;
/* Construct the type for MMX registers. */
static struct type *
i386_build_mmx_type (void)
/* Types for the MMX and SSE registers. */
struct type *i386_mmx_type;
struct type *i386_sse_type;
/* Construct types for ISA-specific registers. */
static void
i386_init_types (void)
{
struct type *type;
type = init_flags_type ("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");
i386_eflags_type = type;
/* The type we're building is this: */
#if 0
union __gdb_builtin_type_vec64i
union __gdb_builtin_type_vec64i
{
int64_t uint64;
int32_t v2_int32[2];
@ -1543,49 +1568,40 @@ i386_build_mmx_type (void)
};
#endif
if (! i386_mmx_type)
{
struct type *t;
type = init_composite_type ("__gdb_builtin_type_vec64i", TYPE_CODE_UNION);
append_composite_type_field (type, "uint64", builtin_type_int64);
append_composite_type_field (type, "v2_int32", builtin_type_v2_int32);
append_composite_type_field (type, "v4_int16", builtin_type_v4_int16);
append_composite_type_field (type, "v8_int8", builtin_type_v8_int8);
TYPE_FLAGS (type) |= TYPE_FLAG_VECTOR;
TYPE_NAME (type) = "builtin_type_vec64i";
i386_mmx_type = type;
t = init_composite_type ("__gdb_builtin_type_vec64i", TYPE_CODE_UNION);
append_composite_type_field (t, "uint64", builtin_type_int64);
append_composite_type_field (t, "v2_int32", builtin_type_v2_int32);
append_composite_type_field (t, "v4_int16", builtin_type_v4_int16);
append_composite_type_field (t, "v8_int8", builtin_type_v8_int8);
/* The type we're building is this: */
#if 0
union __gdb_builtin_type_vec128i
{
int128_t uint128;
int64_t v2_int64[2];
int32_t v4_int32[4];
int16_t v8_int16[8];
int8_t v16_int8[16];
double v2_double[2];
float v4_float[4];
};
#endif
TYPE_FLAGS (t) |= TYPE_FLAG_VECTOR;
TYPE_NAME (t) = "builtin_type_vec64i";
i386_mmx_type = t;
}
return i386_mmx_type;
}
/* Construct the type for SSE registers. */
static struct type *
i386_build_sse_type (void)
{
if (! i386_sse_type)
{
struct type *t;
t = init_composite_type ("__gdb_builtin_type_vec128i", TYPE_CODE_UNION);
append_composite_type_field (t, "v4_float", builtin_type_v4_float);
append_composite_type_field (t, "v2_double", builtin_type_v2_double);
append_composite_type_field (t, "v16_int8", builtin_type_v16_int8);
append_composite_type_field (t, "v8_int16", builtin_type_v8_int16);
append_composite_type_field (t, "v4_int32", builtin_type_v4_int32);
append_composite_type_field (t, "v2_int64", builtin_type_v2_int64);
append_composite_type_field (t, "uint128", builtin_type_int128);
TYPE_FLAGS (t) |= TYPE_FLAG_VECTOR;
TYPE_NAME (t) = "builtin_type_vec128i";
i386_sse_type = t;
}
return i386_sse_type;
type = init_composite_type ("__gdb_builtin_type_vec128i", TYPE_CODE_UNION);
append_composite_type_field (type, "v4_float", builtin_type_v4_float);
append_composite_type_field (type, "v2_double", builtin_type_v2_double);
append_composite_type_field (type, "v16_int8", builtin_type_v16_int8);
append_composite_type_field (type, "v8_int16", builtin_type_v8_int16);
append_composite_type_field (type, "v4_int32", builtin_type_v4_int32);
append_composite_type_field (type, "v2_int64", builtin_type_v2_int64);
append_composite_type_field (type, "uint128", builtin_type_int128);
TYPE_FLAGS (type) |= TYPE_FLAG_VECTOR;
TYPE_NAME (type) = "builtin_type_vec128i";
i386_sse_type = type;
}
/* Return the GDB type object for the "standard" data type of data in
@ -1598,6 +1614,9 @@ i386_register_type (struct gdbarch *gdbarch, int regnum)
if (regnum == I386_EIP_REGNUM)
return builtin_type_void_func_ptr;
if (regnum == I386_EFLAGS_REGNUM)
return i386_eflags_type;
if (regnum == I386_EBP_REGNUM || regnum == I386_ESP_REGNUM)
return builtin_type_void_data_ptr;
@ -1605,10 +1624,10 @@ i386_register_type (struct gdbarch *gdbarch, int regnum)
return builtin_type_i387_ext;
if (i386_sse_regnum_p (gdbarch, regnum))
return i386_build_sse_type ();
return i386_sse_type;
if (i386_mmx_regnum_p (gdbarch, regnum))
return i386_build_mmx_type ();
return i386_mmx_type;
return builtin_type_int;
}
@ -2407,6 +2426,7 @@ is \"default\"."),
gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_NETWARE,
i386_nw_init_abi);
/* Initialize the i386 specific register groups. */
/* Initialize the i386-specific register groups & types. */
i386_init_reggroups ();
i386_init_types();
}

View File

@ -1,6 +1,7 @@
/* Target-dependent code for the i386.
Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
Copyright (C) 2001, 2002, 2003, 2004, 2006
Free Software Foundation, Inc.
This file is part of GDB.
@ -149,6 +150,11 @@ enum i386_regnum
/* Size of the largest register. */
#define I386_MAX_REGISTER_SIZE 16
/* Types for i386-specific registers. */
extern struct type *i386_eflags_type;
extern struct type *i386_mmx_type;
extern struct type *i386_sse_type;
/* Segment selectors. */
#define I386_SEL_RPL 0x0003 /* Requester's Privilege Level mask. */
#define I386_SEL_UPL 0x0003 /* User Privilige Level. */