mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 14:49:38 +08:00
* language.c (local_hex_format_custom): Remove.
(local_hex_string): Rename to hex_string, use C format, and move to utils.c (local_hex_string_custom): Rename to hex_string_custom and change interface. Now uses C format. Move to utils.c (local_octal_format_custom): Remove. (local_decimal_format_custom): Remove. (unknown_language_defn): Remove language-specific number formatting entries. (auto_language_defn): Ditto. (local_language_defn): Ditto. * language.h (struct language_format_info): Delete declaration. (struct language_defn): Remove language_format_info fields la_binary_format, la_octal_format, la_decimal_format, la_hex_format. (local_binary_format): Remove macro. (local_binary_format_prefix): Remove macro. (local_binary_format_specifier): Remove macro. (local_binary_format_suffix): Remove macro. (local_octal_format): Remove macro. (local_octal_format_prefix): Remove macro. (local_octal_format_specifier): Remove macro. (local_octal_format_suffix): Remove macro. (local_decimal_format): Remove macro. (local_decimal_format_prefix): Remove macro. (local_decimal_format_specifier): Remove macro. (local_decimal_format_suffix): Remove macro. (local_hex_format): Remove macro. (local_hex_format_prefix): Remove macro. (local_hex_format_specifier): Remove macro. (local_hex_format_suffix): Remove macro. (local_decimal_format_custom): Remove. (local_octal_format_custom): Remove. (local_hex_format_custom): Remove. (local_hex_string): Rename to hex_string and move to defs.h. (local_hex_string_custom): Rename to hex_string_custom, change interface, and move to defs.h. * utils.c: (int_string): New function. (hex_string): New function (from language.c). (hex_string_custom): New function (from language.c). (octal2str): New function. (decimal2str): Add width parameter. (paddr_u): Use new decimal2str interface. (paddr_d): Ditto. * defs.h (hex_string): Declare. (hex_string_custom): Declare. (int_string): Declare. * printcmd.c (print_scalar_formatted): Remove localized binary formatting. * valprint.c (print_longest): Use int_string. (print_floating): Use C hex format. (print_hex_chars): Ditto. (print_binary_chars): Remove language-specific formatting. (print_octal_chars): Use C octal format. (print_decimal_chars): Delocalize format. (print_decimal): Remove. * ada-lang.c (ada_language_defn): Remove language-specific number formatting entries. * p-lang.c (pascal_language_defn): Ditto. * c-lang.c (c_language_defn): Ditto. (cplus_language_defn): Ditto. (asm_language_defn): Ditto. (minimal_language_defn): Ditto. * f-lang.c (f_language_defn): Ditto. * jv-lang.c (java_language_defn): Ditto. * m2-lang.c (m2_language_defn): Ditto. * scm-lang.c (scm_language_defn): Ditto. * objc-lang.c (objc_language_defn): Ditto. * memattr.c (mem_info_command): Use renamed hex_string_custom with new interface. * pa64solib.c (pa64_sharedlibrary_info_command): Ditto. * ui-out.c (ui_out_field_core_addr): Ditto. * breakpoint.c (breakpoint_adjustment_warning): Ditto. * exec.c (print_section_info): Ditto. * i387-tdep.c (print_i387_status_word): Ditto. (print_i387_control_word): Ditto. (i387_print_float_info): Ditto. * maint.c (maint_print_section_info): Ditto. * solib.c (info_sharedlibrary_command): Ditto. * somsolib.c (som_sharedlibrary_info_command): Ditto. * symtab.c (print_msymbol_info): Ditto. * tracepoint.c (tracepoints_info): Ditto. * solib-frv.c (lm_base): Ditto. (frv_current_sos): Ditto. (enable_break2): Ditto. (enable_break): Ditto. * dbxread.c (read_dbx_symtab): Use renamed hex_string. (process_one_symbol): Ditto. * infcmd.c (program_info): Ditto. * mdebugread.c (parse_partial_symbols): Ditto. * symfile.c (add_symbol_file_command): Ditto. * cli/cli-cmds.c (edit_command): Ditto. (list_command): Ditto. * infcall.c (call_function_by_hand): Ditto. * remote-vx.c (vx_run_files_info): Ditto. (vx_wait): Ditto. (vx_attach): Ditto. (vx_detach): Ditto. (vx_kill): Ditto. * aix-thread.c (pdc_symbol_addrs): Ditto. (pdc_read_regs): Ditto. (pdc_write_regs): Ditto. (pdc_read_data): Ditto. (pdc_write_data): Ditto. * d10v-tdep.c (display_trace): Ditto. * rs6000-nat.c (find_toc_address): Ditto. * aix-thread.c: Don't include language.h. * buildsym.c: Ditto. * dbxread.c: Ditto. * mdebugread.c: Ditto. * rs6000-nat.c: Ditto. * buildsym.c (make_blockvector): Use renamed hex_string.
This commit is contained in:
227
gdb/valprint.c
227
gdb/valprint.c
@ -209,202 +209,52 @@ val_print_type_code_int (struct type *type, char *valaddr,
|
||||
|
||||
/* 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. Some platforms have long longs but
|
||||
don't have a printf() that supports "ll" in the format string. We handle
|
||||
these by seeing if the number is representable as either a signed or
|
||||
unsigned long, depending upon what format is desired, and if not we just
|
||||
bail out and print the number in hex.
|
||||
LONG_LONG's into this one function. The format chars b,h,w,g are
|
||||
from print_scalar_formatted(). Numbers are printed using C
|
||||
format.
|
||||
|
||||
The format chars b,h,w,g are from print_scalar_formatted(). If USE_LOCAL,
|
||||
format it according to the current language (this should be used for most
|
||||
integers which GDB prints, the exception is things like protocols where
|
||||
the format of the integer is a protocol thing, not a user-visible thing).
|
||||
*/
|
||||
|
||||
#if defined (CC_HAS_LONG_LONG) && !defined (PRINTF_HAS_LONG_LONG)
|
||||
static void print_decimal (struct ui_file * stream, char *sign,
|
||||
int use_local, ULONGEST val_ulong);
|
||||
static void
|
||||
print_decimal (struct ui_file *stream, char *sign, int use_local,
|
||||
ULONGEST val_ulong)
|
||||
{
|
||||
unsigned long temp[3];
|
||||
int i = 0;
|
||||
do
|
||||
{
|
||||
temp[i] = val_ulong % (1000 * 1000 * 1000);
|
||||
val_ulong /= (1000 * 1000 * 1000);
|
||||
i++;
|
||||
}
|
||||
while (val_ulong != 0 && i < (sizeof (temp) / sizeof (temp[0])));
|
||||
switch (i)
|
||||
{
|
||||
case 1:
|
||||
fprintf_filtered (stream, "%s%lu",
|
||||
sign, temp[0]);
|
||||
break;
|
||||
case 2:
|
||||
fprintf_filtered (stream, "%s%lu%09lu",
|
||||
sign, temp[1], temp[0]);
|
||||
break;
|
||||
case 3:
|
||||
fprintf_filtered (stream, "%s%lu%09lu%09lu",
|
||||
sign, temp[2], temp[1], temp[0]);
|
||||
break;
|
||||
default:
|
||||
internal_error (__FILE__, __LINE__, "failed internal consistency check");
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
USE_C_FORMAT means to use C format in all cases. Without it,
|
||||
'o' and 'x' format do not include the standard C radix prefix
|
||||
(leading 0 or 0x).
|
||||
|
||||
Hilfinger/2004-09-09: USE_C_FORMAT was originally called USE_LOCAL
|
||||
and was intended to request formating according to the current
|
||||
language and would be used for most integers that GDB prints. The
|
||||
exceptional cases were things like protocols where the format of
|
||||
the integer is a protocol thing, not a user-visible thing). The
|
||||
parameter remains to preserve the information of what things might
|
||||
be printed with language-specific format, should we ever resurrect
|
||||
that capability. */
|
||||
|
||||
void
|
||||
print_longest (struct ui_file *stream, int format, int use_local,
|
||||
print_longest (struct ui_file *stream, int format, int use_c_format,
|
||||
LONGEST val_long)
|
||||
{
|
||||
#if defined (CC_HAS_LONG_LONG) && !defined (PRINTF_HAS_LONG_LONG)
|
||||
if (sizeof (long) < sizeof (LONGEST))
|
||||
{
|
||||
switch (format)
|
||||
{
|
||||
case 'd':
|
||||
{
|
||||
/* Print a signed value, that doesn't fit in a long */
|
||||
if ((long) val_long != val_long)
|
||||
{
|
||||
if (val_long < 0)
|
||||
print_decimal (stream, "-", use_local, -val_long);
|
||||
else
|
||||
print_decimal (stream, "", use_local, val_long);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'u':
|
||||
{
|
||||
/* Print an unsigned value, that doesn't fit in a long */
|
||||
if ((unsigned long) val_long != (ULONGEST) val_long)
|
||||
{
|
||||
print_decimal (stream, "", use_local, val_long);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'x':
|
||||
case 'o':
|
||||
case 'b':
|
||||
case 'h':
|
||||
case 'w':
|
||||
case 'g':
|
||||
/* Print as unsigned value, must fit completely in unsigned long */
|
||||
{
|
||||
unsigned long temp = val_long;
|
||||
if (temp != val_long)
|
||||
{
|
||||
/* Urk, can't represent value in long so print in hex.
|
||||
Do shift in two operations so that if sizeof (long)
|
||||
== sizeof (LONGEST) we can avoid warnings from
|
||||
picky compilers about shifts >= the size of the
|
||||
shiftee in bits */
|
||||
unsigned long vbot = (unsigned long) val_long;
|
||||
LONGEST temp = (val_long >> (sizeof (long) * HOST_CHAR_BIT - 1));
|
||||
unsigned long vtop = temp >> 1;
|
||||
fprintf_filtered (stream, "0x%lx%08lx", vtop, vbot);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined (CC_HAS_LONG_LONG) && defined (PRINTF_HAS_LONG_LONG)
|
||||
char *val;
|
||||
switch (format)
|
||||
{
|
||||
case 'd':
|
||||
fprintf_filtered (stream,
|
||||
use_local ? local_decimal_format_custom ("ll")
|
||||
: "%lld",
|
||||
(long long) val_long);
|
||||
break;
|
||||
val = int_string (val_long, 10, 1, 0, 1); break;
|
||||
case 'u':
|
||||
fprintf_filtered (stream, "%llu", (long long) val_long);
|
||||
break;
|
||||
val = int_string (val_long, 10, 0, 0, 1); break;
|
||||
case 'x':
|
||||
fprintf_filtered (stream,
|
||||
use_local ? local_hex_format_custom ("ll")
|
||||
: "%llx",
|
||||
(unsigned long long) val_long);
|
||||
val = int_string (val_long, 16, 0, 0, use_c_format); break;
|
||||
case 'b':
|
||||
val = int_string (val_long, 16, 0, 2, 1); break;
|
||||
case 'h':
|
||||
val = int_string (val_long, 16, 0, 4, 1); break;
|
||||
case 'w':
|
||||
val = int_string (val_long, 16, 0, 8, 1); break;
|
||||
case 'g':
|
||||
val = int_string (val_long, 16, 0, 16, 1); break;
|
||||
break;
|
||||
case 'o':
|
||||
fprintf_filtered (stream,
|
||||
use_local ? local_octal_format_custom ("ll")
|
||||
: "%llo",
|
||||
(unsigned long long) val_long);
|
||||
break;
|
||||
case 'b':
|
||||
fprintf_filtered (stream, local_hex_format_custom ("02ll"), val_long);
|
||||
break;
|
||||
case 'h':
|
||||
fprintf_filtered (stream, local_hex_format_custom ("04ll"), val_long);
|
||||
break;
|
||||
case 'w':
|
||||
fprintf_filtered (stream, local_hex_format_custom ("08ll"), val_long);
|
||||
break;
|
||||
case 'g':
|
||||
fprintf_filtered (stream, local_hex_format_custom ("016ll"), val_long);
|
||||
break;
|
||||
val = int_string (val_long, 8, 0, 0, use_c_format); break;
|
||||
default:
|
||||
internal_error (__FILE__, __LINE__, "failed internal consistency check");
|
||||
}
|
||||
#else /* !CC_HAS_LONG_LONG || !PRINTF_HAS_LONG_LONG */
|
||||
/* In the following it is important to coerce (val_long) to a long. It does
|
||||
nothing if !LONG_LONG, but it will chop off the top half (which we know
|
||||
we can ignore) if the host supports long longs. */
|
||||
}
|
||||
|
||||
switch (format)
|
||||
{
|
||||
case 'd':
|
||||
fprintf_filtered (stream,
|
||||
use_local ? local_decimal_format_custom ("l")
|
||||
: "%ld",
|
||||
(long) val_long);
|
||||
break;
|
||||
case 'u':
|
||||
fprintf_filtered (stream, "%lu", (unsigned long) val_long);
|
||||
break;
|
||||
case 'x':
|
||||
fprintf_filtered (stream,
|
||||
use_local ? local_hex_format_custom ("l")
|
||||
: "%lx",
|
||||
(unsigned long) val_long);
|
||||
break;
|
||||
case 'o':
|
||||
fprintf_filtered (stream,
|
||||
use_local ? local_octal_format_custom ("l")
|
||||
: "%lo",
|
||||
(unsigned long) val_long);
|
||||
break;
|
||||
case 'b':
|
||||
fprintf_filtered (stream, local_hex_format_custom ("02l"),
|
||||
(unsigned long) val_long);
|
||||
break;
|
||||
case 'h':
|
||||
fprintf_filtered (stream, local_hex_format_custom ("04l"),
|
||||
(unsigned long) val_long);
|
||||
break;
|
||||
case 'w':
|
||||
fprintf_filtered (stream, local_hex_format_custom ("08l"),
|
||||
(unsigned long) val_long);
|
||||
break;
|
||||
case 'g':
|
||||
fprintf_filtered (stream, local_hex_format_custom ("016l"),
|
||||
(unsigned long) val_long);
|
||||
break;
|
||||
default:
|
||||
internal_error (__FILE__, __LINE__, "failed internal consistency check");
|
||||
}
|
||||
#endif /* CC_HAS_LONG_LONG || PRINTF_HAS_LONG_LONG */
|
||||
fprintf_filtered (stream, val);
|
||||
}
|
||||
|
||||
/* This used to be a macro, but I don't think it is called often enough
|
||||
@ -449,9 +299,8 @@ print_floating (char *valaddr, struct type *type, struct ui_file *stream)
|
||||
if (floatformat_is_negative (fmt, valaddr))
|
||||
fprintf_filtered (stream, "-");
|
||||
fprintf_filtered (stream, "nan(");
|
||||
fputs_filtered (local_hex_format_prefix (), stream);
|
||||
fputs_filtered ("0x", stream);
|
||||
fputs_filtered (floatformat_mantissa (fmt, valaddr), stream);
|
||||
fputs_filtered (local_hex_format_suffix (), stream);
|
||||
fprintf_filtered (stream, ")");
|
||||
return;
|
||||
}
|
||||
@ -512,7 +361,6 @@ print_binary_chars (struct ui_file *stream, unsigned char *valaddr,
|
||||
|
||||
/* FIXME: We should be not printing leading zeroes in most cases. */
|
||||
|
||||
fputs_filtered (local_binary_format_prefix (), stream);
|
||||
if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
|
||||
{
|
||||
for (p = valaddr;
|
||||
@ -550,7 +398,6 @@ print_binary_chars (struct ui_file *stream, unsigned char *valaddr,
|
||||
}
|
||||
}
|
||||
}
|
||||
fputs_filtered (local_binary_format_suffix (), stream);
|
||||
}
|
||||
|
||||
/* VALADDR points to an integer of LEN bytes.
|
||||
@ -599,7 +446,7 @@ print_octal_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
|
||||
cycle = (len * BITS_IN_BYTES) % BITS_IN_OCTAL;
|
||||
carry = 0;
|
||||
|
||||
fputs_filtered (local_octal_format_prefix (), stream);
|
||||
fputs_filtered ("0", stream);
|
||||
if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
|
||||
{
|
||||
for (p = valaddr;
|
||||
@ -698,7 +545,6 @@ print_octal_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
|
||||
}
|
||||
}
|
||||
|
||||
fputs_filtered (local_octal_format_suffix (), stream);
|
||||
}
|
||||
|
||||
/* VALADDR points to an integer of LEN bytes.
|
||||
@ -741,8 +587,6 @@ print_decimal_chars (struct ui_file *stream, unsigned char *valaddr,
|
||||
digits[i] = 0;
|
||||
}
|
||||
|
||||
fputs_filtered (local_decimal_format_prefix (), stream);
|
||||
|
||||
/* Ok, we have an unknown number of bytes of data to be printed in
|
||||
* decimal.
|
||||
*
|
||||
@ -837,8 +681,6 @@ print_decimal_chars (struct ui_file *stream, unsigned char *valaddr,
|
||||
fprintf_filtered (stream, "%1d", digits[i]);
|
||||
}
|
||||
xfree (digits);
|
||||
|
||||
fputs_filtered (local_decimal_format_suffix (), stream);
|
||||
}
|
||||
|
||||
/* VALADDR points to an integer of LEN bytes. Print it in hex on stream. */
|
||||
@ -850,7 +692,7 @@ print_hex_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
|
||||
|
||||
/* FIXME: We should be not printing leading zeroes in most cases. */
|
||||
|
||||
fputs_filtered (local_hex_format_prefix (), stream);
|
||||
fputs_filtered ("0x", stream);
|
||||
if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
|
||||
{
|
||||
for (p = valaddr;
|
||||
@ -869,7 +711,6 @@ print_hex_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
|
||||
fprintf_filtered (stream, "%02x", *p);
|
||||
}
|
||||
}
|
||||
fputs_filtered (local_hex_format_suffix (), stream);
|
||||
}
|
||||
|
||||
/* VALADDR points to a char integer of LEN bytes. Print it out in appropriate language form on stream.
|
||||
|
Reference in New Issue
Block a user