Based on a previous patch form Michal Ludvig:
authorMark Kettenis <kettenis@gnu.org>
Wed, 18 Jan 2006 21:24:19 +0000 (21:24 +0000)
committerMark Kettenis <kettenis@gnu.org>
Wed, 18 Jan 2006 21:24:19 +0000 (21:24 +0000)
* 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.

gdb/ChangeLog
gdb/ada-valprint.c
gdb/c-valprint.c
gdb/f-valprint.c
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/p-valprint.c
gdb/valprint.c
gdb/valprint.h
gdb/value.c

index 0b28b950964d32f907c8f842fe852129d4c754cd..d0c85fdfacf43991335bf445e094818c2b5ae7e1 100644 (file)
@@ -1,3 +1,22 @@
+2006-01-18  Mark Kettenis  <kettenis@gnu.org>
+
+       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.
+
 2006-01-17  Christopher Faylor  <cgf@timesys.com>
 
        * MAINTAINERS: Very belatedly remove myself from from the list of
index e735a5b476bfb4779874fa916aac7a07f9b4dc0a..7781fada9a257e950e3cc454a3effd4ec97809a5 100644 (file)
@@ -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, const gdb_byte *valaddr0,
        }
       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 c17c46ce7515d93536916416e230802f6c6753ac..861e3bfe2e180a0c72d5ad1ac9c123a43ef0511d 100644 (file)
@@ -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 gdb_byte *valaddr, int embedded_offset,
        }
       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 bdf7a8fbc0f7458bc47d85766e6a0f02b67e3eb7..e724f7665bc0ee6ef49fc16cc21fc91f61dbf165 100644 (file)
@@ -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 gdb_byte *valaddr, int embedded_offset,
        }
       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 37b47397329eac98d4ce7b85d7ed83c3d5b63e2b..b4062b7b5b2ba213d858bd9333b362cc7aa287c5 100644 (file)
@@ -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_type, struct type *domain_type)
   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 type *arg)
          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 type *arg)
          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, int spaces)
     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 0e5844ffbd665b08320d85f75f68321707fd80e6..de451d5d99d8d4115c052d599fd18cb86383b95e 100644 (file)
@@ -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 (char *name, enum type_code code);
 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 72be1f508c411f252778bc97dba0255c7ecc9d24..9eef4f7d9a0cfc0eee22fa226e82d2413f96e536 100644 (file)
@@ -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, const gdb_byte *valaddr,
        }
       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 0e1359a151c7d85069361592b233764a0cc9ab5c..b3a411a1f08158f2967ff5880319b6913ffc4065 100644 (file)
@@ -326,6 +326,27 @@ val_print_type_code_int (struct type *type, const gdb_byte *valaddr,
     }
 }
 
+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 5092fc5ef6032e351dea769c98b66da477f22325..fa8c7c770464d7550570b56fed0913d19d44cb70 100644 (file)
@@ -66,6 +66,10 @@ extern void val_print_array_elements (struct type *, const gdb_byte *,
 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 738d053f0c7fabaf9ea04a385bb339e69e337235..801874b187d8442c079027ad0ef1d95038dc3bb6 100644 (file)
@@ -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 gdb_byte *valaddr)
     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);