* c-lang.c (emit_char c_printchar c_printstr), c-lang.h (c_printstr)
ch-lang.c (chill_printstr chill_printchar) c-valprint.c (c_val_print) ch-valprint.c (chill_val_print) expprint.c (print_subexp) f-lang.c (f_printstr f_printchar emit_char) f-valprint.c (f_val_print) jv-lang.c (java_printchar java_emit_char) jv-valprint.c (java_value_print java_val_print) language.c (unk_lang_printchar unk_lang_printstr unk_lang_emit_char) language.h (struct language_defn LA_PRINT_STRING LA_EMIT_CHAR) m2-lang.c (m2_printstr m2_printchar emit_char) printcmd.c (print_formatted) scm-lang.c (scm_printstr) valprint.c (val_print_string) value.h (val_print_string): Add emit_char routines to language_desc struct to allow finer control over language specific character output issues. Add character width arg to printstr routines to allow handling of wchar_t/Unicode strings. Fix c_printstr to handle wide characters. Supply width argument to LA_PRINT_STRING and val_print_string. * jv-lang.c (java_object_type dynamics_objfile java_link_class_type get_dynamics_objfile get_java_object_type) jv-lang.h (get_java_object_type): Make lots of things static. * expprint.c (dump_prefix_expression dump_subexp): Move opcode name printing to common routine (op_name). * (dump_subexp): Add support for OP_SCOPE.
This commit is contained in:
parent
ecd41d25b9
commit
242c0d8180
16 changed files with 234 additions and 107 deletions
|
@ -1,3 +1,29 @@
|
|||
Fri Oct 2 19:42:31 1998 Stu Grossman <grossman@babylon-5.cygnus.com>
|
||||
|
||||
* c-lang.c (emit_char c_printchar c_printstr), c-lang.h (c_printstr)
|
||||
ch-lang.c (chill_printstr chill_printchar) c-valprint.c (c_val_print)
|
||||
ch-valprint.c (chill_val_print) expprint.c (print_subexp) f-lang.c
|
||||
(f_printstr f_printchar emit_char) f-valprint.c (f_val_print) jv-lang.c
|
||||
(java_printchar java_emit_char) jv-valprint.c (java_value_print
|
||||
java_val_print) language.c (unk_lang_printchar unk_lang_printstr
|
||||
unk_lang_emit_char) language.h (struct language_defn LA_PRINT_STRING
|
||||
LA_EMIT_CHAR) m2-lang.c (m2_printstr m2_printchar emit_char) printcmd.c
|
||||
(print_formatted) scm-lang.c (scm_printstr) valprint.c
|
||||
(val_print_string) value.h (val_print_string): Add emit_char routines
|
||||
to language_desc struct to allow finer control over language specific
|
||||
character output issues. Add character width arg to printstr routines
|
||||
to allow handling of wchar_t/Unicode strings. Fix c_printstr to handle
|
||||
wide characters. Supply width argument to LA_PRINT_STRING and
|
||||
val_print_string.
|
||||
|
||||
* jv-lang.c (java_object_type dynamics_objfile java_link_class_type
|
||||
get_dynamics_objfile get_java_object_type) jv-lang.h
|
||||
(get_java_object_type): Make lots of things static.
|
||||
|
||||
* expprint.c (dump_prefix_expression dump_subexp): Move opcode name
|
||||
printing to common routine (op_name).
|
||||
* (dump_subexp): Add support for OP_SCOPE.
|
||||
|
||||
Fri Oct 2 16:25:54 1998 Stan Shebs <shebs@andros.cygnus.com>
|
||||
|
||||
* configure.host (i[3456]86-*-windows): Remove, no longer used.
|
||||
|
|
39
gdb/c-lang.c
39
gdb/c-lang.c
|
@ -25,19 +25,18 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|||
#include "language.h"
|
||||
#include "c-lang.h"
|
||||
|
||||
static void emit_char PARAMS ((int, GDB_FILE *, int));
|
||||
static void c_emit_char PARAMS ((int c, GDB_FILE *stream, int quoter));
|
||||
|
||||
/* Print the character C on STREAM as part of the contents of a literal
|
||||
string whose delimiter is QUOTER. Note that that format for printing
|
||||
characters and strings is language specific. */
|
||||
|
||||
static void
|
||||
emit_char (c, stream, quoter)
|
||||
c_emit_char (c, stream, quoter)
|
||||
register int c;
|
||||
GDB_FILE *stream;
|
||||
int quoter;
|
||||
{
|
||||
|
||||
c &= 0xFF; /* Avoid sign bit follies */
|
||||
|
||||
if (PRINT_LITERAL_FORM (c))
|
||||
|
@ -85,21 +84,23 @@ c_printchar (c, stream)
|
|||
int c;
|
||||
GDB_FILE *stream;
|
||||
{
|
||||
fputs_filtered ("'", stream);
|
||||
emit_char (c, stream, '\'');
|
||||
fputs_filtered ("'", stream);
|
||||
fputc_filtered ('\'', stream);
|
||||
LA_EMIT_CHAR (c, stream, '\'');
|
||||
fputc_filtered ('\'', stream);
|
||||
}
|
||||
|
||||
/* Print the character string STRING, printing at most LENGTH characters.
|
||||
Printing stops early if the number hits print_max; repeat counts
|
||||
are printed as appropriate. Print ellipses at the end if we
|
||||
had to stop before printing LENGTH characters, or if FORCE_ELLIPSES. */
|
||||
LENGTH is -1 if the string is nul terminated. Each character is WIDTH bytes
|
||||
long. Printing stops early if the number hits print_max; repeat counts are
|
||||
printed as appropriate. Print ellipses at the end if we had to stop before
|
||||
printing LENGTH characters, or if FORCE_ELLIPSES. */
|
||||
|
||||
void
|
||||
c_printstr (stream, string, length, force_ellipses)
|
||||
c_printstr (stream, string, length, width, force_ellipses)
|
||||
GDB_FILE *stream;
|
||||
char *string;
|
||||
unsigned int length;
|
||||
int width;
|
||||
int force_ellipses;
|
||||
{
|
||||
register unsigned int i;
|
||||
|
@ -113,7 +114,9 @@ c_printstr (stream, string, length, force_ellipses)
|
|||
/* If the string was not truncated due to `set print elements', and
|
||||
the last byte of it is a null, we don't print that, in traditional C
|
||||
style. */
|
||||
if ((!force_ellipses) && length > 0 && string[length-1] == '\0')
|
||||
if (!force_ellipses
|
||||
&& length > 0
|
||||
&& extract_unsigned_integer (string + (length - 1) * width, width) == '\0')
|
||||
length--;
|
||||
|
||||
if (length == 0)
|
||||
|
@ -129,6 +132,7 @@ c_printstr (stream, string, length, force_ellipses)
|
|||
unsigned int rep1;
|
||||
/* Number of repetitions we have detected so far. */
|
||||
unsigned int reps;
|
||||
unsigned long current_char;
|
||||
|
||||
QUIT;
|
||||
|
||||
|
@ -138,9 +142,13 @@ c_printstr (stream, string, length, force_ellipses)
|
|||
need_comma = 0;
|
||||
}
|
||||
|
||||
current_char = extract_unsigned_integer (string + i * width, width);
|
||||
|
||||
rep1 = i + 1;
|
||||
reps = 1;
|
||||
while (rep1 < length && string[rep1] == string[i])
|
||||
while (rep1 < length
|
||||
&& extract_unsigned_integer (string + rep1 * width, width)
|
||||
== current_char)
|
||||
{
|
||||
++rep1;
|
||||
++reps;
|
||||
|
@ -156,7 +164,7 @@ c_printstr (stream, string, length, force_ellipses)
|
|||
fputs_filtered ("\", ", stream);
|
||||
in_quotes = 0;
|
||||
}
|
||||
c_printchar (string[i], stream);
|
||||
LA_PRINT_CHAR (current_char, stream);
|
||||
fprintf_filtered (stream, " <repeats %u times>", reps);
|
||||
i = rep1 - 1;
|
||||
things_printed += repeat_count_threshold;
|
||||
|
@ -172,7 +180,7 @@ c_printstr (stream, string, length, force_ellipses)
|
|||
fputs_filtered ("\"", stream);
|
||||
in_quotes = 1;
|
||||
}
|
||||
emit_char (string[i], stream, '"');
|
||||
LA_EMIT_CHAR (current_char, stream, '"');
|
||||
++things_printed;
|
||||
}
|
||||
}
|
||||
|
@ -404,6 +412,7 @@ const struct language_defn c_language_defn = {
|
|||
evaluate_subexp_standard,
|
||||
c_printchar, /* Print a character constant */
|
||||
c_printstr, /* Function to print string constant */
|
||||
c_emit_char, /* Print a single char */
|
||||
c_create_fundamental_type, /* Create fundamental type in this language */
|
||||
c_print_type, /* Print a type using appropriate syntax */
|
||||
c_val_print, /* Print a value using appropriate syntax */
|
||||
|
@ -430,6 +439,7 @@ const struct language_defn cplus_language_defn = {
|
|||
evaluate_subexp_standard,
|
||||
c_printchar, /* Print a character constant */
|
||||
c_printstr, /* Function to print string constant */
|
||||
c_emit_char, /* Print a single char */
|
||||
c_create_fundamental_type, /* Create fundamental type in this language */
|
||||
c_print_type, /* Print a type using appropriate syntax */
|
||||
c_val_print, /* Print a value using appropriate syntax */
|
||||
|
@ -456,6 +466,7 @@ const struct language_defn asm_language_defn = {
|
|||
evaluate_subexp_standard,
|
||||
c_printchar, /* Print a character constant */
|
||||
c_printstr, /* Function to print string constant */
|
||||
c_emit_char, /* Print a single char */
|
||||
c_create_fundamental_type, /* Create fundamental type in this language */
|
||||
c_print_type, /* Print a type using appropriate syntax */
|
||||
c_val_print, /* Print a value using appropriate syntax */
|
||||
|
|
|
@ -41,7 +41,9 @@ c_value_print PARAMS ((struct value *, GDB_FILE *, int, enum val_prettyprint));
|
|||
|
||||
extern void c_printchar PARAMS ((int, GDB_FILE*));
|
||||
|
||||
extern void c_printstr PARAMS ((GDB_FILE *, char *, unsigned int, int));
|
||||
extern void c_printstr PARAMS ((GDB_FILE *stream, char *string,
|
||||
unsigned int length, int width,
|
||||
int force_ellipses));
|
||||
|
||||
extern struct type * c_create_fundamental_type PARAMS ((struct objfile*, int));
|
||||
|
||||
|
|
|
@ -95,7 +95,7 @@ c_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
|
|||
len = temp_len;
|
||||
}
|
||||
|
||||
LA_PRINT_STRING (stream, valaddr, len, 0);
|
||||
LA_PRINT_STRING (stream, valaddr, len, eltlen, 0);
|
||||
i = len;
|
||||
}
|
||||
else
|
||||
|
@ -169,12 +169,14 @@ c_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
|
|||
|
||||
/* For a pointer to char or unsigned char, also print the string
|
||||
pointed to, unless pointer is null. */
|
||||
/* FIXME: need to handle wchar_t here... */
|
||||
|
||||
if (TYPE_LENGTH (elttype) == 1
|
||||
&& TYPE_CODE (elttype) == TYPE_CODE_INT
|
||||
&& (format == 0 || format == 's')
|
||||
&& addr != 0)
|
||||
{
|
||||
i = val_print_string (addr, 0, stream);
|
||||
i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream);
|
||||
}
|
||||
else if (cp_is_vtbl_member(type))
|
||||
{
|
||||
|
|
|
@ -42,7 +42,7 @@ static struct type *
|
|||
chill_create_fundamental_type PARAMS ((struct objfile *, int));
|
||||
|
||||
static void
|
||||
chill_printstr PARAMS ((GDB_FILE *, char *, unsigned int, int));
|
||||
chill_printstr PARAMS ((GDB_FILE *stream, char *string, unsigned int length, int width, int force_ellipses));
|
||||
|
||||
static void
|
||||
chill_printchar PARAMS ((int, GDB_FILE *));
|
||||
|
@ -111,10 +111,11 @@ chill_printchar (c, stream)
|
|||
*/
|
||||
|
||||
static void
|
||||
chill_printstr (stream, string, length, force_ellipses)
|
||||
chill_printstr (stream, string, length, width, force_ellipses)
|
||||
GDB_FILE *stream;
|
||||
char *string;
|
||||
unsigned int length;
|
||||
int width;
|
||||
int force_ellipses;
|
||||
{
|
||||
register unsigned int i;
|
||||
|
@ -628,6 +629,7 @@ const struct language_defn chill_language_defn = {
|
|||
evaluate_subexp_chill,
|
||||
chill_printchar, /* print a character constant */
|
||||
chill_printstr, /* function to print a string constant */
|
||||
NULL, /* Function to print a single char */
|
||||
chill_create_fundamental_type,/* Create fundamental type in this language */
|
||||
chill_print_type, /* Print a type using appropriate syntax */
|
||||
chill_val_print, /* Print a value using appropriate syntax */
|
||||
|
|
|
@ -329,9 +329,8 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
|
|||
&& /* If print_max is UINT_MAX, the alloca below will fail.
|
||||
In that case don't try to print the string. */
|
||||
print_max < UINT_MAX)
|
||||
{
|
||||
i = val_print_string (addr, 0, stream);
|
||||
}
|
||||
i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream);
|
||||
|
||||
/* Return number of characters printed, plus one for the
|
||||
terminating null if we have "reached the end". */
|
||||
return (i + (print_max && i != print_max));
|
||||
|
@ -339,7 +338,7 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
|
|||
|
||||
case TYPE_CODE_STRING:
|
||||
i = TYPE_LENGTH (type);
|
||||
LA_PRINT_STRING (stream, valaddr, i, 0);
|
||||
LA_PRINT_STRING (stream, valaddr, i, 1, 0);
|
||||
/* Return number of characters printed, plus one for the terminating
|
||||
null if we have "reached the end". */
|
||||
return (i + (print_max && i != print_max));
|
||||
|
@ -432,7 +431,7 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
|
|||
segfault. */
|
||||
return length;
|
||||
}
|
||||
LA_PRINT_STRING (stream, data_addr, length, 0);
|
||||
LA_PRINT_STRING (stream, data_addr, length, 1, 0);
|
||||
return length;
|
||||
default:
|
||||
break;
|
||||
|
|
18
gdb/f-lang.c
18
gdb/f-lang.c
|
@ -82,9 +82,9 @@ static void patch_common_entries PARAMS ((SAVED_F77_COMMON_PTR, CORE_ADDR, int))
|
|||
#endif
|
||||
|
||||
static struct type *f_create_fundamental_type PARAMS ((struct objfile *, int));
|
||||
static void f_printstr PARAMS ((FILE *, char *, unsigned int, int));
|
||||
static void f_printchar PARAMS ((int, FILE *));
|
||||
static void emit_char PARAMS ((int, FILE *, int));
|
||||
static void f_printstr PARAMS ((GDB_FILE *stream, char *string, unsigned int length, int width, int force_ellipses));
|
||||
static void f_printchar PARAMS ((int c, GDB_FILE *stream));
|
||||
static void f_emit_char PARAMS ((int c, GDB_FILE *stream, int quoter));
|
||||
|
||||
/* Print the character C on STREAM as part of the contents of a literal
|
||||
string whose delimiter is QUOTER. Note that that format for printing
|
||||
|
@ -93,9 +93,9 @@ static void emit_char PARAMS ((int, FILE *, int));
|
|||
be replaced with a true F77 version. */
|
||||
|
||||
static void
|
||||
emit_char (c, stream, quoter)
|
||||
f_emit_char (c, stream, quoter)
|
||||
register int c;
|
||||
FILE *stream;
|
||||
GDB_FILE *stream;
|
||||
int quoter;
|
||||
{
|
||||
c &= 0xFF; /* Avoid sign bit follies */
|
||||
|
@ -147,7 +147,7 @@ f_printchar (c, stream)
|
|||
FILE *stream;
|
||||
{
|
||||
fputs_filtered ("'", stream);
|
||||
emit_char (c, stream, '\'');
|
||||
LA_EMIT_CHAR (c, stream, '\'');
|
||||
fputs_filtered ("'", stream);
|
||||
}
|
||||
|
||||
|
@ -159,10 +159,11 @@ f_printchar (c, stream)
|
|||
be replaced with a true F77 version. */
|
||||
|
||||
static void
|
||||
f_printstr (stream, string, length, force_ellipses)
|
||||
f_printstr (stream, string, length, width, force_ellipses)
|
||||
FILE *stream;
|
||||
char *string;
|
||||
unsigned int length;
|
||||
int width;
|
||||
int force_ellipses;
|
||||
{
|
||||
register unsigned int i;
|
||||
|
@ -229,7 +230,7 @@ f_printstr (stream, string, length, force_ellipses)
|
|||
fputs_filtered ("'", stream);
|
||||
in_quotes = 1;
|
||||
}
|
||||
emit_char (string[i], stream, '"');
|
||||
LA_EMIT_CHAR (string[i], stream, '"');
|
||||
++things_printed;
|
||||
}
|
||||
}
|
||||
|
@ -470,6 +471,7 @@ const struct language_defn f_language_defn = {
|
|||
evaluate_subexp_standard,
|
||||
f_printchar, /* Print character constant */
|
||||
f_printstr, /* function to print string constant */
|
||||
f_emit_char, /* Function to print a single character */
|
||||
f_create_fundamental_type, /* Create fundamental type in this language */
|
||||
f_print_type, /* Print a type using appropriate syntax */
|
||||
f_val_print, /* Print a value using appropriate syntax */
|
||||
|
|
|
@ -392,7 +392,7 @@ f_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
|
|||
{
|
||||
case TYPE_CODE_STRING:
|
||||
f77_get_dynamic_length_of_aggregate (type);
|
||||
LA_PRINT_STRING (stream, valaddr, TYPE_LENGTH (type), 0);
|
||||
LA_PRINT_STRING (stream, valaddr, TYPE_LENGTH (type), 1, 0);
|
||||
break;
|
||||
|
||||
case TYPE_CODE_ARRAY:
|
||||
|
@ -434,7 +434,7 @@ f_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
|
|||
&& TYPE_CODE (elttype) == TYPE_CODE_INT
|
||||
&& (format == 0 || format == 's')
|
||||
&& addr != 0)
|
||||
i = val_print_string (addr, 0, stream);
|
||||
i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream);
|
||||
|
||||
/* Return number of characters printed, plus one for the
|
||||
terminating null if we have "reached the end". */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Java language support routines for GDB, the GNU debugger.
|
||||
Copyright 1997 Free Software Foundation, Inc.
|
||||
Copyright 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
|
@ -44,16 +44,17 @@ struct type *java_float_type;
|
|||
struct type *java_double_type;
|
||||
struct type *java_void_type;
|
||||
|
||||
struct type *java_object_type;
|
||||
static void java_emit_char PARAMS ((int c, GDB_FILE *stream, int quoter));
|
||||
|
||||
/* This objfile contains symtabs that have been dynamically created
|
||||
to record dynamically loaded Java classes and dynamically
|
||||
compiled java methods. */
|
||||
struct objfile *dynamics_objfile = NULL;
|
||||
|
||||
struct type *java_link_class_type PARAMS((struct type*, value_ptr));
|
||||
static struct objfile *dynamics_objfile = NULL;
|
||||
|
||||
struct objfile *
|
||||
static struct type *java_link_class_type PARAMS ((struct type *, value_ptr));
|
||||
|
||||
static struct objfile *
|
||||
get_dynamics_objfile ()
|
||||
{
|
||||
if (dynamics_objfile == NULL)
|
||||
|
@ -560,7 +561,9 @@ java_link_class_type (type, clas)
|
|||
return type;
|
||||
}
|
||||
|
||||
struct type*
|
||||
static struct type *java_object_type;
|
||||
|
||||
struct type *
|
||||
get_java_object_type ()
|
||||
{
|
||||
return java_object_type;
|
||||
|
@ -704,15 +707,16 @@ java_value_string (ptr, len)
|
|||
error ("not implemented - java_value_string"); /* FIXME */
|
||||
}
|
||||
|
||||
static void java_printchar PARAMS ((int c, GDB_FILE *stream));
|
||||
/* Print the character C on STREAM as part of the contents of a literal
|
||||
string whose delimiter is QUOTER. Note that that format for printing
|
||||
characters and strings is language specific. */
|
||||
|
||||
static void
|
||||
java_printchar (c, stream)
|
||||
java_emit_char (c, stream, quoter)
|
||||
int c;
|
||||
GDB_FILE *stream;
|
||||
int quoter;
|
||||
{
|
||||
fputc_filtered ('\'', stream);
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case '\\':
|
||||
|
@ -741,8 +745,6 @@ java_printchar (c, stream)
|
|||
fprintf_filtered (stream, "\\u%.4x", (unsigned int) c);
|
||||
break;
|
||||
}
|
||||
|
||||
fputc_filtered ('\'', stream);
|
||||
}
|
||||
|
||||
static value_ptr
|
||||
|
@ -929,8 +931,9 @@ const struct language_defn java_language_defn = {
|
|||
java_parse,
|
||||
java_error,
|
||||
evaluate_subexp_java,
|
||||
java_printchar, /* Print a character constant */
|
||||
c_printchar, /* Print a character constant */
|
||||
c_printstr, /* Function to print string constant */
|
||||
java_emit_char, /* Function to print a single character */
|
||||
java_create_fundamental_type, /* Create fundamental type in this language */
|
||||
java_print_type, /* Print a type using appropriate syntax */
|
||||
java_val_print, /* Print a value using appropriate syntax */
|
||||
|
|
|
@ -56,7 +56,7 @@ extern struct type *java_primitive_type PARAMS ((int));
|
|||
|
||||
extern struct type *java_array_type PARAMS ((struct type*, int));
|
||||
|
||||
extern struct type *get_java_object_type ();
|
||||
extern struct type *get_java_object_type PARAMS ((void));
|
||||
|
||||
extern struct type * java_lookup_class PARAMS((char *));
|
||||
|
||||
|
|
|
@ -149,6 +149,41 @@ java_value_print (val, stream, format, pretty)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* If it's type String, print it */
|
||||
|
||||
if (TYPE_CODE (type) == TYPE_CODE_PTR
|
||||
&& TYPE_TARGET_TYPE (type)
|
||||
&& TYPE_NAME (TYPE_TARGET_TYPE (type))
|
||||
&& strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "java.lang.String") == 0
|
||||
&& (format == 0 || format == 's')
|
||||
&& address != 0)
|
||||
{
|
||||
value_ptr data_val;
|
||||
CORE_ADDR data;
|
||||
value_ptr boffset_val;
|
||||
unsigned long boffset;
|
||||
value_ptr count_val;
|
||||
unsigned long count;
|
||||
value_ptr mark;
|
||||
|
||||
mark = value_mark (); /* Remember start of new values */
|
||||
|
||||
data_val = value_struct_elt (&val, NULL, "data", NULL, NULL);
|
||||
data = value_as_pointer (data_val);
|
||||
|
||||
boffset_val = value_struct_elt (&val, NULL, "boffset", NULL, NULL);
|
||||
boffset = value_as_pointer (boffset_val);
|
||||
|
||||
count_val = value_struct_elt (&val, NULL, "count", NULL, NULL);
|
||||
count = value_as_pointer (count_val);
|
||||
|
||||
value_free_to_mark (mark); /* Release unnecessary values */
|
||||
|
||||
val_print_string (data + boffset, count, 2, stream);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (val_print (type, VALUE_CONTENTS (val), address,
|
||||
stream, format, 1, 0, pretty));
|
||||
}
|
||||
|
@ -353,9 +388,22 @@ java_print_value_fields (type, valaddr, address, stream,
|
|||
fprintf_filtered (stream, "}");
|
||||
}
|
||||
|
||||
/* Print data of type TYPE located at VALADDR (within GDB), which came from
|
||||
the inferior at address ADDRESS, onto stdio stream STREAM according to
|
||||
FORMAT (a letter or 0 for natural format). The data at VALADDR is in
|
||||
target byte order.
|
||||
|
||||
If the data are a string pointer, returns the number of string characters
|
||||
printed.
|
||||
|
||||
If DEREF_REF is nonzero, then dereference references, otherwise just print
|
||||
them like pointers.
|
||||
|
||||
The PRETTY parameter controls prettyprinting. */
|
||||
|
||||
int
|
||||
java_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
|
||||
pretty)
|
||||
pretty)
|
||||
struct type *type;
|
||||
char *valaddr;
|
||||
CORE_ADDR address;
|
||||
|
@ -366,7 +414,7 @@ java_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
|
|||
enum val_prettyprint pretty;
|
||||
{
|
||||
register unsigned int i = 0; /* Number of characters printed */
|
||||
struct type *elttype;
|
||||
struct type *target_type;
|
||||
CORE_ADDR addr;
|
||||
|
||||
CHECK_TYPEDEF (type);
|
||||
|
@ -395,26 +443,23 @@ java_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
|
|||
fputs_filtered ("null", stream);
|
||||
return i;
|
||||
}
|
||||
elttype = check_typedef (TYPE_TARGET_TYPE (type));
|
||||
target_type = check_typedef (TYPE_TARGET_TYPE (type));
|
||||
|
||||
if (TYPE_CODE (target_type) == TYPE_CODE_FUNC)
|
||||
{
|
||||
print_unpacked_pointer:
|
||||
elttype = check_typedef (TYPE_TARGET_TYPE (type));
|
||||
|
||||
if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
|
||||
{
|
||||
/* Try to print what function it points to. */
|
||||
print_address_demangle (addr, stream, demangle);
|
||||
/* Return value is irrelevant except for string pointers. */
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (addressprint && format != 's')
|
||||
{
|
||||
fputs_filtered ("@", stream);
|
||||
print_longest (stream, 'x', 0, (ULONGEST) addr);
|
||||
}
|
||||
return i;
|
||||
/* Try to print what function it points to. */
|
||||
print_address_demangle (addr, stream, demangle);
|
||||
/* Return value is irrelevant except for string pointers. */
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (addressprint && format != 's')
|
||||
{
|
||||
fputs_filtered ("@", stream);
|
||||
print_longest (stream, 'x', 0, (ULONGEST) addr);
|
||||
}
|
||||
|
||||
return i;
|
||||
case TYPE_CODE_CHAR:
|
||||
format = format ? format : output_format;
|
||||
if (format)
|
||||
|
|
|
@ -84,10 +84,13 @@ static void
|
|||
set_type_range PARAMS ((void));
|
||||
|
||||
static void
|
||||
unk_lang_printchar PARAMS ((int, GDB_FILE *));
|
||||
unk_lang_emit_char PARAMS ((int c, GDB_FILE *stream, int quoter));
|
||||
|
||||
static void
|
||||
unk_lang_printstr PARAMS ((GDB_FILE *, char *, unsigned int, int));
|
||||
unk_lang_printchar PARAMS ((int c, GDB_FILE *stream));
|
||||
|
||||
static void
|
||||
unk_lang_printstr PARAMS ((GDB_FILE *stream, char *string, unsigned int length, int width, int force_ellipses));
|
||||
|
||||
static struct type *
|
||||
unk_lang_create_fundamental_type PARAMS ((struct objfile *, int));
|
||||
|
@ -1212,6 +1215,15 @@ unk_lang_error (msg)
|
|||
error ("Attempted to parse an expression with unknown language");
|
||||
}
|
||||
|
||||
static void
|
||||
unk_lang_emit_char (c, stream, quoter)
|
||||
register int c;
|
||||
GDB_FILE *stream;
|
||||
int quoter;
|
||||
{
|
||||
error ("internal error - unimplemented function unk_lang_emit_char called.");
|
||||
}
|
||||
|
||||
static void
|
||||
unk_lang_printchar (c, stream)
|
||||
register int c;
|
||||
|
@ -1221,10 +1233,11 @@ unk_lang_printchar (c, stream)
|
|||
}
|
||||
|
||||
static void
|
||||
unk_lang_printstr (stream, string, length, force_ellipses)
|
||||
unk_lang_printstr (stream, string, length, width, force_ellipses)
|
||||
GDB_FILE *stream;
|
||||
char *string;
|
||||
unsigned int length;
|
||||
int width;
|
||||
int force_ellipses;
|
||||
{
|
||||
error ("internal error - unimplemented function unk_lang_printstr called.");
|
||||
|
@ -1290,6 +1303,7 @@ const struct language_defn unknown_language_defn = {
|
|||
evaluate_subexp_standard,
|
||||
unk_lang_printchar, /* Print character constant */
|
||||
unk_lang_printstr,
|
||||
unk_lang_emit_char,
|
||||
unk_lang_create_fundamental_type,
|
||||
unk_lang_print_type, /* Print a type using appropriate syntax */
|
||||
unk_lang_val_print, /* Print a value using appropriate syntax */
|
||||
|
@ -1317,6 +1331,7 @@ const struct language_defn auto_language_defn = {
|
|||
evaluate_subexp_standard,
|
||||
unk_lang_printchar, /* Print character constant */
|
||||
unk_lang_printstr,
|
||||
unk_lang_emit_char,
|
||||
unk_lang_create_fundamental_type,
|
||||
unk_lang_print_type, /* Print a type using appropriate syntax */
|
||||
unk_lang_val_print, /* Print a value using appropriate syntax */
|
||||
|
@ -1343,6 +1358,7 @@ const struct language_defn local_language_defn = {
|
|||
evaluate_subexp_standard,
|
||||
unk_lang_printchar, /* Print character constant */
|
||||
unk_lang_printstr,
|
||||
unk_lang_emit_char,
|
||||
unk_lang_create_fundamental_type,
|
||||
unk_lang_print_type, /* Print a type using appropriate syntax */
|
||||
unk_lang_val_print, /* Print a value using appropriate syntax */
|
||||
|
|
|
@ -134,12 +134,16 @@ struct language_defn
|
|||
void (*la_error) PARAMS ((char *));
|
||||
|
||||
/* Evaluate an expression. */
|
||||
struct value * (*evaluate_exp) PARAMS ((struct type*, struct expression *,
|
||||
struct value * (*evaluate_exp) PARAMS ((struct type *, struct expression *,
|
||||
int *, enum noside));
|
||||
|
||||
void (*la_printchar) PARAMS ((int, GDB_FILE *));
|
||||
void (*la_printchar) PARAMS ((int ch, GDB_FILE *stream));
|
||||
|
||||
void (*la_printstr) PARAMS ((GDB_FILE *, char *, unsigned int, int));
|
||||
void (*la_printstr) PARAMS ((GDB_FILE *stream, char *string,
|
||||
unsigned int length, int width,
|
||||
int force_ellipses));
|
||||
|
||||
void (*la_emitchar) PARAMS ((int ch, GDB_FILE *stream, int quoter));
|
||||
|
||||
struct type *(*la_fund_type) PARAMS ((struct objfile *, int));
|
||||
|
||||
|
@ -309,8 +313,10 @@ set_language PARAMS ((enum language));
|
|||
|
||||
#define LA_PRINT_CHAR(ch, stream) \
|
||||
(current_language->la_printchar(ch, stream))
|
||||
#define LA_PRINT_STRING(stream, string, length, force_ellipses) \
|
||||
(current_language->la_printstr(stream, string, length, force_ellipses))
|
||||
#define LA_PRINT_STRING(stream, string, length, width, force_ellipses) \
|
||||
(current_language->la_printstr(stream, string, length, width, force_ellipses))
|
||||
#define LA_EMIT_CHAR(ch, stream, quoter) \
|
||||
(current_language->la_emitchar(ch, stream, quoter))
|
||||
|
||||
/* Test a character to decide whether it can be printed in literal form
|
||||
or needs to be printed in another representation. For example,
|
||||
|
|
|
@ -27,9 +27,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|||
#include "c-lang.h"
|
||||
|
||||
static struct type *m2_create_fundamental_type PARAMS ((struct objfile *, int));
|
||||
static void m2_printstr PARAMS ((GDB_FILE *, char *, unsigned int, int));
|
||||
static void m2_printstr PARAMS ((GDB_FILE *stream, char *string, unsigned int length, int width, int force_ellipses));
|
||||
static void m2_printchar PARAMS ((int, GDB_FILE *));
|
||||
static void emit_char PARAMS ((int, GDB_FILE *, int));
|
||||
static void m2_emit_char PARAMS ((int, GDB_FILE *, int));
|
||||
|
||||
/* Print the character C on STREAM as part of the contents of a literal
|
||||
string whose delimiter is QUOTER. Note that that format for printing
|
||||
|
@ -39,7 +39,7 @@ static void emit_char PARAMS ((int, GDB_FILE *, int));
|
|||
*/
|
||||
|
||||
static void
|
||||
emit_char (c, stream, quoter)
|
||||
m2_emit_char (c, stream, quoter)
|
||||
register int c;
|
||||
GDB_FILE *stream;
|
||||
int quoter;
|
||||
|
@ -96,7 +96,7 @@ m2_printchar (c, stream)
|
|||
GDB_FILE *stream;
|
||||
{
|
||||
fputs_filtered ("'", stream);
|
||||
emit_char (c, stream, '\'');
|
||||
LA_EMIT_CHAR (c, stream, '\'');
|
||||
fputs_filtered ("'", stream);
|
||||
}
|
||||
|
||||
|
@ -108,10 +108,11 @@ m2_printchar (c, stream)
|
|||
be replaced with a true Modula version. */
|
||||
|
||||
static void
|
||||
m2_printstr (stream, string, length, force_ellipses)
|
||||
m2_printstr (stream, string, length, width, force_ellipses)
|
||||
GDB_FILE *stream;
|
||||
char *string;
|
||||
unsigned int length;
|
||||
int width;
|
||||
int force_ellipses;
|
||||
{
|
||||
register unsigned int i;
|
||||
|
@ -178,7 +179,7 @@ m2_printstr (stream, string, length, force_ellipses)
|
|||
fputs_filtered ("\"", stream);
|
||||
in_quotes = 1;
|
||||
}
|
||||
emit_char (string[i], stream, '"');
|
||||
LA_EMIT_CHAR (string[i], stream, '"');
|
||||
++things_printed;
|
||||
}
|
||||
}
|
||||
|
@ -424,6 +425,7 @@ const struct language_defn m2_language_defn = {
|
|||
evaluate_subexp_standard,
|
||||
m2_printchar, /* Print character constant */
|
||||
m2_printstr, /* function to print string constant */
|
||||
m2_emit_char, /* Function to print a single character */
|
||||
m2_create_fundamental_type, /* Create fundamental type in this language */
|
||||
m2_print_type, /* Print a type using appropriate syntax */
|
||||
m2_val_print, /* Print a value using appropriate syntax */
|
||||
|
|
|
@ -293,8 +293,9 @@ print_formatted (val, format, size)
|
|||
switch (format)
|
||||
{
|
||||
case 's':
|
||||
/* FIXME: Need to handle wchar_t's here... */
|
||||
next_address = VALUE_ADDRESS (val)
|
||||
+ val_print_string (VALUE_ADDRESS (val), 0, gdb_stdout);
|
||||
+ val_print_string (VALUE_ADDRESS (val), -1, 1, gdb_stdout);
|
||||
next_section = VALUE_BFD_SECTION (val);
|
||||
break;
|
||||
|
||||
|
@ -688,6 +689,8 @@ print_address_demangle (addr, stream, do_demangle)
|
|||
/* These are the types that $__ will get after an examine command of one
|
||||
of these sizes. */
|
||||
|
||||
static struct type *examine_i_type;
|
||||
|
||||
static struct type *examine_b_type;
|
||||
static struct type *examine_h_type;
|
||||
static struct type *examine_w_type;
|
||||
|
@ -720,7 +723,9 @@ do_examine (fmt, addr, sect)
|
|||
if (format == 's' || format == 'i')
|
||||
size = 'b';
|
||||
|
||||
if (size == 'b')
|
||||
if (format == 'i')
|
||||
val_type = examine_i_type;
|
||||
else if (size == 'b')
|
||||
val_type = examine_b_type;
|
||||
else if (size == 'h')
|
||||
val_type = examine_h_type;
|
||||
|
@ -753,7 +758,16 @@ do_examine (fmt, addr, sect)
|
|||
/* Note that print_formatted sets next_address for the next
|
||||
object. */
|
||||
last_examine_address = next_address;
|
||||
last_examine_value = value_at (val_type, next_address, sect);
|
||||
/* The value to be displayed is not fetched greedily.
|
||||
Instead, to avoid the posibility of a fetched value not
|
||||
being used, its retreval is delayed until the print code
|
||||
uses it. When examining an instruction stream, the
|
||||
disassembler will perform its own memory fetch using just
|
||||
the address stored in LAST_EXAMINE_VALUE. FIXME: Should
|
||||
the disassembler be modified so that LAST_EXAMINE_VALUE
|
||||
is left with the byte sequence from the last complete
|
||||
instruction fetched from memory? */
|
||||
last_examine_value = value_at_lazy (val_type, next_address, sect);
|
||||
print_formatted (last_examine_value, format, size);
|
||||
}
|
||||
printf_filtered ("\n");
|
||||
|
@ -1261,7 +1275,13 @@ x_command (exp, from_tty)
|
|||
(LONGEST) last_examine_address));
|
||||
|
||||
/* Make contents of last address examined available to the user as $__.*/
|
||||
set_internalvar (lookup_internalvar ("__"), last_examine_value);
|
||||
/* If the last value has not been fetched from memory then don't
|
||||
fetch it now - instead mark it by voiding the $__ variable. */
|
||||
if (VALUE_LAZY (last_examine_value))
|
||||
set_internalvar (lookup_internalvar ("__"),
|
||||
allocate_value (builtin_type_void));
|
||||
else
|
||||
set_internalvar (lookup_internalvar ("__"), last_examine_value);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2190,7 +2210,6 @@ disassemble_command (arg, from_tty)
|
|||
if (find_pc_partial_function (pc, &name, &low, &high) == 0)
|
||||
error ("No function contains program counter for selected frame.\n");
|
||||
low += FUNCTION_START_OFFSET;
|
||||
high -= 1;
|
||||
}
|
||||
else if (!(space_index = (char *) strchr (arg, ' ')))
|
||||
{
|
||||
|
@ -2199,20 +2218,6 @@ disassemble_command (arg, from_tty)
|
|||
if (find_pc_partial_function (pc, &name, &low, &high) == 0)
|
||||
error ("No function contains specified address.\n");
|
||||
low += FUNCTION_START_OFFSET;
|
||||
high -= 1;
|
||||
if (overlay_debugging)
|
||||
{
|
||||
section = find_pc_overlay (pc);
|
||||
if (pc_in_unmapped_range (pc, section))
|
||||
{
|
||||
/* find_pc_partial_function will have returned low and high
|
||||
relative to the symbolic (mapped) address range. Need to
|
||||
translate them back to the unmapped range where PC is. */
|
||||
|
||||
low = overlay_unmapped_address (low, section);
|
||||
high = overlay_unmapped_address (high, section);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2220,7 +2225,6 @@ disassemble_command (arg, from_tty)
|
|||
*space_index = '\0';
|
||||
low = parse_and_eval_address (arg);
|
||||
high = parse_and_eval_address (space_index + 1);
|
||||
high -= 1;
|
||||
}
|
||||
|
||||
printf_filtered ("Dump of assembler code ");
|
||||
|
@ -2246,7 +2250,7 @@ disassemble_command (arg, from_tty)
|
|||
pc_masked = pc;
|
||||
#endif
|
||||
|
||||
while (pc_masked <= high)
|
||||
while (pc_masked < high)
|
||||
{
|
||||
QUIT;
|
||||
print_address (pc_masked, gdb_stdout);
|
||||
|
@ -2442,6 +2446,11 @@ environment, the value is printed in its own window.");
|
|||
&setprintlist),
|
||||
&showprintlist);
|
||||
|
||||
/* For examine/instruction a single byte quantity is specified as
|
||||
the data. This avoids problems with value_at_lazy() requiring a
|
||||
valid data type (and rejecting VOID). */
|
||||
examine_i_type = init_type (TYPE_CODE_INT, 1, 0, "examine_i_type", NULL);
|
||||
|
||||
examine_b_type = init_type (TYPE_CODE_INT, 1, 0, "examine_b_type", NULL);
|
||||
examine_h_type = init_type (TYPE_CODE_INT, 2, 0, "examine_h_type", NULL);
|
||||
examine_w_type = init_type (TYPE_CODE_INT, 4, 0, "examine_w_type", NULL);
|
||||
|
|
|
@ -34,7 +34,7 @@ static value_ptr evaluate_subexp_scm PARAMS ((struct type *, struct expression *
|
|||
int *, enum noside));
|
||||
static value_ptr scm_lookup_name PARAMS ((char *));
|
||||
static int in_eval_c PARAMS ((void));
|
||||
static void scm_printstr PARAMS ((GDB_FILE *, char *, unsigned int, int));
|
||||
static void scm_printstr PARAMS ((GDB_FILE *stream, char *string, unsigned int length, int width, int force_ellipses));
|
||||
|
||||
extern struct type ** CONST_PTR (c_builtin_types[]);
|
||||
|
||||
|
@ -49,10 +49,11 @@ scm_printchar (c, stream)
|
|||
}
|
||||
|
||||
static void
|
||||
scm_printstr (stream, string, length, force_ellipses)
|
||||
scm_printstr (stream, string, length, width, force_ellipses)
|
||||
GDB_FILE *stream;
|
||||
char *string;
|
||||
unsigned int length;
|
||||
int width;
|
||||
int force_ellipses;
|
||||
{
|
||||
fprintf_filtered (stream, "\"%s\"", string);
|
||||
|
@ -245,9 +246,10 @@ const struct language_defn scm_language_defn = {
|
|||
scm_parse,
|
||||
c_error,
|
||||
evaluate_subexp_scm,
|
||||
scm_printchar, /* Print a character constant */
|
||||
scm_printchar, /* Print a character constant */
|
||||
scm_printstr, /* Function to print string constant */
|
||||
NULL, /* Create fundamental type in this language */
|
||||
NULL, /* Function to print a single character */
|
||||
NULL, /* Create fundamental type in this language */
|
||||
c_print_type, /* Print a type using appropriate syntax */
|
||||
scm_val_print, /* Print a value using appropriate syntax */
|
||||
scm_value_print, /* Print a top-level value */
|
||||
|
|
Loading…
Reference in a new issue