* ch-exp.y: Remove ambiguities. Fix or add support for

UNOP_IND, UNOP_CAST, UNOP_ADDR, STRUCOP_STRUCT, OP_TYPE.
	* ch-typeprint.c (chill_print_type):  Move support
	for TYPE_CODE_ARRAY and TYPE_CODE_STRING from here ...
	* ch-typeprint.c (chill_type_print_base): ... here.
	* ch-typeprint.c (chill_type_print_base):  Improve
	support for PTR, REF, and FUNC types.
	* ch-valprint.c:  Prefer H'%x format to 0x%s.
	* ch-valprint.c (chill_val_print):  Add support for printing
	TYPE_CODE_REF (return for LOC parameters and variables).
	Use c_val_print to print random types (including ENUM).
	* ch-valprint,c (chill_print_value_fields):  Make
	output look more like Chill tuples.
	* stabsread.c (read_struct_type):  Factor common code.
This commit is contained in:
Per Bothner
1993-04-07 22:15:48 +00:00
parent bee218aaac
commit 8a177da658
5 changed files with 152 additions and 104 deletions

View File

@ -1,3 +1,20 @@
Tue Apr 6 00:24:32 1993 Per Bothner (bothner@rtl.cygnus.com)
* ch-exp.y: Remove ambiguities. Fix or add support for
UNOP_IND, UNOP_CAST, UNOP_ADDR, STRUCOP_STRUCT, OP_TYPE.
* ch-typeprint.c (chill_print_type): Move support
for TYPE_CODE_ARRAY and TYPE_CODE_STRING from here ...
* ch-typeprint.c (chill_type_print_base): ... here.
* ch-typeprint.c (chill_type_print_base): Improve
support for PTR, REF, and FUNC types.
* ch-valprint.c: Prefer H'%x format to 0x%s.
* ch-valprint.c (chill_val_print): Add support for printing
TYPE_CODE_REF (return for LOC parameters and variables).
Use c_val_print to print random types (including ENUM).
* ch-valprint,c (chill_print_value_fields): Make
output look more like Chill tuples.
* stabsread.c (read_struct_type): Factor common code.
Wed Apr 7 11:22:43 1993 Fred Fish (fnf@cygnus.com) Wed Apr 7 11:22:43 1993 Fred Fish (fnf@cygnus.com)
* sparclite/Makefile.in: Add dummy mostlyclean, clean, * sparclite/Makefile.in: Add dummy mostlyclean, clean,

View File

@ -181,6 +181,8 @@ yyerror PARAMS ((char *));
%token <voidval> EMPTINESS_LITERAL %token <voidval> EMPTINESS_LITERAL
%token <sval> CHARACTER_STRING_LITERAL %token <sval> CHARACTER_STRING_LITERAL
%token <sval> BIT_STRING_LITERAL %token <sval> BIT_STRING_LITERAL
%token <tsym> TYPENAME
%token <sval> FIELD_NAME
%token <voidval> '.' %token <voidval> '.'
%token <voidval> ';' %token <voidval> ';'
@ -291,11 +293,9 @@ yyerror PARAMS ((char *));
%type <voidval> upper_element %type <voidval> upper_element
%type <voidval> first_element %type <voidval> first_element
%type <voidval> structure_primitive_value %type <voidval> structure_primitive_value
%type <voidval> field_name
%type <voidval> mode_argument %type <voidval> mode_argument
%type <voidval> upper_lower_argument %type <voidval> upper_lower_argument
%type <voidval> length_argument %type <voidval> length_argument
%type <voidval> mode_name
%type <voidval> array_mode_name %type <voidval> array_mode_name
%type <voidval> string_mode_name %type <voidval> string_mode_name
%type <voidval> variant_structure_mode_name %type <voidval> variant_structure_mode_name
@ -304,13 +304,20 @@ yyerror PARAMS ((char *));
%type <voidval> subexpression %type <voidval> subexpression
%type <voidval> case_label_specification %type <voidval> case_label_specification
%type <voidval> buffer_location %type <voidval> buffer_location
%type <voidval> single_assignment_action %type <voidval> single_assignment_action
%type <tsym> mode_name
%% %%
/* Z.200, 5.3.1 */ /* Z.200, 5.3.1 */
start : value
| mode_name
{ write_exp_elt_opcode(OP_TYPE);
write_exp_elt_type($1.type);
write_exp_elt_opcode(OP_TYPE);}
;
value : expression value : expression
{ {
$$ = 0; /* FIXME */ $$ = 0; /* FIXME */
@ -333,9 +340,9 @@ location : access_name
{ {
$$ = 0; /* FIXME */ $$ = 0; /* FIXME */
} }
| FIXME_02 | primitive_value POINTER
{ {
$$ = 0; /* FIXME */ write_exp_elt_opcode (UNOP_IND);
} }
; ;
@ -588,9 +595,10 @@ value_array_slice: array_primitive_value '(' lower_element ':' upper_element ')'
/* Z.200, 5.2.10 */ /* Z.200, 5.2.10 */
value_structure_field: structure_primitive_value '.' field_name value_structure_field: primitive_value FIELD_NAME
{ { write_exp_elt_opcode (STRUCTOP_STRUCT);
$$ = 0; /* FIXME */ write_exp_string ($2);
write_exp_elt_opcode (STRUCTOP_STRUCT);
} }
; ;
@ -598,7 +606,9 @@ value_structure_field: structure_primitive_value '.' field_name
expression_conversion: mode_name parenthesised_expression expression_conversion: mode_name parenthesised_expression
{ {
$$ = 0; /* FIXME */ write_exp_elt_opcode (UNOP_CAST);
write_exp_elt_type ($1.type);
write_exp_elt_opcode (UNOP_CAST);
} }
; ;
@ -648,6 +658,10 @@ expression : operand_0
{ {
$$ = 0; /* FIXME */ $$ = 0; /* FIXME */
} }
| single_assignment_action
{
$$ = 0; /* FIXME */
}
| conditional_expression | conditional_expression
{ {
$$ = 0; /* FIXME */ $$ = 0; /* FIXME */
@ -710,10 +724,6 @@ operand_0 : operand_1
{ {
write_exp_elt_opcode (BINOP_BITWISE_XOR); write_exp_elt_opcode (BINOP_BITWISE_XOR);
} }
| single_assignment_action
{
$$ = 0; /* FIXME */
}
; ;
/* Z.200, 5.3.4 */ /* Z.200, 5.3.4 */
@ -814,8 +824,6 @@ operand_4 : operand_5
; ;
/* Z.200, 5.3.8 */ /* Z.200, 5.3.8 */
/* Note that we accept any expression for BINOP_CONCAT, not just
integer literal expressions. (FIXME?) */
operand_5 : operand_6 operand_5 : operand_6
{ {
@ -829,7 +837,9 @@ operand_5 : operand_6
{ {
write_exp_elt_opcode (UNOP_LOGICAL_NOT); write_exp_elt_opcode (UNOP_LOGICAL_NOT);
} }
| parenthesised_expression operand_6 | parenthesised_expression CHARACTER_STRING_LITERAL
/* We require the string operand to be a literal, to avoid some
nasty parsing ambiguities. */
{ {
write_exp_elt_opcode (BINOP_CONCAT); write_exp_elt_opcode (BINOP_CONCAT);
} }
@ -839,7 +849,7 @@ operand_5 : operand_6
operand_6 : POINTER location operand_6 : POINTER location
{ {
$$ = 0; /* FIXME */ write_exp_elt_opcode (UNOP_ADDR);
} }
| RECEIVE buffer_location | RECEIVE buffer_location
{ {
@ -932,11 +942,10 @@ mode_argument : mode_name
} }
; ;
upper_lower_argument : location mode_name : TYPENAME
{ ;
$$ = 0; /* FIXME */
} upper_lower_argument : expression
| expression
{ {
$$ = 0; /* FIXME */ $$ = 0; /* FIXME */
} }
@ -946,11 +955,7 @@ upper_lower_argument : location
} }
; ;
length_argument : location length_argument : expression
{
$$ = 0; /* FIXME */
}
| expression
{ {
$$ = 0; /* FIXME */ $$ = 0; /* FIXME */
} }
@ -983,8 +988,6 @@ lower_element : FIXME_20 { $$ = 0; }
upper_element : FIXME_21 { $$ = 0; } upper_element : FIXME_21 { $$ = 0; }
first_element : FIXME_22 { $$ = 0; } first_element : FIXME_22 { $$ = 0; }
structure_primitive_value: FIXME_23 { $$ = 0; } structure_primitive_value: FIXME_23 { $$ = 0; }
field_name : FIXME_24 { $$ = 0; }
mode_name : FIXME_25 { $$ = 0; }
boolean_expression : FIXME_26 { $$ = 0; } boolean_expression : FIXME_26 { $$ = 0; }
case_selector_list : FIXME_27 { $$ = 0; } case_selector_list : FIXME_27 { $$ = 0; }
subexpression : FIXME_28 { $$ = 0; } subexpression : FIXME_28 { $$ = 0; }
@ -1762,6 +1765,7 @@ static const struct token tokentab2[] =
{ {
{ ":=", GDB_ASSIGNMENT }, { ":=", GDB_ASSIGNMENT },
{ "//", SLASH_SLASH }, { "//", SLASH_SLASH },
{ "->", POINTER },
{ "/=", NOTEQUAL }, { "/=", NOTEQUAL },
{ "<=", LEQ }, { "<=", LEQ },
{ ">=", GTR }, { ">=", GTR },
@ -1797,7 +1801,6 @@ yylex ()
case ';': case ';':
case '!': case '!':
case '+': case '+':
case '-':
case '*': case '*':
case '(': case '(':
case ')': case ')':
@ -1896,6 +1899,7 @@ yylex ()
would already have found it. */ would already have found it. */
switch (*lexptr) switch (*lexptr)
{ {
case '-':
case ':': case ':':
case '/': case '/':
case '<': case '<':
@ -1976,8 +1980,10 @@ yylex ()
case LOC_LABEL: case LOC_LABEL:
return (LOCATION_NAME); return (LOCATION_NAME);
break; break;
case LOC_UNDEF:
case LOC_TYPEDEF: case LOC_TYPEDEF:
yylval.tsym.type = SYMBOL_TYPE (sym);
return TYPENAME;
case LOC_UNDEF:
case LOC_CONST_BYTES: case LOC_CONST_BYTES:
case LOC_OPTIMIZED_OUT: case LOC_OPTIMIZED_OUT:
error ("Symbol \"%s\" names no location.", simplename); error ("Symbol \"%s\" names no location.", simplename);
@ -2000,7 +2006,12 @@ yylex ()
switch (*lexptr) switch (*lexptr)
{ {
case '.': /* Not float for example. */ case '.': /* Not float for example. */
return (*lexptr++); lexptr++;
while (isspace (*lexptr)) lexptr++;
simplename = match_simple_name_string ();
if (!simplename)
return '.';
return FIELD_NAME;
} }
return (ILLEGAL_TOKEN); return (ILLEGAL_TOKEN);

View File

@ -46,44 +46,12 @@ chill_print_type (type, varstring, stream, show, level)
int show; int show;
int level; int level;
{ {
struct type *index_type;
struct type *range_type;
LONGEST low_bound;
LONGEST high_bound;
if (varstring != NULL && *varstring != '\0') if (varstring != NULL && *varstring != '\0')
{ {
fputs_filtered (varstring, stream); fputs_filtered (varstring, stream);
fputs_filtered (" ", stream); fputs_filtered (" ", stream);
} }
switch (TYPE_CODE (type)) chill_type_print_base (type, stream, show, level);
{
case TYPE_CODE_ARRAY:
range_type = TYPE_FIELD_TYPE (type, 0);
index_type = TYPE_TARGET_TYPE (range_type);
low_bound = TYPE_FIELD_BITPOS (range_type, 0);
high_bound = TYPE_FIELD_BITPOS (range_type, 1);
fputs_filtered ("array (", stream);
print_type_scalar (index_type, low_bound, stream);
fputs_filtered (":", stream);
print_type_scalar (index_type, high_bound, stream);
fputs_filtered (") ", stream);
chill_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
break;
case TYPE_CODE_STRING:
range_type = TYPE_FIELD_TYPE (type, 0);
index_type = TYPE_TARGET_TYPE (range_type);
high_bound = TYPE_FIELD_BITPOS (range_type, 1);
fputs_filtered ("CHAR (", stream);
print_type_scalar (index_type, high_bound + 1, stream);
fputs_filtered (")", stream);
break;
default:
chill_type_print_base (type, stream, show, level);
break;
}
} }
/* Print the name of the type (or the ultimate pointer target, /* Print the name of the type (or the ultimate pointer target,
@ -108,6 +76,10 @@ chill_type_print_base (type, stream, show, level)
char *name; char *name;
register int len; register int len;
register int i; register int i;
struct type *index_type;
struct type *range_type;
LONGEST low_bound;
LONGEST high_bound;
QUIT; QUIT;
@ -129,11 +101,48 @@ chill_type_print_base (type, stream, show, level)
switch (TYPE_CODE (type)) switch (TYPE_CODE (type))
{ {
case TYPE_CODE_ARRAY:
case TYPE_CODE_PTR: case TYPE_CODE_PTR:
if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID)
{
fprintf_filtered (stream, "PTR");
break;
}
fprintf_filtered (stream, "REF ");
chill_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
break;
case TYPE_CODE_ARRAY:
range_type = TYPE_FIELD_TYPE (type, 0);
index_type = TYPE_TARGET_TYPE (range_type);
low_bound = TYPE_FIELD_BITPOS (range_type, 0);
high_bound = TYPE_FIELD_BITPOS (range_type, 1);
fputs_filtered ("ARRAY (", stream);
print_type_scalar (index_type, low_bound, stream);
fputs_filtered (":", stream);
print_type_scalar (index_type, high_bound, stream);
fputs_filtered (") ", stream);
chill_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
break;
case TYPE_CODE_STRING:
range_type = TYPE_FIELD_TYPE (type, 0);
index_type = TYPE_TARGET_TYPE (range_type);
high_bound = TYPE_FIELD_BITPOS (range_type, 1);
fputs_filtered ("CHAR (", stream);
print_type_scalar (index_type, high_bound + 1, stream);
fputs_filtered (")", stream);
break;
case TYPE_CODE_MEMBER: case TYPE_CODE_MEMBER:
fprintf_filtered (stream, "MEMBER ");
chill_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
break;
case TYPE_CODE_REF: case TYPE_CODE_REF:
fprintf_filtered (stream, "/*LOC*/ ");
chill_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
break;
case TYPE_CODE_FUNC: case TYPE_CODE_FUNC:
fprintf_filtered (stream, "PROC (?)");
chill_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level); chill_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
break; break;

View File

@ -157,7 +157,7 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
} }
if (addressprint && format != 's') if (addressprint && format != 's')
{ {
fprintf_filtered (stream, "0x%x", addr); fprintf_filtered (stream, "H'%x", addr);
} }
/* For a pointer to char or unsigned char, also print the string /* For a pointer to char or unsigned char, also print the string
@ -185,7 +185,7 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
} }
if (addressprint && format != 's') if (addressprint && format != 's')
{ {
fprintf_filtered (stream, "0x%x ", addr); fprintf_filtered (stream, "H'%x ", addr);
} }
i = TYPE_LENGTH (type); i = TYPE_LENGTH (type);
LA_PRINT_STRING (stream, valaddr, i, 0); LA_PRINT_STRING (stream, valaddr, i, 0);
@ -199,20 +199,50 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
0); 0);
break; break;
case TYPE_CODE_MEMBER:
case TYPE_CODE_REF: case TYPE_CODE_REF:
case TYPE_CODE_UNION: if (addressprint)
{
fprintf_filtered (stream, "LOC(H'%lx)",
unpack_long (builtin_type_int, valaddr));
if (deref_ref)
fputs_filtered (": ", stream);
}
/* De-reference the reference. */
if (deref_ref)
{
if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_UNDEF)
{
value deref_val =
value_at
(TYPE_TARGET_TYPE (type),
unpack_pointer (lookup_pointer_type (builtin_type_void),
valaddr));
val_print (VALUE_TYPE (deref_val),
VALUE_CONTENTS (deref_val),
VALUE_ADDRESS (deref_val), stream, format,
deref_ref, recurse + 1, pretty);
}
else
fputs_filtered ("???", stream);
}
break;
case TYPE_CODE_ENUM: case TYPE_CODE_ENUM:
c_val_print (type, valaddr, address, stream, format,
deref_ref, recurse, pretty);
break;
case TYPE_CODE_MEMBER:
case TYPE_CODE_UNION:
case TYPE_CODE_FUNC: case TYPE_CODE_FUNC:
case TYPE_CODE_VOID: case TYPE_CODE_VOID:
case TYPE_CODE_ERROR: case TYPE_CODE_ERROR:
case TYPE_CODE_RANGE: case TYPE_CODE_RANGE:
error ("Unimplemented chill_val_print support for type %d",
TYPE_CODE (type));
break;
default: default:
error ("Invalid Chill type code %d in symbol table.", TYPE_CODE (type)); /* Let's derfer printing to the C printer, rather than
print an error message. FIXME! */
c_val_print (type, valaddr, address, stream, format,
deref_ref, recurse, pretty);
} }
fflush (stream); fflush (stream);
return (0); return (0);
@ -243,7 +273,7 @@ chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
check_stub_type (type); check_stub_type (type);
fprintf_filtered (stream, "("); fprintf_filtered (stream, "[");
len = TYPE_NFIELDS (type); len = TYPE_NFIELDS (type);
if (len == 0) if (len == 0)
{ {
@ -267,9 +297,10 @@ chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
{ {
wrap_here (n_spaces (2 + 2 * recurse)); wrap_here (n_spaces (2 + 2 * recurse));
} }
fputs_filtered (".", stream);
fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i), fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
language_chill, DMGL_NO_OPTS); language_chill, DMGL_NO_OPTS);
fputs_filtered (" = ", stream); fputs_filtered (": ", stream);
if (TYPE_FIELD_PACKED (type, i)) if (TYPE_FIELD_PACKED (type, i))
{ {
value v; value v;
@ -295,6 +326,6 @@ chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
print_spaces_filtered (2 * recurse, stream); print_spaces_filtered (2 * recurse, stream);
} }
} }
fprintf_filtered (stream, ")"); fprintf_filtered (stream, "]");
} }

View File

@ -2370,32 +2370,12 @@ read_struct_type (pp, type, objfile)
member functions, attach them to the type, and then read any tilde member functions, attach them to the type, and then read any tilde
field (baseclass specifier for the class holding the main vtable). */ field (baseclass specifier for the class holding the main vtable). */
if (!read_baseclasses (&fi, pp, type, objfile)) if (!read_baseclasses (&fi, pp, type, objfile)
{ || !read_struct_fields (&fi, pp, type, objfile)
do_cleanups (back_to); || !attach_fields_to_type (&fi, type, objfile)
return (error_type (pp)); || !read_member_functions (&fi, pp, type, objfile)
} || !attach_fn_fields_to_type (&fi, type)
if (!read_struct_fields (&fi, pp, type, objfile)) || !read_tilde_fields (&fi, pp, type, objfile))
{
do_cleanups (back_to);
return (error_type (pp));
}
if (!attach_fields_to_type (&fi, type, objfile))
{
do_cleanups (back_to);
return (error_type (pp));
}
if (!read_member_functions (&fi, pp, type, objfile))
{
do_cleanups (back_to);
return (error_type (pp));
}
if (!attach_fn_fields_to_type (&fi, type))
{
do_cleanups (back_to);
return (error_type (pp));
}
if (!read_tilde_fields (&fi, pp, type, objfile))
{ {
do_cleanups (back_to); do_cleanups (back_to);
return (error_type (pp)); return (error_type (pp));