This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC] Add TYPE_CODE_FLAGS and use it for i386/amd64 %eflags reguister


This is based on a patch from Michal Ludvig that for some reason did't
make into the source allthough from reading the mailing list archives
it seems that consus was reached.  Noticed by some kind soul in PR
tdep/2060.  The thread is mentioned in that PR and starts here:

http://sources.redhat.com/ml/gdb-patches/2002-08/msg00913.html

Once this is in, I intend to make other targets use this stuff.  I
also have some idea's to handle multi-bit fields that are sometimes
encountered in these flags registers (such as IOPL in %eflags).

Mark


Index: ChangeLog
from  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.
	(is_integral_type, rank_one_type, recursive_dump_type): Add
	support for TYPE_CODE_FLAGS.
	* gdbtypes.h (enum type_code): Add TYPE_CODE_FLAGS.
	(append_flags_type_field, init_flags_type): New prototypes.
	* ada-valprint.c (ada_val_print_1): Add support for
	TYPE_CODE_FLAGS.
	* c-valprint.c (c_val_print): Likewise.
	* f-valprint.c (f_val_print): Likewise.
	* p-valprint.c (pascal_val_print): Likewise.
	* valprint.c (val_print_type_code_flags): New function.
	* valprint.h (val_print_type_code_flags): New prototype.
	* value.c (unpack_long, value_from_longest): Add support for
	TYPE_CODE_FLAGS.

Index: amd64-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/amd64-tdep.c,v
retrieving revision 1.28
diff -u -p -r1.28 amd64-tdep.c
--- amd64-tdep.c 17 Dec 2005 22:33:59 -0000 1.28
+++ amd64-tdep.c 8 Jan 2006 18:52:25 -0000
@@ -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 
   { "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 
   { "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,
Index: i386-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.c,v
retrieving revision 1.220
diff -u -p -r1.220 i386-tdep.c
--- i386-tdep.c 17 Dec 2005 22:34:01 -0000 1.220
+++ i386-tdep.c 8 Jan 2006 18:52:27 -0000
@@ -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 *gdbar
 }
 
 
+/* Type for %eflags.  */
+struct type *i386_eflags_type;
+
 /* Types for the MMX and SSE registers.  */
-static struct type *i386_mmx_type;
-static struct type *i386_sse_type;
+struct type *i386_mmx_type;
+struct type *i386_sse_type;
 
-/* Construct the type for MMX registers.  */
-static struct type *
-i386_build_mmx_type (void)
+/* 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;
-
-      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);
+  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;
 
-      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;
-    }
+  /* 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
 
-  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 *gdba
   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 *gdba
     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();
 }
Index: i386-tdep.h
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.h,v
retrieving revision 1.44
diff -u -p -r1.44 i386-tdep.h
--- i386-tdep.h 19 Dec 2005 22:19:49 -0000 1.44
+++ i386-tdep.h 8 Jan 2006 18:52:27 -0000
@@ -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. */
Index: gdbtypes.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtypes.c,v
retrieving revision 1.102
diff -u -p -r1.102 gdbtypes.c
--- gdbtypes.c 17 Dec 2005 22:34:00 -0000 1.102
+++ gdbtypes.c 8 Jan 2006 18:52:29 -0000
@@ -1,6 +1,8 @@
 /* Support routines for manipulating internal types for GDB.
-   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003,
-   2004 Free Software Foundation, Inc.
+
+   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002,
+   2003, 2004, 2006 Free Software Foundation, Inc.
+
    Contributed by Cygnus Support, using pieces from other GDB modules.
 
    This file is part of GDB.
@@ -847,6 +849,39 @@ create_set_type (struct type *result_typ
   return (result_type);
 }
 
+void
+append_flags_type_flag (struct type *type, int bitpos, char *name)
+{
+  gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLAGS);
+  gdb_assert (bitpos < TYPE_NFIELDS (type));
+  gdb_assert (bitpos >= 0);
+
+  if (name)
+    {
+      TYPE_FIELD_NAME (type, bitpos) = xstrdup (name);
+      TYPE_FIELD_BITPOS (type, bitpos) = bitpos;
+    }
+  else
+    {
+      /* Don't show this field to the user.  */
+      TYPE_FIELD_BITPOS (type, bitpos) = -1;
+    }
+}
+
+struct type *
+init_flags_type (char *name, int length)
+{
+  int nfields = length * TARGET_CHAR_BIT;
+  struct type *type;
+
+  type = init_type (TYPE_CODE_FLAGS, length, TYPE_FLAG_UNSIGNED, name, NULL);
+  TYPE_NFIELDS (type) = nfields;
+  TYPE_FIELDS (type) = TYPE_ALLOC (type, nfields * sizeof (struct field));
+  memset (TYPE_FIELDS (type), 0, sizeof (struct field));
+
+  return type;
+}
+
 /* Construct and return a type of the form:
 	struct NAME { ELT_TYPE ELT_NAME[N]; }
    We use these types for SIMD registers.  For example, the type of
@@ -1822,6 +1857,7 @@ is_integral_type (struct type *t)
     ((t != NULL)
      && ((TYPE_CODE (t) == TYPE_CODE_INT)
 	 || (TYPE_CODE (t) == TYPE_CODE_ENUM)
+	 || (TYPE_CODE (t) == TYPE_CODE_FLAGS)
 	 || (TYPE_CODE (t) == TYPE_CODE_CHAR)
 	 || (TYPE_CODE (t) == TYPE_CODE_RANGE)
 	 || (TYPE_CODE (t) == TYPE_CODE_BOOL)));
@@ -2374,6 +2410,7 @@ rank_one_type (struct type *parm, struct
 	  return rank_one_type (TYPE_TARGET_TYPE (parm), arg);
 	case TYPE_CODE_INT:
 	case TYPE_CODE_ENUM:
+	case TYPE_CODE_FLAGS:
 	case TYPE_CODE_CHAR:
 	case TYPE_CODE_RANGE:
 	case TYPE_CODE_BOOL:
@@ -2454,6 +2491,7 @@ rank_one_type (struct type *parm, struct
 	  else
 	    return INTEGER_CONVERSION_BADNESS;
 	case TYPE_CODE_ENUM:
+	case TYPE_CODE_FLAGS:
 	case TYPE_CODE_CHAR:
 	case TYPE_CODE_RANGE:
 	case TYPE_CODE_BOOL:
@@ -2888,6 +2926,9 @@ recursive_dump_type (struct type *type, 
     case TYPE_CODE_ENUM:
       printf_filtered ("(TYPE_CODE_ENUM)");
       break;
+    case TYPE_CODE_FLAGS:
+      printf_filtered ("(TYPE_CODE_FLAGS)");
+      break;
     case TYPE_CODE_FUNC:
       printf_filtered ("(TYPE_CODE_FUNC)");
       break;
Index: gdbtypes.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbtypes.h,v
retrieving revision 1.63
diff -u -p -r1.63 gdbtypes.h
--- gdbtypes.h 17 Dec 2005 22:34:00 -0000 1.63
+++ gdbtypes.h 8 Jan 2006 18:52:30 -0000
@@ -1,7 +1,7 @@
 /* Internal type definitions for GDB.
 
    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+   2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
 
    Contributed by Cygnus Support, using pieces from other GDB modules.
 
@@ -106,6 +106,7 @@ enum type_code
     TYPE_CODE_STRUCT,		/* C struct or Pascal record */
     TYPE_CODE_UNION,		/* C union or Pascal variant part */
     TYPE_CODE_ENUM,		/* Enumeration type */
+    TYPE_CODE_FLAGS,		/* Bit flags type */
     TYPE_CODE_FUNC,		/* Function type */
     TYPE_CODE_INT,		/* Integer type */
 
@@ -1190,6 +1191,12 @@ extern struct type *init_composite_type 
 extern void append_composite_type_field (struct type *t, char *name,
 					 struct type *field);
 
+/* Helper functions to construct a bit flags type.  An initially empty
+   type is created using init_flag_type().  Flags are then added using
+   append_flag_type_flag().  */
+extern struct type *init_flags_type (char *name, int length);
+extern void append_flags_type_flag (struct type *type, int bitpos, char *name);
+
 extern struct type *lookup_reference_type (struct type *);
 
 extern struct type *make_reference_type (struct type *, struct type **);
Index: ada-valprint.c
===================================================================
RCS file: /cvs/src/src/gdb/ada-valprint.c,v
retrieving revision 1.27
diff -u -p -r1.27 ada-valprint.c
--- ada-valprint.c 2 Jan 2006 09:39:21 -0000 1.27
+++ ada-valprint.c 8 Jan 2006 18:52:30 -0000
@@ -1,7 +1,7 @@
 /* Support for printing Ada values for GDB, the GNU debugger.
 
    Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1997, 2001,
-   2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -774,6 +774,13 @@ ada_val_print_1 (struct type *type, cons
 	}
       break;
 
+    case TYPE_CODE_FLAGS:
+      if (format)
+	  print_scalar_formatted (valaddr, type, format, 0, stream);
+      else
+	val_print_type_code_flags (type, valaddr, stream);
+      break;
+
     case TYPE_CODE_FLT:
       if (format)
 	return c_val_print (type, valaddr0, embedded_offset, address, stream,
Index: c-valprint.c
===================================================================
RCS file: /cvs/src/src/gdb/c-valprint.c,v
retrieving revision 1.38
diff -u -p -r1.38 c-valprint.c
--- c-valprint.c 17 Dec 2005 22:33:59 -0000 1.38
+++ c-valprint.c 8 Jan 2006 18:52:31 -0000
@@ -1,8 +1,8 @@
 /* Support for printing C values for GDB, the GNU debugger.
 
    Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
-   1997, 1998, 1999, 2000, 2001, 2003, 2005 Free Software Foundation,
-   Inc.
+   1997, 1998, 1999, 2000, 2001, 2003, 2005, 2006
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -343,6 +343,13 @@ c_val_print (struct type *type, const gd
 	}
       break;
 
+    case TYPE_CODE_FLAGS:
+      if (format)
+	  print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
+      else
+	val_print_type_code_flags (type, valaddr + embedded_offset, stream);
+      break;
+
     case TYPE_CODE_FUNC:
       if (format)
 	{
Index: f-valprint.c
===================================================================
RCS file: /cvs/src/src/gdb/f-valprint.c,v
retrieving revision 1.31
diff -u -p -r1.31 f-valprint.c
--- f-valprint.c 17 Dec 2005 22:33:59 -0000 1.31
+++ f-valprint.c 8 Jan 2006 18:52:31 -0000
@@ -1,7 +1,7 @@
 /* Support for printing Fortran values for GDB, the GNU debugger.
 
-   Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2003, 2005 Free
-   Software Foundation, Inc.
+   Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2003, 2005, 2006
+   Free Software Foundation, Inc.
 
    Contributed by Motorola.  Adapted from the C definitions by Farooq Butt
    (fmbutt@engage.sps.mot.com), additionally worked over by Stan Shebs.
@@ -483,6 +483,13 @@ f_val_print (struct type *type, const gd
 	}
       break;
 
+    case TYPE_CODE_FLAGS:
+      if (format)
+	  print_scalar_formatted (valaddr, type, format, 0, stream);
+      else
+	val_print_type_code_flags (type, valaddr, stream);
+      break;
+
     case TYPE_CODE_FLT:
       if (format)
 	print_scalar_formatted (valaddr, type, format, 0, stream);
Index: p-valprint.c
===================================================================
RCS file: /cvs/src/src/gdb/p-valprint.c,v
retrieving revision 1.40
diff -u -p -r1.40 p-valprint.c
--- p-valprint.c 17 Dec 2005 22:34:01 -0000 1.40
+++ p-valprint.c 8 Jan 2006 18:52:32 -0000
@@ -1,6 +1,7 @@
 /* Support for printing Pascal values for GDB, the GNU debugger.
 
-   Copyright (C) 2000, 2001, 2003, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2003, 2005, 2006
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -359,6 +360,13 @@ pascal_val_print (struct type *type, con
 	}
       break;
 
+    case TYPE_CODE_FLAGS:
+      if (format)
+	  print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
+      else
+	val_print_type_code_flags (type, valaddr + embedded_offset, stream);
+      break;
+
     case TYPE_CODE_FUNC:
       if (format)
 	{
Index: valprint.c
===================================================================
RCS file: /cvs/src/src/gdb/valprint.c,v
retrieving revision 1.57
diff -u -p -r1.57 valprint.c
--- valprint.c 17 Dec 2005 22:34:03 -0000 1.57
+++ valprint.c 8 Jan 2006 18:52:33 -0000
@@ -1,8 +1,8 @@
 /* Print values for GDB, the GNU debugger.
 
    Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2005 Free Software
-   Foundation, Inc.
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2005, 2006
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -326,6 +326,27 @@ val_print_type_code_int (struct type *ty
     }
 }
 
+void
+val_print_type_code_flags (struct type *type, const gdb_byte *valaddr,
+			   struct ui_file *stream)
+{
+  LONGEST val = unpack_long (type, valaddr);
+  int bitpos, nfields = TYPE_NFIELDS (type);
+
+  fputs_filtered ("[ ", stream);
+  for (bitpos = 0; bitpos < nfields; bitpos++)
+    {
+      if (TYPE_FIELD_BITPOS (type, bitpos) != -1 && (val & (1 << bitpos)))
+	{
+	  if (TYPE_FIELD_NAME (type, bitpos))
+	    fprintf_filtered (stream, "%s ", TYPE_FIELD_NAME (type, bitpos));
+	  else
+	    fprintf_filtered (stream, "#%d ", bitpos);
+	}
+    }
+  fputs_filtered ("]", stream);
+}
+
 /* Print a number according to FORMAT which is one of d,u,x,o,b,h,w,g.
    The raison d'etre of this function is to consolidate printing of 
    LONG_LONG's into this one function. The format chars b,h,w,g are 
Index: valprint.h
===================================================================
RCS file: /cvs/src/src/gdb/valprint.h,v
retrieving revision 1.12
diff -u -p -r1.12 valprint.h
--- valprint.h 17 Dec 2005 22:34:03 -0000 1.12
+++ valprint.h 8 Jan 2006 18:52:33 -0000
@@ -66,6 +66,10 @@ extern void val_print_array_elements (st
 extern void val_print_type_code_int (struct type *, const gdb_byte *,
 				     struct ui_file *);
 
+extern void val_print_type_code_flags (struct type *type,
+				       const gdb_byte *valaddr,
+				       struct ui_file *stream);
+
 extern void print_binary_chars (struct ui_file *, const gdb_byte *,
 				unsigned int);
 
Index: value.c
===================================================================
RCS file: /cvs/src/src/gdb/value.c,v
retrieving revision 1.33
diff -u -p -r1.33 value.c
--- value.c 17 Dec 2005 22:34:03 -0000 1.33
+++ value.c 8 Jan 2006 18:52:34 -0000
@@ -1,8 +1,8 @@
 /* Low level packing and unpacking of values for GDB, the GNU Debugger.
 
    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
-   1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005 Free
-   Software Foundation, Inc.
+   1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -1044,6 +1044,7 @@ unpack_long (struct type *type, const gd
     case TYPE_CODE_TYPEDEF:
       return unpack_long (check_typedef (type), valaddr);
     case TYPE_CODE_ENUM:
+    case TYPE_CODE_FLAGS:
     case TYPE_CODE_BOOL:
     case TYPE_CODE_INT:
     case TYPE_CODE_CHAR:
@@ -1492,6 +1493,7 @@ retry:
     case TYPE_CODE_INT:
     case TYPE_CODE_CHAR:
     case TYPE_CODE_ENUM:
+    case TYPE_CODE_FLAGS:
     case TYPE_CODE_BOOL:
     case TYPE_CODE_RANGE:
       store_signed_integer (value_contents_raw (val), len, num);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]