4 * Copyright (C) 2003 Linus Torvalds, 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]",
40 while ((res
= *ptr
++) != NULL
) {
43 while ((c
= *res
++) != '\0')
53 void show_struct_member(struct symbol
*sym
, void *data
, int flags
)
55 if (flags
& ITERATE_FIRST
)
57 printf("%s:%d:%d at offset %ld", show_ident(sym
->ident
), sym
->bit_size
, sym
->alignment
, sym
->offset
);
59 printf("[%d..%d]", sym
->bit_offset
, sym
->bit_offset
+sym
->fieldwidth
-1);
60 if (flags
& ITERATE_LAST
)
66 static void show_one_symbol(struct symbol
*sym
, void *sep
, int flags
)
69 if (!(flags
& ITERATE_LAST
))
70 printf("%s", (const char *)sep
);
73 void show_symbol_list(struct symbol_list
*list
, const char *sep
)
75 symbol_iterate(list
, show_one_symbol
, (void *)sep
);
78 void show_type_list(struct symbol
*sym
)
86 void show_type(struct symbol
*sym
)
89 static struct ctype_name
{
93 { & char_ctype
, "char" },
94 { &uchar_ctype
, "unsigned char" },
95 { & short_ctype
, "short" },
96 { &ushort_ctype
, "unsigned short" },
97 { & int_ctype
, "int" },
98 { &uint_ctype
, "unsigned int" },
99 { & long_ctype
, "long" },
100 { &ulong_ctype
, "unsigned long" },
101 { & llong_ctype
, "long long" },
102 { &ullong_ctype
, "unsigned long long" },
104 { &void_ctype
, "void" },
105 { &bool_ctype
, "bool" },
106 { &string_ctype
, "string" },
108 { &float_ctype
, "float" },
109 { &double_ctype
, "double" },
110 { &ldouble_ctype
,"long double" },
116 for (i
= 0; i
< sizeof(typenames
)/sizeof(typenames
[0]); i
++) {
117 if (typenames
[i
].sym
== sym
) {
118 printf("%s", typenames
[i
].name
);
123 printf("%s", modifier_string(sym
->ctype
.modifiers
));
127 show_type(sym
->ctype
.base_type
);
132 show_type(sym
->ctype
.base_type
);
135 show_symbol_list(sym
->arguments
, ", ");
142 printf("<array [%d] of>(", sym
->array_size
);
143 show_type(sym
->ctype
.base_type
);
148 printf("struct %s", show_ident(sym
->ident
));
152 printf("union %s", show_ident(sym
->ident
));
156 printf("enum %s", show_ident(sym
->ident
));
160 struct symbol
*type
= sym
->ctype
.base_type
;
165 printf(": %s", show_ident(sym
->ident
));
170 show_type(sym
->ctype
.base_type
);
171 printf(":%d", sym
->fieldwidth
);
175 printf("strange type %d '%s' of type ", sym
->type
, show_ident(sym
->ident
));
176 show_type(sym
->ctype
.base_type
);
181 void show_symbol(struct symbol
*sym
)
185 if (sym
->type
!= SYM_NODE
)
188 type
= sym
->ctype
.base_type
;
193 * Show actual implementation information
195 switch (type
->type
) {
198 symbol_iterate(type
->symbol_list
, show_struct_member
, NULL
);
203 symbol_iterate(type
->symbol_list
, show_struct_member
, NULL
);
208 show_statement(type
->stmt
);
217 * Print out a statement
219 void show_statement(struct statement
*stmt
)
223 switch (stmt
->type
) {
226 show_expression(stmt
->expression
);
232 show_symbol_list(stmt
->syms
, "\n\t");
235 show_statement_list(stmt
->stmts
, ";\n");
238 case STMT_EXPRESSION
:
240 show_expression(stmt
->expression
);
244 show_expression(stmt
->if_conditional
);
246 show_statement(stmt
->if_true
);
247 if (stmt
->if_false
) {
249 show_statement(stmt
->if_false
);
253 printf("\tswitch (");
254 show_expression(stmt
->switch_expression
);
256 show_statement(stmt
->switch_statement
);
260 if (!stmt
->case_expression
)
264 show_expression(stmt
->case_expression
);
267 show_expression(stmt
->case_to
);
271 show_statement(stmt
->case_statement
);
278 case STMT_ITERATOR
: {
279 struct statement
*pre_statement
= stmt
->iterator_pre_statement
;
280 struct expression
*pre_condition
= stmt
->iterator_pre_condition
;
281 struct statement
*statement
= stmt
->iterator_statement
;
282 struct statement
*post_statement
= stmt
->iterator_post_statement
;
283 struct expression
*post_condition
= stmt
->iterator_post_condition
;
286 * THIS IS ONLY APPROXIMATE!
288 * Real iterators are more generic than
289 * any of for/while/do-while, and can't
290 * be printed out as C without goto's
292 if (post_statement
|| !post_condition
) {
294 show_statement(pre_statement
);
296 show_expression(pre_condition
);
298 show_statement(post_statement
);
300 show_statement(statement
);
301 } else if (pre_condition
) {
303 show_statement(pre_statement
);
307 show_expression(pre_condition
);
309 show_statement(statement
);
312 show_statement(pre_statement
);
316 show_statement(statement
);
318 show_expression(post_condition
);
328 printf("\tcontinue");
332 printf("%s:\n", show_token(stmt
->label_identifier
));
333 show_statement(stmt
->label_statement
);
337 if (stmt
->goto_expression
) {
339 show_expression(stmt
->goto_expression
);
341 printf("goto %s", show_token(stmt
->goto_label
));
344 printf("\tasm( .... )");
350 static void show_one_statement(struct statement
*stmt
, void *sep
, int flags
)
352 show_statement(stmt
);
353 if (!(flags
& ITERATE_LAST
))
354 printf("%s", (const char *)sep
);
357 void show_statement_list(struct statement_list
*stmt
, const char *sep
)
359 statement_iterate(stmt
, show_one_statement
, (void *)sep
);
362 static void show_size(struct symbol
*sym
)
365 printf("%d:%d", sym
->bit_size
, sym
->alignment
);
368 static void show_one_expression(struct expression
*expr
, void *sep
, int flags
)
370 show_expression(expr
);
371 if (!(flags
& ITERATE_LAST
))
372 printf("%s", (const char *)sep
);
375 void show_expression_list(struct expression_list
*list
, const char *sep
)
377 expression_iterate(list
, show_one_expression
, (void *)sep
);
381 * Print out an expression
383 void show_expression(struct expression
*expr
)
389 show_size(expr
->ctype
);
390 show_type(expr
->ctype
);
392 switch (expr
->type
) {
394 show_expression(expr
->fn
);
396 show_expression_list(expr
->args
, ", ");
400 case EXPR_ASSIGNMENT
:
401 show_expression(expr
->left
);
402 printf(" %s ", show_special(expr
->op
));
403 show_expression(expr
->right
);
408 show_expression(expr
->left
);
409 printf(" %s ", show_special(expr
->op
));
410 show_expression(expr
->right
);
413 printf("%s<", show_special(expr
->op
));
414 show_expression(expr
->unop
);
418 show_expression(expr
->unop
);
419 printf(" %s ", show_special(expr
->op
));
422 printf("%s", show_token(expr
->token
));
426 warn(expr
->pos
, "undefined symbol '%s'", show_ident(expr
->symbol_name
));
427 printf("<nosymbol>");
430 printf("<%s:", show_ident(expr
->symbol_name
));
431 show_type(expr
->symbol
->ctype
.base_type
);
435 show_expression(expr
->deref
);
436 printf("%s", show_special(expr
->op
));
437 printf("%s", show_ident(expr
->member
));
441 show_type(expr
->cast_type
);
443 show_expression(expr
->cast_expression
);
446 printf("(%lld)", expr
->value
);
449 printf("%s", show_string(expr
->string
));
454 show_type(expr
->cast_type
);
456 show_expression(expr
->cast_expression
);
460 printf("bits[%d-%d](", expr
->bitpos
, expr
->bitpos
+ expr
->nrbits
- 1);
461 show_expression(expr
->address
);