Allow really large fortran array bounds: TYPE_LENGTH to ULONGEST
authorKeith Seitz <keiths@redhat.com>
Fri, 29 Mar 2019 17:15:38 +0000 (10:15 -0700)
committerKeith Seitz <keiths@redhat.com>
Fri, 29 Mar 2019 17:15:38 +0000 (10:15 -0700)
This series is revisit of Siddhesh Poyarekar's patch from back in
2012. The last status on the patch is in the following gdb-patches
thread:

  https://sourceware.org/ml/gdb-patches/2012-08/msg00562.html

It appears that Tom approved the patch, but Jan had some issues
with a compiler error that made the test fail on -m32 test runs.
He wrote up a hand-tweaked .S file to deal with it. Siddesh said
he would update tests. Then nothing.

Siddesh and Jan have both moved on since.

The patch originally required a large precursor patch to work.
I have whittled this down to/rewritten the bare minimum, and this
first patch is the result, changing the type of TYPE_LENGTH
to ULONGEST from unsigned int.

The majority of the changes involve changing printf format
strings to use %s and pulongest instead of %d.

gdb/ChangeLog:

* ada-lang.c (ada_template_to_fixed_record_type_1): Use
%s/pulongest for TYPE_LENGTH instead of %d in format
strings.
* ada-typerint.c (ada_print_type): Likewise.
* amd64-windows-tdep.c (amd64_windows_store_arg_in_reg): Likewise.
* compile/compile-c-support.c (generate_register_struct): Likewise.
* gdbtypes.c (recursive_dump_type): Likewise.
* gdbtypes.h (struct type) <length>: Change type to ULONGEST.
* m2-typeprint.c (m2_array):  Use %s/pulongest for TYPE_LENGTH
instead of %d in format strings.
* riscv-tdep.c (riscv_type_alignment): Cast second argument
to std::min to ULONGEST.
* symmisc.c (print_symbol): Use %s/pulongest for TYPE_LENGTH
instead of %d in format strings.
* tracepoint.c (info_scope_command): Likewise.
* typeprint.c (print_offset_data::update)
(print_offset_data::finish): Likewise.
* xtensa-tdep.c (xtensa_store_return_value)
(xtensa_push_dummy_call): Likewise.

13 files changed:
gdb/ChangeLog
gdb/ada-lang.c
gdb/ada-typeprint.c
gdb/amd64-windows-tdep.c
gdb/compile/compile-c-support.c
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/m2-typeprint.c
gdb/riscv-tdep.c
gdb/symmisc.c
gdb/tracepoint.c
gdb/typeprint.c
gdb/xtensa-tdep.c

index 0d1cb44957822c6ffbe484e1b38a2da2b4e75190..71951b776407b014427bbbcffeb859bf9ec606c1 100644 (file)
@@ -1,3 +1,25 @@
+2019-03-29  Keith Seitz  <keiths@redhat.com>
+
+       * ada-lang.c (ada_template_to_fixed_record_type_1): Use
+       %s/pulongest for TYPE_LENGTH instead of %d in format
+       strings.
+       * ada-typerint.c (ada_print_type): Likewise.
+       * amd64-windows-tdep.c (amd64_windows_store_arg_in_reg): Likewise.
+       * compile/compile-c-support.c (generate_register_struct): Likewise.
+       * gdbtypes.c (recursive_dump_type): Likewise.
+       * gdbtypes.h (struct type) <length>: Change type to ULONGEST.
+       * m2-typeprint.c (m2_array):  Use %s/pulongest for TYPE_LENGTH
+       instead of %d in format strings.
+       * riscv-tdep.c (riscv_type_alignment): Cast second argument
+       to std::min to ULONGEST.
+       * symmisc.c (print_symbol): Use %s/pulongest for TYPE_LENGTH
+       instead of %d in format strings.
+       * tracepoint.c (info_scope_command): Likewise.
+       * typeprint.c (print_offset_data::update)
+       (print_offset_data::finish): Likewise.
+       * xtensa-tdep.c (xtensa_store_return_value)
+       (xtensa_push_dummy_call): Likewise.
+
 2019-03-28  Jon Turney  <jon.turney@dronecode.org.uk>
 
        * windows-nat.c (display_selector): Fixed format specifications
index 692d52a955192f04f86f4ce02a30f49a1603c715..cdaf5589bc4fec3cb51dc68cc75c378d9079ea72 100644 (file)
@@ -8500,11 +8500,11 @@ ada_template_to_fixed_record_type_1 (struct type *type,
   if (TYPE_LENGTH (type) <= 0)
     {
       if (TYPE_NAME (rtype))
-       warning (_("Invalid type size for `%s' detected: %d."),
-                TYPE_NAME (rtype), TYPE_LENGTH (type));
+       warning (_("Invalid type size for `%s' detected: %s."),
+                TYPE_NAME (rtype), pulongest (TYPE_LENGTH (type)));
       else
-       warning (_("Invalid type size for <unnamed> detected: %d."),
-                TYPE_LENGTH (type));
+       warning (_("Invalid type size for <unnamed> detected: %s."),
+                pulongest (TYPE_LENGTH (type)));
     }
   else
     {
index 8c42e8140deedbfefe5244400c2a1de5768712a6..efcd14bedc57952be228e6f0853c071f590935e6 100644 (file)
@@ -895,8 +895,8 @@ ada_print_type (struct type *type0, const char *varstring,
            const char *name = ada_type_name (type);
 
            if (!ada_is_range_type_name (name))
-             fprintf_filtered (stream, _("<%d-byte integer>"),
-                               TYPE_LENGTH (type));
+             fprintf_filtered (stream, _("<%s-byte integer>"),
+                               pulongest (TYPE_LENGTH (type)));
            else
              {
                fprintf_filtered (stream, "range ");
@@ -917,7 +917,8 @@ ada_print_type (struct type *type0, const char *varstring,
          }
        break;
       case TYPE_CODE_FLT:
-       fprintf_filtered (stream, _("<%d-byte float>"), TYPE_LENGTH (type));
+       fprintf_filtered (stream, _("<%s-byte float>"),
+                         pulongest (TYPE_LENGTH (type)));
        break;
       case TYPE_CODE_ENUM:
        if (show < 0)
index 65c05c645abb2545ddedb963b9f5866b128ac403..922da9e48bcbcba08eb4fbd45c013117606bcd24 100644 (file)
@@ -144,7 +144,7 @@ amd64_windows_store_arg_in_reg (struct regcache *regcache,
 
   gdb_assert (TYPE_LENGTH (type) <= 8);
   memset (buf, 0, sizeof buf);
-  memcpy (buf, valbuf, std::min (TYPE_LENGTH (type), (unsigned int) 8));
+  memcpy (buf, valbuf, std::min (TYPE_LENGTH (type), (ULONGEST) 8));
   regcache->cooked_write (regno, buf);
 }
 
index 3d2913cd14c347beba06d34a1ebf4c5eb0cace08..d1947da6570bc655f578e3eb87d98d462dd5ede0 100644 (file)
@@ -270,11 +270,11 @@ generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch,
 
              default:
                fprintf_unfiltered (stream,
-                                   "  unsigned char %s[%d]"
+                                   "  unsigned char %s[%s]"
                                    " __attribute__((__aligned__("
                                    "__BIGGEST_ALIGNMENT__)))",
                                    regname.c_str (),
-                                   TYPE_LENGTH (regtype));
+                                   pulongest (TYPE_LENGTH (regtype)));
              }
            fputs_unfiltered (";\n", stream);
          }
index 7a584172c5ecd74d8917d010415a21deb522e595..b1a51374d967eb1f81d0dbb54f55909f290fa7a7 100644 (file)
@@ -4591,7 +4591,7 @@ recursive_dump_type (struct type *type, int spaces)
       break;
     }
   puts_filtered ("\n");
-  printfi_filtered (spaces, "length %d\n", TYPE_LENGTH (type));
+  printfi_filtered (spaces, "length %s\n", pulongest (TYPE_LENGTH (type)));
   if (TYPE_OBJFILE_OWNED (type))
     {
       printfi_filtered (spaces, "objfile ");
index 66051cf02c7290890fd43bf21fb778682db90ad7..2125ed991d0f6f7a86f0babb0e1f0935dec86041 100644 (file)
@@ -859,7 +859,7 @@ struct type
      type_length_units function should be used in order to get the length
      expressed in target addressable memory units.  */
 
-  unsigned int length;
+  ULONGEST length;
 
   /* * Core type, shared by a group of qualified types.  */
 
index 754fb657afda6a4ebb7fd5657c3cfa8eb58d87ef..dae07d1c531a02c6eac4cb9b56cc9ad7e793aae7 100644 (file)
@@ -234,9 +234,9 @@ static void m2_array (struct type *type, struct ui_file *stream,
          m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 1);
        }
       else
-       fprintf_filtered (stream, "%d",
-                         (TYPE_LENGTH (type)
-                          / TYPE_LENGTH (TYPE_TARGET_TYPE (type))));
+       fputs_filtered (pulongest ((TYPE_LENGTH (type)
+                                   / TYPE_LENGTH (TYPE_TARGET_TYPE (type)))),
+                       stream);
     }
   fprintf_filtered (stream, "] OF ");
   m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level, flags);
index 8a996f32d39846c29cc406333556d45c4254d1e6..ff5f36e76217eee62da3fe2b2b97bcd743934389 100644 (file)
@@ -1645,7 +1645,7 @@ riscv_type_alignment (struct type *t)
 
     case TYPE_CODE_ARRAY:
       if (TYPE_VECTOR (t))
-       return std::min (TYPE_LENGTH (t), (unsigned) BIGGEST_ALIGNMENT);
+       return std::min (TYPE_LENGTH (t), (ULONGEST) BIGGEST_ALIGNMENT);
       /* FALLTHROUGH */
 
     case TYPE_CODE_COMPLEX:
index 5ff66bd6251976728fb7cddbd2bacd4b8e8ed1ee..0220b42749e9df98bfddd35f9da28d8d9a4903f1 100644 (file)
@@ -583,8 +583,8 @@ print_symbol (struct gdbarch *gdbarch, struct symbol *symbol,
            unsigned i;
            struct type *type = check_typedef (SYMBOL_TYPE (symbol));
 
-           fprintf_filtered (outfile, "const %u hex bytes:",
-                             TYPE_LENGTH (type));
+           fprintf_filtered (outfile, "const %s hex bytes:",
+                             pulongest (TYPE_LENGTH (type)));
            for (i = 0; i < TYPE_LENGTH (type); i++)
              fprintf_filtered (outfile, " %02x",
                                (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
index 8cdda7aeed934174f97311215dc5dbac11b547a6..c7585c67839d97cd39e7cf7b58f08708d0397847 100644 (file)
@@ -2636,8 +2636,11 @@ info_scope_command (const char *args_in, int from_tty)
                }
            }
          if (SYMBOL_TYPE (sym))
-           printf_filtered (", length %d.\n",
-                            TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
+           {
+             struct type *t = check_typedef (SYMBOL_TYPE (sym));
+
+             printf_filtered (", length %s.\n", pulongest (TYPE_LENGTH (t)));
+           }
        }
       if (BLOCK_FUNCTION (block))
        break;
index 114725bc6959e9422f84c6d978cbb4a1fbae61ae..0a93a831b86130a0a57c80df636c45ee558311fa 100644 (file)
@@ -120,7 +120,8 @@ print_offset_data::update (struct type *type, unsigned int field_idx,
     {
       /* Since union fields don't have the concept of offsets, we just
         print their sizes.  */
-      fprintf_filtered (stream, "/*              %4u */", TYPE_LENGTH (ftype));
+      fprintf_filtered (stream, "/*              %4s */",
+                       pulongest (TYPE_LENGTH (ftype)));
       return;
     }
 
@@ -183,8 +184,8 @@ print_offset_data::finish (struct type *type, int level,
 
   fputs_filtered ("\n", stream);
   print_spaces_filtered (level + 4 + print_offset_data::indentation, stream);
-  fprintf_filtered (stream, "/* total size (bytes): %4u */\n",
-                   TYPE_LENGTH (type));
+  fprintf_filtered (stream, "/* total size (bytes): %4s */\n",
+                   pulongest (TYPE_LENGTH (type)));
 }
 
 \f
index fcec9961ee30f12738fa669412298e1ac88ffaae..efa0bcb1dc3ba05cd037874aa2431d060873aa3f 100644 (file)
@@ -1615,8 +1615,8 @@ xtensa_store_return_value (struct type *type,
 
       if (len > (callsize > 8 ? 8 : 16))
        internal_error (__FILE__, __LINE__,
-                       _("unimplemented for this length: %d"),
-                       TYPE_LENGTH (type));
+                       _("unimplemented for this length: %s"),
+                       pulongest (TYPE_LENGTH (type)));
       areg = arreg_number (gdbarch,
                           gdbarch_tdep (gdbarch)->a0_base + 2 + callsize, wb);
 
@@ -1723,9 +1723,9 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
         {
          struct value *arg = args[i];
          struct type *arg_type = check_typedef (value_type (arg));
-         fprintf_unfiltered (gdb_stdlog, "%2d: %s %3d ", i,
+         fprintf_unfiltered (gdb_stdlog, "%2d: %s %3s ", i,
                              host_address_to_string (arg),
-                             TYPE_LENGTH (arg_type));
+                             pulongest (TYPE_LENGTH (arg_type)));
          switch (TYPE_CODE (arg_type))
            {
            case TYPE_CODE_INT: