gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Wed, 18 Apr 2012 06:46:47 +0000 (06:46 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Wed, 18 Apr 2012 06:46:47 +0000 (06:46 +0000)
PR symtab/7259:
* ada-exp.y (convert_char_literal): Use TYPE_FIELD_ENUMVAL.
* ada-lang.c (ada_discrete_type_high_bound)
(ada_discrete_type_low_bound): Use TYPE_FIELD_ENUMVAL for
TYPE_CODE_ENUM.
(ada_identical_enum_types_p): Use TYPE_FIELD_ENUMVAL.
(pos_atr, value_val_atr): Use TYPE_FIELD_ENUMVAL for TYPE_CODE_ENUM.
* ada-typeprint.c (print_enum_type): Change variable lastval to LONGEST.
Use TYPE_FIELD_ENUMVAL.
* ada-valprint.c (print_optional_low_bound, ada_print_scalar)
(ada_val_print_1): Use TYPE_FIELD_ENUMVAL for TYPE_CODE_ENUM.
* c-typeprint.c (c_type_print_base): Move variable lastval to inner
block, change it to LONGEST.  Use TYPE_FIELD_ENUMVAL for
TYPE_CODE_ENUM.
* coffread.c (coff_read_enum_type): Use SET_FIELD_ENUMVAL.
* dwarf2read.c (process_enumeration_scope): Likewise.
* gdb-gdb.py (TypeFlagsPrinter): Use field.enumval instead of
field.bitpos.
(class StructMainTypePrettyPrinter): Support also
FIELD_LOC_KIND_ENUMVAL.
* gdbtypes.c (get_discrete_bounds): Use TYPE_FIELD_ENUMVAL for
TYPE_CODE_ENUM.
(recursive_dump_type): Use TYPE_FIELD_ENUMVAL for TYPE_CODE_ENUM.
(copy_type_recursive): Support also FIELD_LOC_KIND_ENUMVAL.
* gdbtypes.h (enum field_loc_kind): New FIELD_LOC_KIND_ENUMVAL.
(struct main_type.flds_bnds.fields.loc): Adjust bitpos comment.  New
field enumval.
(struct main_type.flds_bnds.bields): Adjust loc_kind and bitsize to
accommodate enumval.
(struct call_site): Adjust loc_kind to accommodate enumval.
(FIELD_ENUMVAL, FIELD_ENUMVAL_LVAL, SET_FIELD_ENUMVAL)
(TYPE_FIELD_ENUMVAL): New macros.
* m2-typeprint.c (m2_enum): Use TYPE_FIELD_ENUMVAL.
* mdebugread.c (parse_symbol): Use TYPE_FIELD_ENUMVAL for
TYPE_CODE_ENUM.
* p-typeprint.c (pascal_type_print_base): Likewise.
* python/lib/gdb/printing.py (class FlagEnumerationPrinter): Use
enumval.
* python/lib/gdb/types.py (make_enum_dict): Likewise.
* python/py-type.c (convert_field): New variable addrstring.  Use
TYPE_FIELD_ENUMVAL for TYPE_CODE_ENUM.
(check_types_equal): Support also FIELD_LOC_KIND_ENUMVAL.
* stabsread.c (read_enum_type): Use SET_FIELD_ENUMVAL.
* typepint.c (print_type_scalar): Use TYPE_FIELD_ENUMVAL for
TYPE_CODE_ENUM.
* valprint.c (generic_val_print): Likewise.

gdb/testsuite/
PR symtab/7259:
* gdb.base/enumval.c: New test case.
* gdb.base/enumval.exp: New test case.
* gdb.python/py-type.exp (test_enums): Use field.enumval instead of
field.bitpos.

22 files changed:
gdb/ChangeLog
gdb/ada-exp.y
gdb/ada-lang.c
gdb/ada-typeprint.c
gdb/ada-valprint.c
gdb/c-typeprint.c
gdb/coffread.c
gdb/dwarf2read.c
gdb/gdb-gdb.py
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/m2-typeprint.c
gdb/mdebugread.c
gdb/p-typeprint.c
gdb/python/lib/gdb/printing.py
gdb/python/lib/gdb/types.py
gdb/python/py-type.c
gdb/stabsread.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-type.exp
gdb/typeprint.c
gdb/valprint.c

index 2bd5032..69688ae 100644 (file)
@@ -1,3 +1,52 @@
+2012-04-18  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+       PR symtab/7259:
+       * ada-exp.y (convert_char_literal): Use TYPE_FIELD_ENUMVAL.
+       * ada-lang.c (ada_discrete_type_high_bound)
+       (ada_discrete_type_low_bound): Use TYPE_FIELD_ENUMVAL for
+       TYPE_CODE_ENUM.
+       (ada_identical_enum_types_p): Use TYPE_FIELD_ENUMVAL.
+       (pos_atr, value_val_atr): Use TYPE_FIELD_ENUMVAL for TYPE_CODE_ENUM.
+       * ada-typeprint.c (print_enum_type): Change variable lastval to LONGEST.
+       Use TYPE_FIELD_ENUMVAL.
+       * ada-valprint.c (print_optional_low_bound, ada_print_scalar)
+       (ada_val_print_1): Use TYPE_FIELD_ENUMVAL for TYPE_CODE_ENUM.
+       * c-typeprint.c (c_type_print_base): Move variable lastval to inner
+       block, change it to LONGEST.  Use TYPE_FIELD_ENUMVAL for
+       TYPE_CODE_ENUM.
+       * coffread.c (coff_read_enum_type): Use SET_FIELD_ENUMVAL.
+       * dwarf2read.c (process_enumeration_scope): Likewise.
+       * gdb-gdb.py (TypeFlagsPrinter): Use field.enumval instead of
+       field.bitpos.
+       (class StructMainTypePrettyPrinter): Support also
+       FIELD_LOC_KIND_ENUMVAL.
+       * gdbtypes.c (get_discrete_bounds): Use TYPE_FIELD_ENUMVAL for
+       TYPE_CODE_ENUM.
+       (recursive_dump_type): Use TYPE_FIELD_ENUMVAL for TYPE_CODE_ENUM.
+       (copy_type_recursive): Support also FIELD_LOC_KIND_ENUMVAL.
+       * gdbtypes.h (enum field_loc_kind): New FIELD_LOC_KIND_ENUMVAL.
+       (struct main_type.flds_bnds.fields.loc): Adjust bitpos comment.  New
+       field enumval.
+       (struct main_type.flds_bnds.bields): Adjust loc_kind and bitsize to
+       accommodate enumval.
+       (struct call_site): Adjust loc_kind to accommodate enumval.
+       (FIELD_ENUMVAL, FIELD_ENUMVAL_LVAL, SET_FIELD_ENUMVAL)
+       (TYPE_FIELD_ENUMVAL): New macros.
+       * m2-typeprint.c (m2_enum): Use TYPE_FIELD_ENUMVAL.
+       * mdebugread.c (parse_symbol): Use TYPE_FIELD_ENUMVAL for
+       TYPE_CODE_ENUM.
+       * p-typeprint.c (pascal_type_print_base): Likewise.
+       * python/lib/gdb/printing.py (class FlagEnumerationPrinter): Use
+       enumval.
+       * python/lib/gdb/types.py (make_enum_dict): Likewise.
+       * python/py-type.c (convert_field): New variable addrstring.  Use
+       TYPE_FIELD_ENUMVAL for TYPE_CODE_ENUM.
+       (check_types_equal): Support also FIELD_LOC_KIND_ENUMVAL.
+       * stabsread.c (read_enum_type): Use SET_FIELD_ENUMVAL.
+       * typepint.c (print_type_scalar): Use TYPE_FIELD_ENUMVAL for
+       TYPE_CODE_ENUM.
+       * valprint.c (generic_val_print): Likewise.
+
 2012-04-17  Doug Evans  <dje@google.com>
 
        * dwarf2read.c (lookup_signatured_type): Return NULL instead of 0.
index 36ef3d4..1a80b0b 100644 (file)
@@ -1463,7 +1463,7 @@ convert_char_literal (struct type *type, LONGEST val)
   for (f = 0; f < TYPE_NFIELDS (type); f += 1)
     {
       if (strcmp (name, TYPE_FIELD_NAME (type, f)) == 0)
-       return TYPE_FIELD_BITPOS (type, f);
+       return TYPE_FIELD_ENUMVAL (type, f);
     }
   return val;
 }
index 2e1df7a..52e1e59 100644 (file)
@@ -690,7 +690,7 @@ ada_discrete_type_high_bound (struct type *type)
     case TYPE_CODE_RANGE:
       return TYPE_HIGH_BOUND (type);
     case TYPE_CODE_ENUM:
-      return TYPE_FIELD_BITPOS (type, TYPE_NFIELDS (type) - 1);
+      return TYPE_FIELD_ENUMVAL (type, TYPE_NFIELDS (type) - 1);
     case TYPE_CODE_BOOL:
       return 1;
     case TYPE_CODE_CHAR:
@@ -701,7 +701,7 @@ ada_discrete_type_high_bound (struct type *type)
     }
 }
 
-/* The largest value in the domain of TYPE, a discrete type, as an integer.  */
+/* The smallest value in the domain of TYPE, a discrete type, as an integer.  */
 LONGEST
 ada_discrete_type_low_bound (struct type *type)
 {
@@ -710,7 +710,7 @@ ada_discrete_type_low_bound (struct type *type)
     case TYPE_CODE_RANGE:
       return TYPE_LOW_BOUND (type);
     case TYPE_CODE_ENUM:
-      return TYPE_FIELD_BITPOS (type, 0);
+      return TYPE_FIELD_ENUMVAL (type, 0);
     case TYPE_CODE_BOOL:
       return 0;
     case TYPE_CODE_CHAR:
@@ -4479,7 +4479,7 @@ ada_identical_enum_types_p (struct type *type1, struct type *type2)
 
   /* All enums in the type should have an identical underlying value.  */
   for (i = 0; i < TYPE_NFIELDS (type1); i++)
-    if (TYPE_FIELD_BITPOS (type1, i) != TYPE_FIELD_BITPOS (type2, i))
+    if (TYPE_FIELD_ENUMVAL (type1, i) != TYPE_FIELD_ENUMVAL (type2, i))
       return 0;
 
   /* All enumerals should also have the same name (modulo any numerical
@@ -8298,7 +8298,7 @@ pos_atr (struct value *arg)
 
       for (i = 0; i < TYPE_NFIELDS (type); i += 1)
         {
-          if (v == TYPE_FIELD_BITPOS (type, i))
+          if (v == TYPE_FIELD_ENUMVAL (type, i))
             return i;
         }
       error (_("enumeration value is invalid: can't find 'POS"));
@@ -8329,7 +8329,7 @@ value_val_atr (struct type *type, struct value *arg)
 
       if (pos < 0 || pos >= TYPE_NFIELDS (type))
         error (_("argument to 'VAL out of range"));
-      return value_from_longest (type, TYPE_FIELD_BITPOS (type, pos));
+      return value_from_longest (type, TYPE_FIELD_ENUMVAL (type, pos));
     }
   else
     return value_from_longest (type, value_as_long (arg));
index 5599278..40f3058 100644 (file)
@@ -274,7 +274,8 @@ static void
 print_enum_type (struct type *type, struct ui_file *stream)
 {
   int len = TYPE_NFIELDS (type);
-  int i, lastval;
+  int i;
+  LONGEST lastval;
 
   fprintf_filtered (stream, "(");
   wrap_here (" ");
@@ -287,10 +288,11 @@ print_enum_type (struct type *type, struct ui_file *stream)
        fprintf_filtered (stream, ", ");
       wrap_here ("    ");
       fputs_filtered (ada_enum_name (TYPE_FIELD_NAME (type, i)), stream);
-      if (lastval != TYPE_FIELD_BITPOS (type, i))
+      if (lastval != TYPE_FIELD_ENUMVAL (type, i))
        {
-         fprintf_filtered (stream, " => %d", TYPE_FIELD_BITPOS (type, i));
-         lastval = TYPE_FIELD_BITPOS (type, i);
+         fprintf_filtered (stream, " => %s",
+                           plongest (TYPE_FIELD_ENUMVAL (type, i)));
+         lastval = TYPE_FIELD_ENUMVAL (type, i);
        }
       lastval += 1;
     }
index 1ec62ce..95ec7ec 100644 (file)
@@ -109,7 +109,7 @@ print_optional_low_bound (struct ui_file *stream, struct type *type,
        return 0;
       break;
     case TYPE_CODE_ENUM:
-      if (low_bound == TYPE_FIELD_BITPOS (index_type, 0))
+      if (low_bound == TYPE_FIELD_ENUMVAL (index_type, 0))
        return 0;
       break;
     case TYPE_CODE_UNDEF:
@@ -402,7 +402,7 @@ ada_print_scalar (struct type *type, LONGEST val, struct ui_file *stream)
       len = TYPE_NFIELDS (type);
       for (i = 0; i < len; i++)
        {
-         if (TYPE_FIELD_BITPOS (type, i) == val)
+         if (TYPE_FIELD_ENUMVAL (type, i) == val)
            {
              break;
            }
@@ -824,7 +824,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
        for (i = 0; i < len; i++)
          {
            QUIT;
-           if (val == TYPE_FIELD_BITPOS (type, i))
+           if (val == TYPE_FIELD_ENUMVAL (type, i))
              {
                break;
              }
index 21887c6..a5892b5 100644 (file)
@@ -717,7 +717,6 @@ c_type_print_base (struct type *type, struct ui_file *stream,
 {
   int i;
   int len, real_len;
-  int lastval;
   enum
     {
       s_none, s_public, s_private, s_protected
@@ -1194,9 +1193,10 @@ c_type_print_base (struct type *type, struct ui_file *stream,
        }
       else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
        {
+         LONGEST lastval = 0;
+
          fprintf_filtered (stream, "{");
          len = TYPE_NFIELDS (type);
-         lastval = 0;
          for (i = 0; i < len; i++)
            {
              QUIT;
@@ -1204,11 +1204,11 @@ c_type_print_base (struct type *type, struct ui_file *stream,
                fprintf_filtered (stream, ", ");
              wrap_here ("    ");
              fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
-             if (lastval != TYPE_FIELD_BITPOS (type, i))
+             if (lastval != TYPE_FIELD_ENUMVAL (type, i))
                {
-                 fprintf_filtered (stream, " = %d", 
-                                   TYPE_FIELD_BITPOS (type, i));
-                 lastval = TYPE_FIELD_BITPOS (type, i);
+                 fprintf_filtered (stream, " = %s",
+                                   plongest (TYPE_FIELD_ENUMVAL (type, i)));
+                 lastval = TYPE_FIELD_ENUMVAL (type, i);
                }
              lastval++;
            }
index 30bf3f7..7c59535 100644 (file)
@@ -2159,7 +2159,7 @@ coff_read_enum_type (int index, int length, int lastsym,
 
          SYMBOL_TYPE (xsym) = type;
          TYPE_FIELD_NAME (type, n) = SYMBOL_LINKAGE_NAME (xsym);
-         SET_FIELD_BITPOS (TYPE_FIELD (type, n), SYMBOL_VALUE (xsym));
+         SET_FIELD_ENUMVAL (TYPE_FIELD (type, n), SYMBOL_VALUE (xsym));
          if (SYMBOL_VALUE (xsym) < 0)
            unsigned_enum = 0;
          TYPE_FIELD_BITSIZE (type, n) = 0;
index 52ed458..b56b4a3 100644 (file)
@@ -8051,7 +8051,7 @@ process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu)
 
                  FIELD_NAME (fields[num_fields]) = SYMBOL_LINKAGE_NAME (sym);
                  FIELD_TYPE (fields[num_fields]) = NULL;
-                 SET_FIELD_BITPOS (fields[num_fields], SYMBOL_VALUE (sym));
+                 SET_FIELD_ENUMVAL (fields[num_fields], SYMBOL_VALUE (sym));
                  FIELD_BITSIZE (fields[num_fields]) = 0;
 
                  num_fields++;
index 579500f..1ea03ce 100644 (file)
@@ -99,10 +99,10 @@ class TypeFlagsPrinter:
             return
         # Note: TYPE_FLAG_MIN is a duplicate of TYPE_FLAG_UNSIGNED,
         # so exclude it from the list we are building.
-        TYPE_FLAGS = [TypeFlag(field.name, field.bitpos)
+        TYPE_FLAGS = [TypeFlag(field.name, field.enumval)
                       for field in flags.fields()
                       if field.name != 'TYPE_FLAG_MIN']
-        TYPE_FLAGS += [TypeFlag(field.name, field.bitpos)
+        TYPE_FLAGS += [TypeFlag(field.name, field.enumval)
                        for field in iflags.fields()]
         TYPE_FLAGS.sort()
 
@@ -154,6 +154,8 @@ class StructMainTypePrettyPrinter:
         loc_kind = str(field_val['loc_kind'])
         if loc_kind == "FIELD_LOC_KIND_BITPOS":
             return 'bitpos = %d' % loc_val['bitpos']
+        elif loc_kind == "FIELD_LOC_KIND_ENUMVAL":
+            return 'enumval = %d' % loc_val['enumval']
         elif loc_kind == "FIELD_LOC_KIND_PHYSADDR":
             return 'physaddr = 0x%x' % loc_val['physaddr']
         elif loc_kind == "FIELD_LOC_KIND_PHYSNAME":
index d772d9a..60b0839 100644 (file)
@@ -775,13 +775,13 @@ get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
             entries.  */
          int i;
 
-         *lowp = *highp = TYPE_FIELD_BITPOS (type, 0);
+         *lowp = *highp = TYPE_FIELD_ENUMVAL (type, 0);
          for (i = 0; i < TYPE_NFIELDS (type); i++)
            {
-             if (TYPE_FIELD_BITPOS (type, i) < *lowp)
-               *lowp = TYPE_FIELD_BITPOS (type, i);
-             if (TYPE_FIELD_BITPOS (type, i) > *highp)
-               *highp = TYPE_FIELD_BITPOS (type, i);
+             if (TYPE_FIELD_ENUMVAL (type, i) < *lowp)
+               *lowp = TYPE_FIELD_ENUMVAL (type, i);
+             if (TYPE_FIELD_ENUMVAL (type, i) > *highp)
+               *highp = TYPE_FIELD_ENUMVAL (type, i);
            }
 
          /* Set unsigned indicator if warranted.  */
@@ -3197,10 +3197,15 @@ recursive_dump_type (struct type *type, int spaces)
   puts_filtered ("\n");
   for (idx = 0; idx < TYPE_NFIELDS (type); idx++)
     {
-      printfi_filtered (spaces + 2,
-                       "[%d] bitpos %d bitsize %d type ",
-                       idx, TYPE_FIELD_BITPOS (type, idx),
-                       TYPE_FIELD_BITSIZE (type, idx));
+      if (TYPE_CODE (type) == TYPE_CODE_ENUM)
+       printfi_filtered (spaces + 2,
+                         "[%d] enumval %s type ",
+                         idx, plongest (TYPE_FIELD_ENUMVAL (type, idx)));
+      else
+       printfi_filtered (spaces + 2,
+                         "[%d] bitpos %d bitsize %d type ",
+                         idx, TYPE_FIELD_BITPOS (type, idx),
+                         TYPE_FIELD_BITSIZE (type, idx));
       gdb_print_host_address (TYPE_FIELD_TYPE (type, idx), gdb_stdout);
       printf_filtered (" name '%s' (",
                       TYPE_FIELD_NAME (type, idx) != NULL
@@ -3397,6 +3402,10 @@ copy_type_recursive (struct objfile *objfile,
              SET_FIELD_BITPOS (TYPE_FIELD (new_type, i),
                                TYPE_FIELD_BITPOS (type, i));
              break;
+           case FIELD_LOC_KIND_ENUMVAL:
+             SET_FIELD_ENUMVAL (TYPE_FIELD (new_type, i),
+                                TYPE_FIELD_ENUMVAL (type, i));
+             break;
            case FIELD_LOC_KIND_PHYSADDR:
              SET_FIELD_PHYSADDR (TYPE_FIELD (new_type, i),
                                  TYPE_FIELD_STATIC_PHYSADDR (type, i));
index a2b2432..887dfdb 100644 (file)
@@ -351,6 +351,7 @@ enum type_instance_flag_value
 enum field_loc_kind
   {
     FIELD_LOC_KIND_BITPOS,     /* bitpos */
+    FIELD_LOC_KIND_ENUMVAL,    /* enumval */
     FIELD_LOC_KIND_PHYSADDR,   /* physaddr */
     FIELD_LOC_KIND_PHYSNAME,   /* physname */
     FIELD_LOC_KIND_DWARF_BLOCK /* dwarf_block */
@@ -511,11 +512,13 @@ struct main_type
           containing structure.  For gdbarch_bits_big_endian=1
           targets, it is the bit offset to the MSB.  For
           gdbarch_bits_big_endian=0 targets, it is the bit offset to
-          the LSB.  For a range bound or enum value, this is the
-          value itself.  */
+          the LSB.  */
 
        int bitpos;
 
+       /* Enum value.  */
+       LONGEST enumval;
+
        /* For a static field, if TYPE_FIELD_STATIC_HAS_ADDR then physaddr
           is the location (in the target) of the static field.
           Otherwise, physname is the mangled label of the static field.  */
@@ -538,7 +541,7 @@ struct main_type
       unsigned int artificial : 1;
 
       /* Discriminant for union field_location.  */
-      ENUM_BITFIELD(field_loc_kind) loc_kind : 2;
+      ENUM_BITFIELD(field_loc_kind) loc_kind : 3;
 
       /* Size of this field, in bits, or zero if not packed.
         If non-zero in an array type, indicates the element size in
@@ -546,7 +549,7 @@ struct main_type
         For an unpacked field, the field's type's length
         says how many bytes the field occupies.  */
 
-      unsigned int bitsize : 29;
+      unsigned int bitsize : 28;
 
       /* In a struct or union type, type of this field.
         In a function or member type, type of this argument.
@@ -931,7 +934,7 @@ struct call_site
        union field_location loc;
 
        /* Discriminant for union field_location.  */
-       ENUM_BITFIELD(field_loc_kind) loc_kind : 2;
+       ENUM_BITFIELD(field_loc_kind) loc_kind : 3;
       }
     target;
 
@@ -1089,12 +1092,17 @@ extern void allocate_gnat_aux_type (struct type *);
 #define FIELD_LOC_KIND(thisfld) ((thisfld).loc_kind)
 #define FIELD_BITPOS_LVAL(thisfld) ((thisfld).loc.bitpos)
 #define FIELD_BITPOS(thisfld) (FIELD_BITPOS_LVAL (thisfld) + 0)
+#define FIELD_ENUMVAL_LVAL(thisfld) ((thisfld).loc.enumval)
+#define FIELD_ENUMVAL(thisfld) (FIELD_ENUMVAL_LVAL (thisfld) + 0)
 #define FIELD_STATIC_PHYSNAME(thisfld) ((thisfld).loc.physname)
 #define FIELD_STATIC_PHYSADDR(thisfld) ((thisfld).loc.physaddr)
 #define FIELD_DWARF_BLOCK(thisfld) ((thisfld).loc.dwarf_block)
 #define SET_FIELD_BITPOS(thisfld, bitpos)                      \
   (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_BITPOS,           \
    FIELD_BITPOS_LVAL (thisfld) = (bitpos))
+#define SET_FIELD_ENUMVAL(thisfld, enumval)                    \
+  (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_ENUMVAL,          \
+   FIELD_ENUMVAL_LVAL (thisfld) = (enumval))
 #define SET_FIELD_PHYSNAME(thisfld, name)                      \
   (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSNAME,         \
    FIELD_STATIC_PHYSNAME (thisfld) = (name))
@@ -1112,6 +1120,7 @@ extern void allocate_gnat_aux_type (struct type *);
 #define TYPE_FIELD_NAME(thistype, n) FIELD_NAME(TYPE_FIELD(thistype, n))
 #define TYPE_FIELD_LOC_KIND(thistype, n) FIELD_LOC_KIND (TYPE_FIELD (thistype, n))
 #define TYPE_FIELD_BITPOS(thistype, n) FIELD_BITPOS (TYPE_FIELD (thistype, n))
+#define TYPE_FIELD_ENUMVAL(thistype, n) FIELD_ENUMVAL (TYPE_FIELD (thistype, n))
 #define TYPE_FIELD_STATIC_PHYSNAME(thistype, n) FIELD_STATIC_PHYSNAME (TYPE_FIELD (thistype, n))
 #define TYPE_FIELD_STATIC_PHYSADDR(thistype, n) FIELD_STATIC_PHYSADDR (TYPE_FIELD (thistype, n))
 #define TYPE_FIELD_DWARF_BLOCK(thistype, n) FIELD_DWARF_BLOCK (TYPE_FIELD (thistype, n))
index 9735d7f..fb3d49c 100644 (file)
@@ -607,10 +607,11 @@ m2_enum (struct type *type, struct ui_file *stream, int show, int level)
            fprintf_filtered (stream, ", ");
          wrap_here ("    ");
          fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
-         if (lastval != TYPE_FIELD_BITPOS (type, i))
+         if (lastval != TYPE_FIELD_ENUMVAL (type, i))
            {
-             fprintf_filtered (stream, " = %d", TYPE_FIELD_BITPOS (type, i));
-             lastval = TYPE_FIELD_BITPOS (type, i);
+             fprintf_filtered (stream, " = %s",
+                               plongest (TYPE_FIELD_ENUMVAL (type, i)));
+             lastval = TYPE_FIELD_ENUMVAL (type, i);
            }
          lastval++;
        }
index 299e94c..a20f953 100644 (file)
@@ -1047,7 +1047,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
                if (tsym.st != stMember)
                  break;
 
-               SET_FIELD_BITPOS (*f, tsym.value);
+               SET_FIELD_ENUMVAL (*f, tsym.value);
                FIELD_TYPE (*f) = t;
                FIELD_NAME (*f) = debug_info->ss + cur_fdr->issBase + tsym.iss;
                FIELD_BITSIZE (*f) = 0;
index bc24495..a00f5b3 100644 (file)
@@ -750,11 +750,12 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
                fprintf_filtered (stream, ", ");
              wrap_here ("    ");
              fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
-             if (lastval != TYPE_FIELD_BITPOS (type, i))
+             if (lastval != TYPE_FIELD_ENUMVAL (type, i))
                {
                  fprintf_filtered (stream,
-                                   " := %d", TYPE_FIELD_BITPOS (type, i));
-                 lastval = TYPE_FIELD_BITPOS (type, i);
+                                   " := %s",
+                                   plongest (TYPE_FIELD_ENUMVAL (type, i)));
+                 lastval = TYPE_FIELD_ENUMVAL (type, i);
                }
              lastval++;
            }
index 0f399d0..b4e798d 100644 (file)
@@ -247,10 +247,10 @@ class FlagEnumerationPrinter(PrettyPrinter):
             flags = gdb.lookup_type(self.name)
             self.enumerators = []
             for field in flags.fields():
-                self.enumerators.append((field.name, field.bitpos))
+                self.enumerators.append((field.name, field.enumval))
             # Sorting the enumerators by value usually does the right
             # thing.
-            self.enumerators.sort(key = lambda x: x.bitpos)
+            self.enumerators.sort(key = lambda x: x.enumval)
 
         if self.enabled:
             return _EnumInstance(self.enumerators, val)
index aca84f3..66c9528 100644 (file)
@@ -86,8 +86,8 @@ def make_enum_dict(enum_type):
         raise TypeError("not an enum type")
     enum_dict = {}
     for field in enum_type.fields():
-        # The enum's value is stored in "bitpos".
-        enum_dict[field.name] = field.bitpos
+        # The enum's value is stored in "enumval".
+        enum_dict[field.name] = field.enumval
     return enum_dict
 
 
index d47d4c8..23808af 100644 (file)
@@ -167,11 +167,23 @@ convert_field (struct type *type, int field)
 
   if (!field_is_static (&TYPE_FIELD (type, field)))
     {
-      arg = PyLong_FromLong (TYPE_FIELD_BITPOS (type, field));
+      const char *attrstring;
+
+      if (TYPE_CODE (type) == TYPE_CODE_ENUM)
+       {
+         arg = gdb_py_long_from_longest (TYPE_FIELD_ENUMVAL (type, field));
+         attrstring = "enumval";
+       }
+      else
+       {
+         arg = PyLong_FromLong (TYPE_FIELD_BITPOS (type, field));
+         attrstring = "bitpos";
+       }
+
       if (!arg)
        goto fail;
 
-      if (PyObject_SetAttrString (result, "bitpos", arg) < 0)
+      if (PyObject_SetAttrString (result, attrstring, arg) < 0)
        goto failarg;
     }
 
@@ -1018,6 +1030,10 @@ check_types_equal (struct type *type1, struct type *type2,
              if (FIELD_BITPOS (*field1) != FIELD_BITPOS (*field2))
                return Py_NE;
              break;
+           case FIELD_LOC_KIND_ENUMVAL:
+             if (FIELD_ENUMVAL (*field1) != FIELD_ENUMVAL (*field2))
+               return Py_NE;
+             break;
            case FIELD_LOC_KIND_PHYSADDR:
              if (FIELD_STATIC_PHYSADDR (*field1)
                  != FIELD_STATIC_PHYSADDR (*field2))
index 40b2465..41a7754 100644 (file)
@@ -3731,7 +3731,7 @@ read_enum_type (char **pp, struct type *type,
 
          SYMBOL_TYPE (xsym) = type;
          TYPE_FIELD_NAME (type, n) = SYMBOL_LINKAGE_NAME (xsym);
-         SET_FIELD_BITPOS (TYPE_FIELD (type, n), SYMBOL_VALUE (xsym));
+         SET_FIELD_ENUMVAL (TYPE_FIELD (type, n), SYMBOL_VALUE (xsym));
          TYPE_FIELD_BITSIZE (type, n) = 0;
        }
       if (syms == osyms)
index 4c349dd..7bf0cc1 100644 (file)
@@ -1,3 +1,12 @@
+2012-04-18  Siddhesh Poyarekar  <siddhesh@redhat.com>
+           Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       PR symtab/7259:
+       * gdb.base/enumval.c: New test case.
+       * gdb.base/enumval.exp: New test case.
+       * gdb.python/py-type.exp (test_enums): Use field.enumval instead of
+       field.bitpos.
+
 2012-04-17  Pedro Alves  <palves@redhat.com>
 
        * Makefile.in (site.exp): Make site.exp source
index feb76ba..8e64b92 100644 (file)
@@ -136,8 +136,8 @@ proc test_enums {} {
   gdb_test "python print len(e.type)" "3" "Check the number of enum fields"
   gdb_test "python print e.type\['v1'\].name" "v1" "Check enum field lookup by name"
   gdb_test "python print e.type\['v3'\].name" "v3" "Check enum field lookup by name"
-    gdb_test "python print \[v.bitpos for v in e.type.itervalues()\]" {\[0L, 1L, 2L\]} "Check num fields iteration over values"
-    gdb_test "python print \[(n, v.bitpos) for (n, v) in e.type.items()\]" {\[\('v1', 0L\), \('v2', 1L\), \('v3', 2L\)\]} "Check enum fields items list"
+    gdb_test "python print \[v.enumval for v in e.type.itervalues()\]" {\[0L, 1L, 2L\]} "Check num fields iteration over values"
+    gdb_test "python print \[(n, v.enumval) for (n, v) in e.type.items()\]" {\[\('v1', 0L\), \('v2', 1L\), \('v3', 2L\)\]} "Check enum fields items list"
 }
 proc test_base_class {} {
   gdb_py_test_silent_cmd "print d" "print value" 1
index f257f47..c25e705 100644 (file)
@@ -206,7 +206,7 @@ print_type_scalar (struct type *type, LONGEST val, struct ui_file *stream)
       len = TYPE_NFIELDS (type);
       for (i = 0; i < len; i++)
        {
-         if (TYPE_FIELD_BITPOS (type, i) == val)
+         if (TYPE_FIELD_ENUMVAL (type, i) == val)
            {
              break;
            }
index 738fef4..25b62bc 100644 (file)
@@ -445,7 +445,7 @@ generic_val_print (struct type *type, const gdb_byte *valaddr,
       for (i = 0; i < len; i++)
        {
          QUIT;
-         if (val == TYPE_FIELD_BITPOS (type, i))
+         if (val == TYPE_FIELD_ENUMVAL (type, i))
            {
              break;
            }
@@ -466,13 +466,13 @@ generic_val_print (struct type *type, const gdb_byte *valaddr,
            {
              QUIT;
 
-             if ((val & TYPE_FIELD_BITPOS (type, i)) != 0)
+             if ((val & TYPE_FIELD_ENUMVAL (type, i)) != 0)
                {
                  if (!first)
                    fputs_filtered (" | ", stream);
                  first = 0;
 
-                 val &= ~TYPE_FIELD_BITPOS (type, i);
+                 val &= ~TYPE_FIELD_ENUMVAL (type, i);
                  fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
                }
            }