4 * Copyright (C) 2003 Transmeta Corp, all rights reserved.
6 * Print out results of parsing for debugging and testing.
21 #include "expression.h"
24 * Symbol type printout. The type system is by far the most
25 * complicated part of C - everything else is trivial.
27 const char *modifier_string(unsigned long mod
)
29 static char buffer
[100];
31 const char *res
,**ptr
, *names
[] = {
32 "auto", "register", "static", "extern",
33 "const", "volatile", "[signed]", "[unsigned]",
34 "[char]", "[short]", "[long]", "[long]",
35 "[typdef]", "[structof]", "[unionof]", "[enum]",
36 "[typeof]", "[attribute]", "inline", "[addressable]",
37 "[nocast]", "[noderef]",
41 while ((res
= *ptr
++) != NULL
) {
44 while ((c
= *res
++) != '\0')
54 void show_struct_member(struct symbol
*sym
, void *data
, int flags
)
56 if (flags
& ITERATE_FIRST
)
58 printf("%s:%d:%ld at offset %ld", show_ident(sym
->ident
), sym
->bit_size
, sym
->ctype
.alignment
, sym
->offset
);
60 printf("[%d..%d]", sym
->bit_offset
, sym
->bit_offset
+sym
->fieldwidth
-1);
61 if (flags
& ITERATE_LAST
)
67 static void show_one_symbol(struct symbol
*sym
, void *sep
, int flags
)
70 if (!(flags
& ITERATE_LAST
))
71 printf("%s", (const char *)sep
);
74 void show_symbol_list(struct symbol_list
*list
, const char *sep
)
76 symbol_iterate(list
, show_one_symbol
, (void *)sep
);
79 void show_type_list(struct symbol
*sym
)
92 static void prepend(struct type_name
*name
, const char *fmt
, ...)
94 static char buffer
[512];
99 n
= vsprintf(buffer
, fmt
, args
);
103 memcpy(name
->start
, buffer
, n
);
106 static void append(struct type_name
*name
, const char *fmt
, ...)
108 static char buffer
[512];
113 n
= vsprintf(buffer
, fmt
, args
);
116 memcpy(name
->end
, buffer
, n
);
120 static void do_show_type(struct symbol
*sym
, struct type_name
*name
)
124 static struct ctype_name
{
128 { & char_ctype
, "char" },
129 { &uchar_ctype
, "unsigned char" },
130 { & short_ctype
, "short" },
131 { &ushort_ctype
, "unsigned short" },
132 { & int_ctype
, "int" },
133 { &uint_ctype
, "unsigned int" },
134 { & long_ctype
, "long" },
135 { &ulong_ctype
, "unsigned long" },
136 { & llong_ctype
, "long long" },
137 { &ullong_ctype
, "unsigned long long" },
139 { &void_ctype
, "void" },
140 { &bool_ctype
, "bool" },
141 { &string_ctype
, "string" },
143 { &float_ctype
, "float" },
144 { &double_ctype
, "double" },
145 { &ldouble_ctype
,"long double" },
151 for (i
= 0; i
< sizeof(typenames
)/sizeof(typenames
[0]); i
++) {
152 if (typenames
[i
].sym
== sym
) {
153 int len
= strlen(typenames
[i
].name
);
154 *--name
->start
= ' ';
156 memcpy(name
->start
, typenames
[i
].name
, len
);
170 prepend(name
, "struct %s ", show_ident(sym
->ident
));
174 prepend(name
, "union %s ", show_ident(sym
->ident
));
178 prepend(name
, "enum %s ", show_ident(sym
->ident
));
182 append(name
, "%s", show_ident(sym
->ident
));
186 append(name
, ":%d", sym
->fieldwidth
);
190 append(name
, "label(%s:%p)", show_ident(sym
->ident
), sym
);
197 prepend(name
, "unknown type %d", sym
->type
);
201 mod
= modifier_string(sym
->ctype
.modifiers
);
202 modlen
= strlen(mod
);
203 name
->start
-= modlen
;
204 memcpy(name
->start
, mod
, modlen
);
206 do_show_type(sym
->ctype
.base_type
, name
);
210 append(name
, "<asn:%d>", sym
->ctype
.as
);
217 append(name
, " )( ... )");
221 append(name
, "[%d]", sym
->array_size
);
228 void show_type(struct symbol
*sym
)
231 struct type_name name
;
233 name
.start
= name
.end
= array
+100;
234 do_show_type(sym
, &name
);
236 printf("%s", name
.start
);
239 void show_symbol(struct symbol
*sym
)
244 type
= sym
->ctype
.base_type
;
249 * Show actual implementation information
251 switch (type
->type
) {
253 symbol_iterate(type
->symbol_list
, show_struct_member
, NULL
);
257 symbol_iterate(type
->symbol_list
, show_struct_member
, NULL
);
262 show_statement(type
->stmt
);
269 if (sym
->initializer
) {
271 show_expression(sym
->initializer
);
276 * Print out a statement
278 void show_statement(struct statement
*stmt
)
282 switch (stmt
->type
) {
285 show_expression(stmt
->expression
);
291 show_symbol_list(stmt
->syms
, "\n\t");
294 show_statement_list(stmt
->stmts
, ";\n");
297 case STMT_EXPRESSION
:
299 show_expression(stmt
->expression
);
303 show_expression(stmt
->if_conditional
);
305 show_statement(stmt
->if_true
);
306 if (stmt
->if_false
) {
308 show_statement(stmt
->if_false
);
312 printf("\tswitch (");
313 show_expression(stmt
->switch_expression
);
315 show_statement(stmt
->switch_statement
);
319 if (!stmt
->case_expression
)
323 show_expression(stmt
->case_expression
);
326 show_expression(stmt
->case_to
);
330 show_statement(stmt
->case_statement
);
337 case STMT_ITERATOR
: {
338 struct statement
*pre_statement
= stmt
->iterator_pre_statement
;
339 struct expression
*pre_condition
= stmt
->iterator_pre_condition
;
340 struct statement
*statement
= stmt
->iterator_statement
;
341 struct statement
*post_statement
= stmt
->iterator_post_statement
;
342 struct expression
*post_condition
= stmt
->iterator_post_condition
;
345 * THIS IS ONLY APPROXIMATE!
347 * Real iterators are more generic than
348 * any of for/while/do-while, and can't
349 * be printed out as C without goto's
351 if (post_statement
|| !post_condition
) {
353 show_statement(pre_statement
);
355 show_expression(pre_condition
);
357 show_statement(post_statement
);
359 show_statement(statement
);
360 } else if (pre_condition
) {
362 show_statement(pre_statement
);
366 show_expression(pre_condition
);
368 show_statement(statement
);
371 show_statement(pre_statement
);
375 show_statement(statement
);
377 show_expression(post_condition
);
387 printf("\tcontinue");
391 show_symbol(stmt
->label_identifier
);
393 show_statement(stmt
->label_statement
);
397 if (stmt
->goto_expression
) {
399 show_expression(stmt
->goto_expression
);
402 show_symbol(stmt
->goto_label
);
406 printf("\tasm( .... )");
412 static void show_one_statement(struct statement
*stmt
, void *sep
, int flags
)
414 show_statement(stmt
);
415 if (!(flags
& ITERATE_LAST
))
416 printf("%s", (const char *)sep
);
419 void show_statement_list(struct statement_list
*stmt
, const char *sep
)
421 statement_iterate(stmt
, show_one_statement
, (void *)sep
);
424 static void show_size(struct symbol
*sym
)
427 printf("%d:%ld", sym
->bit_size
, sym
->ctype
.alignment
);
430 static void show_one_expression(struct expression
*expr
, void *sep
, int flags
)
432 show_expression(expr
);
433 if (!(flags
& ITERATE_LAST
))
434 printf("%s", (const char *)sep
);
437 void show_expression_list(struct expression_list
*list
, const char *sep
)
439 expression_iterate(list
, show_one_expression
, (void *)sep
);
443 * Print out an expression
445 void show_expression(struct expression
*expr
)
451 show_size(expr
->ctype
);
452 show_type(expr
->ctype
);
454 switch (expr
->type
) {
456 show_expression(expr
->fn
);
458 show_expression_list(expr
->args
, ", ");
462 case EXPR_ASSIGNMENT
:
463 show_expression(expr
->left
);
464 printf(" %s ", show_special(expr
->op
));
465 show_expression(expr
->right
);
470 show_expression(expr
->left
);
471 printf(" %s ", show_special(expr
->op
));
472 show_expression(expr
->right
);
475 printf("%s<", show_special(expr
->op
));
476 show_expression(expr
->unop
);
480 show_expression(expr
->unop
);
481 printf(" %s ", show_special(expr
->op
));
484 show_type(expr
->symbol
);
487 show_expression(expr
->deref
);
488 printf("%s", show_special(expr
->op
));
489 printf("%s", show_ident(expr
->member
));
493 show_type(expr
->cast_type
);
495 show_expression(expr
->cast_expression
);
498 printf("(%lld)", expr
->value
);
501 printf("%s", show_string(expr
->string
));
506 show_type(expr
->cast_type
);
508 show_expression(expr
->cast_expression
);
512 printf("bits[%d-%d](", expr
->bitpos
, expr
->bitpos
+ expr
->nrbits
- 1);
513 show_expression(expr
->address
);
516 case EXPR_INITIALIZER
:
518 show_expression_list(expr
->expr_list
, ", ");
521 case EXPR_IDENTIFIER
:
522 printf("%s: ", show_ident(expr
->expr_ident
));
525 if (expr
->idx_from
== expr
->idx_to
) {
526 printf("[%d]: ", expr
->idx_from
);
528 printf("[%d ... %d]: ", expr
->idx_from
, expr
->idx_to
);
531 case EXPR_CONDITIONAL
:
532 show_expression(expr
->conditional
);
534 show_expression(expr
->cond_true
);
536 show_expression(expr
->cond_false
);
540 show_statement(expr
->statement
);