4 * Copyright (C) 2003 Transmeta Corp, all rights reserved.
6 * Print out results of parsing for debugging and testing.
21 #include "expression.h"
25 * Symbol type printout. The type system is by far the most
26 * complicated part of C - everything else is trivial.
28 const char *modifier_string(unsigned long mod
)
30 static char buffer
[100];
32 const char *res
,**ptr
, *names
[] = {
33 "auto", "register", "static", "extern",
34 "const", "volatile", "[signed]", "[unsigned]",
35 "[char]", "[short]", "[long]", "[long]",
36 "[typdef]", "[structof]", "[unionof]", "[enum]",
37 "[typeof]", "[attribute]", "inline", "[addressable]",
38 "[nocast]", "[noderef]",
42 while ((res
= *ptr
++) != NULL
) {
45 while ((c
= *res
++) != '\0')
55 void show_struct_member(struct symbol
*sym
, void *data
, int flags
)
57 if (flags
& ITERATE_FIRST
)
59 printf("%s:%d:%ld at offset %ld", show_ident(sym
->ident
), sym
->bit_size
, sym
->ctype
.alignment
, sym
->offset
);
61 printf("[%d..%d]", sym
->bit_offset
, sym
->bit_offset
+sym
->fieldwidth
-1);
62 if (flags
& ITERATE_LAST
)
68 static void show_one_symbol(struct symbol
*sym
, void *sep
, int flags
)
71 if (!(flags
& ITERATE_LAST
))
72 printf("%s", (const char *)sep
);
75 void show_symbol_list(struct symbol_list
*list
, const char *sep
)
77 symbol_iterate(list
, show_one_symbol
, (void *)sep
);
80 void show_type_list(struct symbol
*sym
)
93 static void prepend(struct type_name
*name
, const char *fmt
, ...)
95 static char buffer
[512];
100 n
= vsprintf(buffer
, fmt
, args
);
104 memcpy(name
->start
, buffer
, n
);
107 static void append(struct type_name
*name
, const char *fmt
, ...)
109 static char buffer
[512];
114 n
= vsprintf(buffer
, fmt
, args
);
117 memcpy(name
->end
, buffer
, n
);
121 static void do_show_type(struct symbol
*sym
, struct type_name
*name
)
125 static struct ctype_name
{
129 { & char_ctype
, "char" },
130 { &uchar_ctype
, "unsigned char" },
131 { & short_ctype
, "short" },
132 { &ushort_ctype
, "unsigned short" },
133 { & int_ctype
, "int" },
134 { &uint_ctype
, "unsigned int" },
135 { & long_ctype
, "long" },
136 { &ulong_ctype
, "unsigned long" },
137 { & llong_ctype
, "long long" },
138 { &ullong_ctype
, "unsigned long long" },
140 { &void_ctype
, "void" },
141 { &bool_ctype
, "bool" },
142 { &string_ctype
, "string" },
144 { &float_ctype
, "float" },
145 { &double_ctype
, "double" },
146 { &ldouble_ctype
,"long double" },
152 for (i
= 0; i
< sizeof(typenames
)/sizeof(typenames
[0]); i
++) {
153 if (typenames
[i
].sym
== sym
) {
154 int len
= strlen(typenames
[i
].name
);
155 *--name
->start
= ' ';
157 memcpy(name
->start
, typenames
[i
].name
, len
);
171 prepend(name
, "struct %s ", show_ident(sym
->ident
));
175 prepend(name
, "union %s ", show_ident(sym
->ident
));
179 prepend(name
, "enum %s ", show_ident(sym
->ident
));
183 append(name
, "%s", show_ident(sym
->ident
));
187 append(name
, ":%d", sym
->fieldwidth
);
191 append(name
, "label(%s:%p)", show_ident(sym
->ident
), sym
);
198 prepend(name
, "unknown type %d", sym
->type
);
202 mod
= modifier_string(sym
->ctype
.modifiers
);
203 modlen
= strlen(mod
);
204 name
->start
-= modlen
;
205 memcpy(name
->start
, mod
, modlen
);
207 do_show_type(sym
->ctype
.base_type
, name
);
211 append(name
, "<asn:%d>", sym
->ctype
.as
);
218 append(name
, " )( ... )");
222 append(name
, "[%d]", sym
->array_size
);
229 void show_type(struct symbol
*sym
)
232 struct type_name name
;
234 name
.start
= name
.end
= array
+100;
235 do_show_type(sym
, &name
);
237 printf("%s", name
.start
);
240 void show_symbol(struct symbol
*sym
)
248 type
= sym
->ctype
.base_type
;
253 * Show actual implementation information
255 switch (type
->type
) {
257 symbol_iterate(type
->symbol_list
, show_struct_member
, NULL
);
261 symbol_iterate(type
->symbol_list
, show_struct_member
, NULL
);
266 show_statement(type
->stmt
);
273 if (sym
->initializer
) {
275 show_expression(sym
->initializer
);
279 static int show_return_stmt(struct statement
*stmt
)
281 struct expression
*expr
= stmt
->expression
;
284 int val
= show_expression(expr
);
285 printf("\tmov.%d\t\tretval,v%d\n",
286 expr
->ctype
->bit_size
, val
);
293 * Print out a statement
295 int show_statement(struct statement
*stmt
)
299 switch (stmt
->type
) {
301 return show_return_stmt(stmt
);
302 case STMT_COMPOUND
: {
308 show_symbol_list(stmt
->syms
, "\n\t");
311 FOR_EACH_PTR(stmt
->stmts
, s
) {
312 last
= show_statement(s
);
317 case STMT_EXPRESSION
:
318 return show_expression(stmt
->expression
);
321 show_expression(stmt
->if_conditional
);
323 show_statement(stmt
->if_true
);
324 if (stmt
->if_false
) {
326 show_statement(stmt
->if_false
);
330 printf("\tswitch (");
331 show_expression(stmt
->switch_expression
);
333 show_statement(stmt
->switch_statement
);
337 if (!stmt
->case_expression
)
341 show_expression(stmt
->case_expression
);
344 show_expression(stmt
->case_to
);
348 show_statement(stmt
->case_statement
);
355 case STMT_ITERATOR
: {
356 struct statement
*pre_statement
= stmt
->iterator_pre_statement
;
357 struct expression
*pre_condition
= stmt
->iterator_pre_condition
;
358 struct statement
*statement
= stmt
->iterator_statement
;
359 struct statement
*post_statement
= stmt
->iterator_post_statement
;
360 struct expression
*post_condition
= stmt
->iterator_post_condition
;
363 * THIS IS ONLY APPROXIMATE!
365 * Real iterators are more generic than
366 * any of for/while/do-while, and can't
367 * be printed out as C without goto's
369 if (post_statement
|| !post_condition
) {
371 show_statement(pre_statement
);
373 show_expression(pre_condition
);
375 show_statement(post_statement
);
377 show_statement(statement
);
378 } else if (pre_condition
) {
380 show_statement(pre_statement
);
384 show_expression(pre_condition
);
386 show_statement(statement
);
389 show_statement(pre_statement
);
393 show_statement(statement
);
395 show_expression(post_condition
);
405 printf("\tcontinue");
409 show_symbol(stmt
->label_identifier
);
411 show_statement(stmt
->label_statement
);
415 if (stmt
->goto_expression
) {
417 show_expression(stmt
->goto_expression
);
420 show_symbol(stmt
->goto_label
);
424 printf("\tasm( .... )");
431 static void show_one_statement(struct statement
*stmt
, void *sep
, int flags
)
433 show_statement(stmt
);
434 if (!(flags
& ITERATE_LAST
))
435 printf("%s", (const char *)sep
);
438 void show_statement_list(struct statement_list
*stmt
, const char *sep
)
440 statement_iterate(stmt
, show_one_statement
, (void *)sep
);
443 static void show_one_expression(struct expression
*expr
, void *sep
, int flags
)
445 show_expression(expr
);
446 if (!(flags
& ITERATE_LAST
))
447 printf("%s", (const char *)sep
);
450 void show_expression_list(struct expression_list
*list
, const char *sep
)
452 expression_iterate(list
, show_one_expression
, (void *)sep
);
455 static int new_pseudo(void)
461 static int show_call_expression(struct expression
*expr
)
463 struct expression
*arg
, *fn
;
468 FOR_EACH_PTR_REVERSE(expr
->args
, arg
) {
469 int new = show_expression(arg
);
470 int size
= arg
->ctype
->bit_size
;
471 printf("\tpush.%d\t\tv%d\n", size
, new);
472 framesize
+= size
>> 3;
476 /* Remove dereference, if any */
477 if (fn
->type
== EXPR_PREOP
)
479 fncall
= show_expression(fn
);
480 retval
= new_pseudo();
482 printf("\tcall\t\t*v%d\n", fncall
);
484 printf("\tadd.%d\t\tvSP,vSP,$%d\n", BITS_IN_POINTER
, framesize
);
485 printf("\tmov.%d\t\tv%d,retval\n", expr
->ctype
->bit_size
, retval
);
489 static int show_binop(struct expression
*expr
)
491 int left
= show_expression(expr
->left
);
492 int right
= show_expression(expr
->right
);
493 int new = new_pseudo();
495 static const char *name
[] = {
496 ['+'] = "add", ['-'] = "sub",
497 ['*'] = "mul", ['/'] = "div",
500 unsigned int op
= expr
->op
;
502 opname
= show_special(op
);
503 if (op
< sizeof(name
)/sizeof(*name
))
505 printf("\t%s.%d\t\tv%d,v%d,v%d\n", opname
,
506 expr
->ctype
->bit_size
,
511 static int show_regular_preop(struct expression
*expr
)
513 int target
= show_expression(expr
->unop
);
514 int new = new_pseudo();
515 static const char *name
[] = {
516 ['!'] = "nonzero", ['-'] = "neg",
519 unsigned int op
= expr
->op
;
522 opname
= show_special(op
);
523 if (op
< sizeof(name
)/sizeof(*name
))
525 printf("\t%s.%d\t\tv%d,v%d\n", opname
, expr
->ctype
->bit_size
, new, target
);
530 * FIXME! Not all accesses are memory loads. We should
531 * check what kind of symbol is behind the dereference.
533 static int show_address_gen(struct expression
*expr
)
535 if (expr
->type
== EXPR_PREOP
)
536 return show_expression(expr
->unop
);
537 return show_expression(expr
->address
);
540 static int show_load_gen(int bits
, struct expression
*expr
, int addr
)
542 int new = new_pseudo();
544 printf("\tld.%d\t\tv%d,[v%d]\n", bits
, new, addr
);
545 if (expr
->type
== EXPR_PREOP
)
550 printf("\tshr.%d\t\tv%d,v%d,$%d\n", bits
, new, new, expr
->bitpos
);
551 printf("\tandi.%d\t\tv%d,v%d,$%llu\n", bits
, new, new, (1ULL << expr
->nrbits
)-1);
555 static void show_store_gen(int bits
, int value
, struct expression
*expr
, int addr
)
557 /* FIXME!!! Bitfield store! */
558 printf("\tst.%d\t\tv%d,[v%d]\n", bits
, value
, addr
);
561 static int show_assignment(struct expression
*expr
)
563 struct expression
*target
= expr
->left
;
564 int val
, addr
, bits
= expr
->ctype
->bit_size
;
566 val
= show_expression(expr
->right
);
567 addr
= show_address_gen(target
);
568 show_store_gen(bits
, val
, target
, addr
);
572 static int show_access(struct expression
*expr
)
574 int addr
= show_address_gen(expr
);
575 return show_load_gen(expr
->ctype
->bit_size
, expr
, addr
);
578 static int show_inc_dec(struct expression
*expr
, int postop
)
580 int addr
= show_address_gen(expr
->unop
);
582 const char *opname
= expr
->op
== SPECIAL_INCREMENT
? "add" : "sub";
583 int bits
= expr
->ctype
->bit_size
;
585 retval
= show_load_gen(bits
, expr
->unop
, addr
);
589 printf("\t%s.%d\t\tv%d,v%d,$1\n", opname
, bits
, new, retval
);
590 show_store_gen(bits
, new, expr
->unop
, addr
);
594 static int show_preop(struct expression
*expr
)
597 * '*' is an lvalue access, and is fundamentally different
598 * from an arithmetic operation. Maybe it should have an
599 * expression type of its own..
602 return show_access(expr
);
603 if (expr
->op
== SPECIAL_INCREMENT
|| expr
->op
== SPECIAL_DECREMENT
)
604 return show_inc_dec(expr
, 0);
605 return show_regular_preop(expr
);
608 static int show_postop(struct expression
*expr
)
610 return show_inc_dec(expr
, 1);
613 static int show_symbol_expr(struct expression
*expr
)
615 int new = new_pseudo();
616 printf("\tmovi.%d\t\tv%d,$%s\n", BITS_IN_POINTER
, new, show_ident(expr
->symbol_name
));
620 static int type_is_signed(struct symbol
*sym
)
622 if (sym
->type
== SYM_NODE
)
623 sym
= sym
->ctype
.base_type
;
624 if (sym
->type
== SYM_PTR
)
626 return !(sym
->ctype
.modifiers
& MOD_UNSIGNED
);
629 static int show_cast_expr(struct expression
*expr
)
631 struct symbol
*old_type
, *new_type
;
632 int op
= show_expression(expr
->cast_expression
);
633 int oldbits
, newbits
;
636 old_type
= expr
->cast_expression
->ctype
;
637 new_type
= expr
->cast_type
;
639 oldbits
= old_type
->bit_size
;
640 newbits
= new_type
->bit_size
;
641 if (oldbits
>= newbits
)
644 is_signed
= type_is_signed(old_type
);
646 printf("\tsext%d.%d\tv%d,v%d\n", oldbits
, newbits
, new, op
);
648 printf("\tandl.%d\t\tv%d,v%d,$%lu\n", newbits
, new, op
, (1UL << oldbits
)-1);
653 static int show_value(struct expression
*expr
)
655 int new = new_pseudo();
656 unsigned long long value
= expr
->value
;
658 printf("\tmovi.%d\t\tv%d,$%llu\n", expr
->ctype
->bit_size
, new, value
);
662 static int show_string_expr(struct expression
*expr
)
664 int new = new_pseudo();
666 printf("\tmovi.%d\t\tv%d,&%s\n", BITS_IN_POINTER
, new, show_string(expr
->string
));
670 static int show_bitfield_expr(struct expression
*expr
)
672 return show_access(expr
);
675 static int show_conditional_expr(struct expression
*expr
)
677 int cond
= show_expression(expr
->conditional
);
678 int true = show_expression(expr
->cond_true
);
679 int false = show_expression(expr
->cond_false
);
680 int new = new_pseudo();
684 printf("[v%d]\tcmov.%d\t\tv%d,v%d,v%d\n", cond
, expr
->ctype
->bit_size
, new, true, false);
688 static int show_statement_expr(struct expression
*expr
)
690 return show_statement(expr
->statement
);
694 * Print out an expression. Return the pseudo that contains the
697 int show_expression(struct expression
*expr
)
702 switch (expr
->type
) {
704 return show_call_expression(expr
);
706 case EXPR_ASSIGNMENT
:
707 return show_assignment(expr
);
713 return show_binop(expr
);
715 return show_preop(expr
);
717 return show_postop(expr
);
719 return show_symbol_expr(expr
);
722 warn(expr
->pos
, "invalid expression after evaluation");
725 return show_cast_expr(expr
);
727 return show_value(expr
);
729 return show_string_expr(expr
);
731 return show_bitfield_expr(expr
);
732 case EXPR_INITIALIZER
:
733 warn(expr
->pos
, "unable to show initializer expression");
735 case EXPR_IDENTIFIER
:
736 warn(expr
->pos
, "unable to show identifier expression");
739 warn(expr
->pos
, "unable to show index expression");
741 case EXPR_CONDITIONAL
:
742 return show_conditional_expr(expr
);
744 return show_statement_expr(expr
);