mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-21 01:12:32 +08:00
2005-10-03 Joel Brobecker <brobecker@adacore.com>
* language.h (language_defn): New field la_print_array_index. (LA_PRINT_ARRAY_INDEX): New macro. (default_print_array_index): Add declaration. * language.c (default_print_array_index): new function. (unknown_language): Add value for new field. (auto_language): Likewise. (local_language): Likewise. * ada-lang.c (ada_print_array_index): New function. (ada_language_defn): Add value for new field. * c-lang.c (c_language_defn): Likewise. (cpluc_language_defn): Likewise. (asm_language_defn): Likewise. (minimal_language_defn): Likewise. * f-lang.c (f_language_defn): Likewise. * jv-lang.c (java_language_defn): Likewise. * m2-lang.c (m2_language_defn): Likewise. * objc-lang.c (objc_language_defn): Likewise. * p-lang.c (pascal_language_defn): Likewise. * scm-lang.c (scm_language_defn): Likewise. * valprint.h (print_array_indexes_p): Add declaration. (get_array_low_bound): Add declaration. (maybe_print_array_index): Add declaration. * valprint.c (print_array_indexes): New static variable. (show_print_array_indexes): New function. (print_array_indexes_p): New function. (get_array_low_bound): New function. (maybe_print_array_index): New function. (val_print_array_elements): Print the index of each element if requested by the user. (_initialize_valprint): Add new array-indexes "set/show print" command. * ada-valprint.c (print_optional_low_bound): Replace extracted code by call to ada_get_array_low_bound_and_type(). Stop printing the low bound if indexes will be printed for all elements of the array. (val_print_packed_array_elements): Print the index of each element of the array if necessary.
This commit is contained in:
parent
043f5962ba
commit
e79af960e2
@ -1,4 +1,42 @@
|
||||
2005-10-02 Joel Brobecker <brobecker@adacore.com>
|
||||
2005-10-03 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* language.h (language_defn): New field la_print_array_index.
|
||||
(LA_PRINT_ARRAY_INDEX): New macro.
|
||||
(default_print_array_index): Add declaration.
|
||||
* language.c (default_print_array_index): new function.
|
||||
(unknown_language): Add value for new field.
|
||||
(auto_language): Likewise.
|
||||
(local_language): Likewise.
|
||||
* ada-lang.c (ada_print_array_index): New function.
|
||||
(ada_language_defn): Add value for new field.
|
||||
* c-lang.c (c_language_defn): Likewise.
|
||||
(cpluc_language_defn): Likewise.
|
||||
(asm_language_defn): Likewise.
|
||||
(minimal_language_defn): Likewise.
|
||||
* f-lang.c (f_language_defn): Likewise.
|
||||
* jv-lang.c (java_language_defn): Likewise.
|
||||
* m2-lang.c (m2_language_defn): Likewise.
|
||||
* objc-lang.c (objc_language_defn): Likewise.
|
||||
* p-lang.c (pascal_language_defn): Likewise.
|
||||
* scm-lang.c (scm_language_defn): Likewise.
|
||||
* valprint.h (print_array_indexes_p): Add declaration.
|
||||
(get_array_low_bound): Add declaration.
|
||||
(maybe_print_array_index): Add declaration.
|
||||
* valprint.c (print_array_indexes): New static variable.
|
||||
(show_print_array_indexes): New function.
|
||||
(print_array_indexes_p): New function.
|
||||
(get_array_low_bound): New function.
|
||||
(maybe_print_array_index): New function.
|
||||
(val_print_array_elements): Print the index of each element if
|
||||
requested by the user.
|
||||
(_initialize_valprint): Add new array-indexes "set/show print" command.
|
||||
* ada-valprint.c (print_optional_low_bound): Replace extracted code
|
||||
by call to ada_get_array_low_bound_and_type(). Stop printing the low
|
||||
bound if indexes will be printed for all elements of the array.
|
||||
(val_print_packed_array_elements): Print the index of each element
|
||||
of the array if necessary.
|
||||
|
||||
2005-10-03 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* hppa-tdep.c (read_unwind_info): Fix typo in comment.
|
||||
|
||||
|
@ -303,6 +303,16 @@ ada_get_gdb_completer_word_break_characters (void)
|
||||
return ada_completer_word_break_characters;
|
||||
}
|
||||
|
||||
/* Print an array element index using the Ada syntax. */
|
||||
|
||||
static void
|
||||
ada_print_array_index (struct value *index_value, struct ui_file *stream,
|
||||
int format, enum val_prettyprint pretty)
|
||||
{
|
||||
LA_VALUE_PRINT (index_value, stream, format, pretty);
|
||||
fprintf_filtered (stream, " => ");
|
||||
}
|
||||
|
||||
/* Read the string located at ADDR from the inferior and store the
|
||||
result into BUF. */
|
||||
|
||||
@ -8766,6 +8776,7 @@ const struct language_defn ada_language_defn = {
|
||||
NULL,
|
||||
ada_get_gdb_completer_word_break_characters,
|
||||
ada_language_arch_info,
|
||||
ada_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
|
@ -86,21 +86,14 @@ print_optional_low_bound (struct ui_file *stream, struct type *type)
|
||||
struct type *index_type;
|
||||
long low_bound;
|
||||
|
||||
index_type = TYPE_INDEX_TYPE (type);
|
||||
low_bound = 0;
|
||||
if (print_array_indexes_p ())
|
||||
return 0;
|
||||
|
||||
if (index_type == NULL)
|
||||
return 0;
|
||||
if (TYPE_CODE (index_type) == TYPE_CODE_RANGE)
|
||||
{
|
||||
low_bound = TYPE_LOW_BOUND (index_type);
|
||||
if (low_bound > TYPE_HIGH_BOUND (index_type))
|
||||
return 0;
|
||||
index_type = TYPE_TARGET_TYPE (index_type);
|
||||
}
|
||||
else
|
||||
if (!get_array_low_bound (type, &low_bound))
|
||||
return 0;
|
||||
|
||||
index_type = TYPE_INDEX_TYPE (type);
|
||||
|
||||
switch (TYPE_CODE (index_type))
|
||||
{
|
||||
case TYPE_CODE_ENUM:
|
||||
@ -137,16 +130,18 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
|
||||
unsigned int i;
|
||||
unsigned int things_printed = 0;
|
||||
unsigned len;
|
||||
struct type *elttype;
|
||||
struct type *elttype, *index_type;
|
||||
unsigned eltlen;
|
||||
unsigned long bitsize = TYPE_FIELD_BITSIZE (type, 0);
|
||||
struct value *mark = value_mark ();
|
||||
LONGEST low = 0;
|
||||
|
||||
elttype = TYPE_TARGET_TYPE (type);
|
||||
eltlen = TYPE_LENGTH (check_typedef (elttype));
|
||||
index_type = TYPE_INDEX_TYPE (type);
|
||||
|
||||
{
|
||||
LONGEST low, high;
|
||||
LONGEST high;
|
||||
if (get_discrete_bounds (TYPE_FIELD_TYPE (type, 0), &low, &high) < 0)
|
||||
len = 1;
|
||||
else
|
||||
@ -174,6 +169,7 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
|
||||
}
|
||||
}
|
||||
wrap_here (n_spaces (2 + 2 * recurse));
|
||||
maybe_print_array_index (index_type, i + low, stream, format, pretty);
|
||||
|
||||
i0 = i;
|
||||
v0 = ada_value_primitive_packed_val (NULL, valaddr,
|
||||
@ -219,6 +215,8 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
|
||||
fprintf_filtered (stream, ", ");
|
||||
}
|
||||
wrap_here (n_spaces (2 + 2 * recurse));
|
||||
maybe_print_array_index (index_type, j + low,
|
||||
stream, format, pretty);
|
||||
}
|
||||
val_print (elttype, value_contents (v0), 0, 0, stream, format,
|
||||
0, recurse + 1, pretty);
|
||||
|
@ -595,6 +595,7 @@ const struct language_defn c_language_defn =
|
||||
NULL,
|
||||
default_word_break_characters,
|
||||
c_language_arch_info,
|
||||
default_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
@ -653,6 +654,7 @@ const struct language_defn cplus_language_defn =
|
||||
&builtin_type_char, /* Type of string elements */
|
||||
default_word_break_characters,
|
||||
NULL, /* FIXME: la_language_arch_info. */
|
||||
default_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
@ -688,6 +690,7 @@ const struct language_defn asm_language_defn =
|
||||
NULL,
|
||||
default_word_break_characters,
|
||||
c_language_arch_info, /* FIXME: la_language_arch_info. */
|
||||
default_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
@ -728,6 +731,7 @@ const struct language_defn minimal_language_defn =
|
||||
NULL,
|
||||
default_word_break_characters,
|
||||
c_language_arch_info,
|
||||
default_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
|
@ -485,6 +485,7 @@ const struct language_defn f_language_defn =
|
||||
&builtin_type_f_character, /* Type of string elements */
|
||||
default_word_break_characters,
|
||||
NULL, /* FIXME: la_language_arch_info. */
|
||||
default_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
|
@ -1114,6 +1114,7 @@ const struct language_defn java_language_defn =
|
||||
NULL,
|
||||
default_word_break_characters,
|
||||
c_language_arch_info,
|
||||
default_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
|
@ -1057,6 +1057,17 @@ default_word_break_characters (void)
|
||||
return " \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,-";
|
||||
}
|
||||
|
||||
/* Print the index of array elements using the C99 syntax. */
|
||||
|
||||
void
|
||||
default_print_array_index (struct value *index_value, struct ui_file *stream,
|
||||
int format, enum val_prettyprint pretty)
|
||||
{
|
||||
fprintf_filtered (stream, "[");
|
||||
LA_VALUE_PRINT (index_value, stream, format, pretty);
|
||||
fprintf_filtered (stream, "] = ");
|
||||
}
|
||||
|
||||
/* Define the language that is no language. */
|
||||
|
||||
static int
|
||||
@ -1181,6 +1192,7 @@ const struct language_defn unknown_language_defn =
|
||||
NULL,
|
||||
default_word_break_characters,
|
||||
unknown_language_arch_info, /* la_language_arch_info. */
|
||||
default_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
@ -1217,6 +1229,7 @@ const struct language_defn auto_language_defn =
|
||||
NULL,
|
||||
default_word_break_characters,
|
||||
unknown_language_arch_info, /* la_language_arch_info. */
|
||||
default_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
@ -1252,6 +1265,7 @@ const struct language_defn local_language_defn =
|
||||
NULL,
|
||||
default_word_break_characters,
|
||||
unknown_language_arch_info, /* la_language_arch_info. */
|
||||
default_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
|
@ -275,6 +275,12 @@ struct language_defn
|
||||
void (*la_language_arch_info) (struct gdbarch *,
|
||||
struct language_arch_info *);
|
||||
|
||||
/* Print the index of an element of an array. */
|
||||
void (*la_print_array_index) (struct value *index_value,
|
||||
struct ui_file *stream,
|
||||
int format,
|
||||
enum val_prettyprint pretty);
|
||||
|
||||
/* Add fields above this point, so the magic number is always last. */
|
||||
/* Magic number for compat checking */
|
||||
|
||||
@ -362,6 +368,9 @@ extern enum language set_language (enum language);
|
||||
#define LA_EMIT_CHAR(ch, stream, quoter) \
|
||||
(current_language->la_emitchar(ch, stream, quoter))
|
||||
|
||||
#define LA_PRINT_ARRAY_INDEX(index_value, stream, format, pretty) \
|
||||
(current_language->la_print_array_index(index_value, stream, format, pretty))
|
||||
|
||||
/* Test a character to decide whether it can be printed in literal form
|
||||
or needs to be printed in another representation. For example,
|
||||
in C the literal form of the character with octal value 141 is 'a'
|
||||
@ -457,4 +466,10 @@ extern char *language_class_name_from_physname (const struct language_defn *,
|
||||
/* Splitting strings into words. */
|
||||
extern char *default_word_break_characters (void);
|
||||
|
||||
/* Print the index of an array element using the C99 syntax. */
|
||||
extern void default_print_array_index (struct value *index_value,
|
||||
struct ui_file *stream,
|
||||
int format,
|
||||
enum val_prettyprint pretty);
|
||||
|
||||
#endif /* defined (LANGUAGE_H) */
|
||||
|
@ -437,6 +437,7 @@ const struct language_defn m2_language_defn =
|
||||
&builtin_type_m2_char, /* Type of string elements */
|
||||
default_word_break_characters,
|
||||
NULL, /* FIXME: la_language_arch_info. */
|
||||
default_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
|
@ -684,6 +684,7 @@ const struct language_defn objc_language_defn = {
|
||||
&builtin_type_char, /* Type of string elements */
|
||||
default_word_break_characters,
|
||||
NULL, /* FIXME: la_language_arch_info. */
|
||||
default_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
|
@ -477,6 +477,7 @@ const struct language_defn pascal_language_defn =
|
||||
&builtin_type_char, /* Type of string elements */
|
||||
default_word_break_characters,
|
||||
NULL, /* FIXME: la_language_arch_info. */
|
||||
default_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
|
@ -269,6 +269,7 @@ const struct language_defn scm_language_defn =
|
||||
NULL,
|
||||
default_word_break_characters,
|
||||
c_language_arch_info,
|
||||
default_print_array_index,
|
||||
LANG_MAGIC
|
||||
};
|
||||
|
||||
|
@ -100,6 +100,17 @@ Default output radix for printing of values is %s.\n"),
|
||||
}
|
||||
int output_format = 0;
|
||||
|
||||
/* By default we print arrays without printing the index of each element in
|
||||
the array. This behavior can be changed by setting PRINT_ARRAY_INDEXES. */
|
||||
|
||||
static int print_array_indexes = 0;
|
||||
static void
|
||||
show_print_array_indexes (struct ui_file *file, int from_tty,
|
||||
struct cmd_list_element *c, const char *value)
|
||||
{
|
||||
fprintf_filtered (file, _("Printing of array indexes is %s.\n"), value);
|
||||
}
|
||||
|
||||
/* Print repeat counts if there are more than this many repetitions of an
|
||||
element in an array. Referenced by the low level language dependent
|
||||
print routines. */
|
||||
@ -859,6 +870,70 @@ print_char_chars (struct ui_file *stream, const gdb_byte *valaddr,
|
||||
}
|
||||
}
|
||||
|
||||
/* Return non-zero if the debugger should print the index of each element
|
||||
when printing array values. */
|
||||
|
||||
int
|
||||
print_array_indexes_p (void)
|
||||
{
|
||||
return print_array_indexes;
|
||||
}
|
||||
|
||||
/* Assuming TYPE is a simple, non-empty array type, compute its lower bound.
|
||||
Save it into LOW_BOUND if not NULL.
|
||||
|
||||
Return 1 if the operation was successful. Return zero otherwise,
|
||||
in which case the value of LOW_BOUND is unmodified.
|
||||
|
||||
Computing the array lower bound is pretty easy, but this function
|
||||
does some additional verifications before returning the low bound.
|
||||
If something incorrect is detected, it is better to return a status
|
||||
rather than throwing an error, making it easier for the caller to
|
||||
implement an error-recovery plan. For instance, it may decide to
|
||||
warn the user that the bound was not found and then use a default
|
||||
value instead. */
|
||||
|
||||
int
|
||||
get_array_low_bound (struct type *type, long *low_bound)
|
||||
{
|
||||
struct type *index = TYPE_INDEX_TYPE (type);
|
||||
long low = 0;
|
||||
|
||||
if (index == NULL)
|
||||
return 0;
|
||||
|
||||
if (TYPE_CODE (index) != TYPE_CODE_RANGE
|
||||
&& TYPE_CODE (index) != TYPE_CODE_ENUM)
|
||||
return 0;
|
||||
|
||||
low = TYPE_LOW_BOUND (index);
|
||||
if (low > TYPE_HIGH_BOUND (index))
|
||||
return 0;
|
||||
|
||||
if (low_bound)
|
||||
*low_bound = low;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Print on STREAM using the given FORMAT the index for the element
|
||||
at INDEX of an array whose index type is INDEX_TYPE. */
|
||||
|
||||
void
|
||||
maybe_print_array_index (struct type *index_type, LONGEST index,
|
||||
struct ui_file *stream, int format,
|
||||
enum val_prettyprint pretty)
|
||||
{
|
||||
struct value *index_value;
|
||||
|
||||
if (!print_array_indexes)
|
||||
return;
|
||||
|
||||
index_value = value_from_longest (index_type, index);
|
||||
|
||||
LA_PRINT_ARRAY_INDEX (index_value, stream, format, pretty);
|
||||
}
|
||||
|
||||
/* Called by various <lang>_val_print routines to print elements of an
|
||||
array in the form "<elem1>, <elem2>, <elem3>, ...".
|
||||
|
||||
@ -877,17 +952,25 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr,
|
||||
{
|
||||
unsigned int things_printed = 0;
|
||||
unsigned len;
|
||||
struct type *elttype;
|
||||
struct type *elttype, *index_type;
|
||||
unsigned eltlen;
|
||||
/* Position of the array element we are examining to see
|
||||
whether it is repeated. */
|
||||
unsigned int rep1;
|
||||
/* Number of repetitions we have detected so far. */
|
||||
unsigned int reps;
|
||||
long low_bound_index;
|
||||
|
||||
if (!get_array_low_bound (type, &low_bound_index))
|
||||
{
|
||||
warning ("unable to get low bound of array, using zero as default");
|
||||
low_bound_index = 0;
|
||||
}
|
||||
|
||||
elttype = TYPE_TARGET_TYPE (type);
|
||||
eltlen = TYPE_LENGTH (check_typedef (elttype));
|
||||
len = TYPE_LENGTH (type) / eltlen;
|
||||
index_type = TYPE_INDEX_TYPE (type);
|
||||
|
||||
annotate_array_section_begin (i, elttype);
|
||||
|
||||
@ -906,6 +989,8 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr,
|
||||
}
|
||||
}
|
||||
wrap_here (n_spaces (2 + 2 * recurse));
|
||||
maybe_print_array_index (index_type, i + low_bound_index,
|
||||
stream, format, pretty);
|
||||
|
||||
rep1 = i + 1;
|
||||
reps = 1;
|
||||
@ -1396,6 +1481,12 @@ Show the default input and output number radices.\n\
|
||||
Use 'show input-radix' or 'show output-radix' to independently show each."),
|
||||
&showlist);
|
||||
|
||||
add_setshow_boolean_cmd ("array-indexes", class_support,
|
||||
&print_array_indexes, _("\
|
||||
Set printing of array indexes."), _("\
|
||||
Show printing of array indexes"), NULL, NULL, show_print_array_indexes,
|
||||
&setprintlist, &showprintlist);
|
||||
|
||||
/* Give people the defaults which they are used to. */
|
||||
prettyprint_structs = 0;
|
||||
prettyprint_arrays = 0;
|
||||
|
@ -50,6 +50,14 @@ extern int output_format;
|
||||
|
||||
extern int stop_print_at_null; /* Stop printing at null char? */
|
||||
|
||||
extern int print_array_indexes_p (void);
|
||||
|
||||
extern int get_array_low_bound (struct type *type, long *low_bound);
|
||||
|
||||
extern void maybe_print_array_index (struct type *index_type, LONGEST index,
|
||||
struct ui_file *stream, int format,
|
||||
enum val_prettyprint pretty);
|
||||
|
||||
extern void val_print_array_elements (struct type *, const gdb_byte *,
|
||||
CORE_ADDR, struct ui_file *, int,
|
||||
int, int, enum val_prettyprint,
|
||||
|
Loading…
Reference in New Issue
Block a user