Allow really large fortran array bounds: TYPE_LENGTH to ULONGEST

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.
This commit is contained in:
Keith Seitz 2019-03-29 10:15:38 -07:00
parent 2487ef07c2
commit cc1defb1dc
13 changed files with 54 additions and 27 deletions

View 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> 2019-03-28 Jon Turney <jon.turney@dronecode.org.uk>
* windows-nat.c (display_selector): Fixed format specifications * windows-nat.c (display_selector): Fixed format specifications

View file

@ -8500,11 +8500,11 @@ ada_template_to_fixed_record_type_1 (struct type *type,
if (TYPE_LENGTH (type) <= 0) if (TYPE_LENGTH (type) <= 0)
{ {
if (TYPE_NAME (rtype)) if (TYPE_NAME (rtype))
warning (_("Invalid type size for `%s' detected: %d."), warning (_("Invalid type size for `%s' detected: %s."),
TYPE_NAME (rtype), TYPE_LENGTH (type)); TYPE_NAME (rtype), pulongest (TYPE_LENGTH (type)));
else else
warning (_("Invalid type size for <unnamed> detected: %d."), warning (_("Invalid type size for <unnamed> detected: %s."),
TYPE_LENGTH (type)); pulongest (TYPE_LENGTH (type)));
} }
else else
{ {

View file

@ -895,8 +895,8 @@ ada_print_type (struct type *type0, const char *varstring,
const char *name = ada_type_name (type); const char *name = ada_type_name (type);
if (!ada_is_range_type_name (name)) if (!ada_is_range_type_name (name))
fprintf_filtered (stream, _("<%d-byte integer>"), fprintf_filtered (stream, _("<%s-byte integer>"),
TYPE_LENGTH (type)); pulongest (TYPE_LENGTH (type)));
else else
{ {
fprintf_filtered (stream, "range "); fprintf_filtered (stream, "range ");
@ -917,7 +917,8 @@ ada_print_type (struct type *type0, const char *varstring,
} }
break; break;
case TYPE_CODE_FLT: case TYPE_CODE_FLT:
fprintf_filtered (stream, _("<%d-byte float>"), TYPE_LENGTH (type)); fprintf_filtered (stream, _("<%s-byte float>"),
pulongest (TYPE_LENGTH (type)));
break; break;
case TYPE_CODE_ENUM: case TYPE_CODE_ENUM:
if (show < 0) if (show < 0)

View file

@ -144,7 +144,7 @@ amd64_windows_store_arg_in_reg (struct regcache *regcache,
gdb_assert (TYPE_LENGTH (type) <= 8); gdb_assert (TYPE_LENGTH (type) <= 8);
memset (buf, 0, sizeof buf); 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); regcache->cooked_write (regno, buf);
} }

View file

@ -270,11 +270,11 @@ generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch,
default: default:
fprintf_unfiltered (stream, fprintf_unfiltered (stream,
" unsigned char %s[%d]" " unsigned char %s[%s]"
" __attribute__((__aligned__(" " __attribute__((__aligned__("
"__BIGGEST_ALIGNMENT__)))", "__BIGGEST_ALIGNMENT__)))",
regname.c_str (), regname.c_str (),
TYPE_LENGTH (regtype)); pulongest (TYPE_LENGTH (regtype)));
} }
fputs_unfiltered (";\n", stream); fputs_unfiltered (";\n", stream);
} }

View file

@ -4591,7 +4591,7 @@ recursive_dump_type (struct type *type, int spaces)
break; break;
} }
puts_filtered ("\n"); 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)) if (TYPE_OBJFILE_OWNED (type))
{ {
printfi_filtered (spaces, "objfile "); printfi_filtered (spaces, "objfile ");

View file

@ -859,7 +859,7 @@ struct type
type_length_units function should be used in order to get the length type_length_units function should be used in order to get the length
expressed in target addressable memory units. */ expressed in target addressable memory units. */
unsigned int length; ULONGEST length;
/* * Core type, shared by a group of qualified types. */ /* * Core type, shared by a group of qualified types. */

View 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); m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 1);
} }
else else
fprintf_filtered (stream, "%d", fputs_filtered (pulongest ((TYPE_LENGTH (type)
(TYPE_LENGTH (type) / TYPE_LENGTH (TYPE_TARGET_TYPE (type)))),
/ TYPE_LENGTH (TYPE_TARGET_TYPE (type)))); stream);
} }
fprintf_filtered (stream, "] OF "); fprintf_filtered (stream, "] OF ");
m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level, flags); m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level, flags);

View file

@ -1645,7 +1645,7 @@ riscv_type_alignment (struct type *t)
case TYPE_CODE_ARRAY: case TYPE_CODE_ARRAY:
if (TYPE_VECTOR (t)) if (TYPE_VECTOR (t))
return std::min (TYPE_LENGTH (t), (unsigned) BIGGEST_ALIGNMENT); return std::min (TYPE_LENGTH (t), (ULONGEST) BIGGEST_ALIGNMENT);
/* FALLTHROUGH */ /* FALLTHROUGH */
case TYPE_CODE_COMPLEX: case TYPE_CODE_COMPLEX:

View file

@ -583,8 +583,8 @@ print_symbol (struct gdbarch *gdbarch, struct symbol *symbol,
unsigned i; unsigned i;
struct type *type = check_typedef (SYMBOL_TYPE (symbol)); struct type *type = check_typedef (SYMBOL_TYPE (symbol));
fprintf_filtered (outfile, "const %u hex bytes:", fprintf_filtered (outfile, "const %s hex bytes:",
TYPE_LENGTH (type)); pulongest (TYPE_LENGTH (type)));
for (i = 0; i < TYPE_LENGTH (type); i++) for (i = 0; i < TYPE_LENGTH (type); i++)
fprintf_filtered (outfile, " %02x", fprintf_filtered (outfile, " %02x",
(unsigned) SYMBOL_VALUE_BYTES (symbol)[i]); (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);

View file

@ -2636,8 +2636,11 @@ info_scope_command (const char *args_in, int from_tty)
} }
} }
if (SYMBOL_TYPE (sym)) 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)) if (BLOCK_FUNCTION (block))
break; break;

View 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 /* Since union fields don't have the concept of offsets, we just
print their sizes. */ print their sizes. */
fprintf_filtered (stream, "/* %4u */", TYPE_LENGTH (ftype)); fprintf_filtered (stream, "/* %4s */",
pulongest (TYPE_LENGTH (ftype)));
return; return;
} }
@ -183,8 +184,8 @@ print_offset_data::finish (struct type *type, int level,
fputs_filtered ("\n", stream); fputs_filtered ("\n", stream);
print_spaces_filtered (level + 4 + print_offset_data::indentation, stream); print_spaces_filtered (level + 4 + print_offset_data::indentation, stream);
fprintf_filtered (stream, "/* total size (bytes): %4u */\n", fprintf_filtered (stream, "/* total size (bytes): %4s */\n",
TYPE_LENGTH (type)); pulongest (TYPE_LENGTH (type)));
} }

View file

@ -1615,8 +1615,8 @@ xtensa_store_return_value (struct type *type,
if (len > (callsize > 8 ? 8 : 16)) if (len > (callsize > 8 ? 8 : 16))
internal_error (__FILE__, __LINE__, internal_error (__FILE__, __LINE__,
_("unimplemented for this length: %d"), _("unimplemented for this length: %s"),
TYPE_LENGTH (type)); pulongest (TYPE_LENGTH (type)));
areg = arreg_number (gdbarch, areg = arreg_number (gdbarch,
gdbarch_tdep (gdbarch)->a0_base + 2 + callsize, wb); 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 value *arg = args[i];
struct type *arg_type = check_typedef (value_type (arg)); 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), host_address_to_string (arg),
TYPE_LENGTH (arg_type)); pulongest (TYPE_LENGTH (arg_type)));
switch (TYPE_CODE (arg_type)) switch (TYPE_CODE (arg_type))
{ {
case TYPE_CODE_INT: case TYPE_CODE_INT: