[PATCH] trivial ansi-c declear
[smatch.git] / show-parse.c
blob38562899497681bd3994bfb9d6aefd27edd4b732
1 /*
2 * sparse/show-parse.c
4 * Copyright (C) 2003 Transmeta Corp.
5 * 2003 Linus Torvalds
7 * Licensed under the Open Software License version 1.1
9 * Print out results of parsing for debugging and testing.
11 #include <stdarg.h>
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <string.h>
15 #include <ctype.h>
16 #include <unistd.h>
17 #include <fcntl.h>
19 #include "lib.h"
20 #include "token.h"
21 #include "parse.h"
22 #include "symbol.h"
23 #include "scope.h"
24 #include "expression.h"
25 #include "target.h"
27 static int show_symbol_expr(struct symbol *sym);
29 static void do_debug_symbol(struct symbol *sym, int indent)
31 static const char indent_string[] = " ";
32 static const char *typestr[] = {
33 "base", "node", "ptr.", "fn..",
34 "arry", "strt", "unin", "enum",
35 "tdef", "tpof", "memb", "bitf",
36 "labl"
39 if (!sym)
40 return;
41 fprintf(stderr, "%.*s%s%3d:%lu %lx %s (as: %d, context: %x:%x) %p (%s:%d:%d)\n",
42 indent, indent_string, typestr[sym->type],
43 sym->bit_size, sym->ctype.alignment,
44 sym->ctype.modifiers, show_ident(sym->ident),
45 sym->ctype.as, sym->ctype.context, sym->ctype.contextmask,
46 sym, input_streams[sym->pos.stream].name, sym->pos.line, sym->pos.pos);
47 if (sym->type == SYM_FN) {
48 int i = 1;
49 struct symbol *arg;
50 FOR_EACH_PTR(sym->arguments, arg) {
51 fprintf(stderr, "< arg%d:\n", i);
52 do_debug_symbol(arg, 0);
53 fprintf(stderr, " end arg%d >\n", i);
54 i++;
55 } END_FOR_EACH_PTR(arg);
57 do_debug_symbol(sym->ctype.base_type, indent+2);
60 void debug_symbol(struct symbol *sym)
62 do_debug_symbol(sym, 0);
66 * Symbol type printout. The type system is by far the most
67 * complicated part of C - everything else is trivial.
69 const char *modifier_string(unsigned long mod)
71 static char buffer[100];
72 char *p = buffer;
73 const char *res,**ptr, *names[] = {
74 "auto", "register", "static", "extern",
75 "const", "volatile", "[signed]", "[unsigned]",
76 "[char]", "[short]", "[long]", "[long]",
77 "[typdef]", "[structof]", "[unionof]", "[enum]",
78 "[typeof]", "[attribute]", "inline", "[addressable]",
79 "[nocast]", "[noderef]", "[accessed]", "[toplevel]",
80 "[label]", "[assigned]", "[type]", "[safe]",
81 "[usertype]", "[force]", "[explicitly-signed]",
82 NULL
84 ptr = names;
85 while ((res = *ptr++) != NULL) {
86 if (mod & 1) {
87 char c;
88 while ((c = *res++) != '\0')
89 *p++ = c;
90 *p++ = ' ';
92 mod >>= 1;
94 *p = 0;
95 return buffer;
98 void show_struct_member(struct symbol *sym, void *data, int flags)
100 if (flags & ITERATE_FIRST)
101 printf(" {\n\t");
102 printf("%s:%d:%ld at offset %ld", show_ident(sym->ident), sym->bit_size, sym->ctype.alignment, sym->offset);
103 if (sym->fieldwidth)
104 printf("[%d..%d]", sym->bit_offset, sym->bit_offset+sym->fieldwidth-1);
105 if (flags & ITERATE_LAST)
106 printf("\n} ");
107 else
108 printf(", ");
111 static void show_one_symbol(struct symbol *sym, void *sep, int flags)
113 show_symbol(sym);
114 if (!(flags & ITERATE_LAST))
115 printf("%s", (const char *)sep);
118 void show_symbol_list(struct symbol_list *list, const char *sep)
120 symbol_iterate(list, show_one_symbol, (void *)sep);
123 struct type_name {
124 char *start;
125 char *end;
128 static void prepend(struct type_name *name, const char *fmt, ...)
130 static char buffer[512];
131 int n;
133 va_list args;
134 va_start(args, fmt);
135 n = vsprintf(buffer, fmt, args);
136 va_end(args);
138 name->start -= n;
139 memcpy(name->start, buffer, n);
142 static void append(struct type_name *name, const char *fmt, ...)
144 static char buffer[512];
145 int n;
147 va_list args;
148 va_start(args, fmt);
149 n = vsprintf(buffer, fmt, args);
150 va_end(args);
152 memcpy(name->end, buffer, n);
153 name->end += n;
156 static void do_show_type(struct symbol *sym, struct type_name *name)
158 int i, modlen;
159 const char *mod;
160 static struct ctype_name {
161 struct symbol *sym;
162 const char *name;
163 } typenames[] = {
164 { & char_ctype, "char" },
165 { &schar_ctype, "signed char" },
166 { &uchar_ctype, "unsigned char" },
167 { & short_ctype, "short" },
168 { &sshort_ctype, "signed short" },
169 { &ushort_ctype, "unsigned short" },
170 { & int_ctype, "int" },
171 { &sint_ctype, "signed int" },
172 { &uint_ctype, "unsigned int" },
173 { &slong_ctype, "signed long" },
174 { & long_ctype, "long" },
175 { &ulong_ctype, "unsigned long" },
176 { & llong_ctype, "long long" },
177 { &sllong_ctype, "signed long long" },
178 { &ullong_ctype, "unsigned long long" },
180 { &void_ctype, "void" },
181 { &bool_ctype, "bool" },
182 { &string_ctype, "string" },
184 { &float_ctype, "float" },
185 { &double_ctype, "double" },
186 { &ldouble_ctype,"long double" },
187 { &incomplete_ctype, "incomplete type" },
188 { &label_ctype, "label type" },
191 if (!sym)
192 return;
194 for (i = 0; i < sizeof(typenames)/sizeof(typenames[0]); i++) {
195 if (typenames[i].sym == sym) {
196 int len = strlen(typenames[i].name);
197 *--name->start = ' ';
198 name->start -= len;
199 memcpy(name->start, typenames[i].name, len);
200 return;
204 /* Prepend */
205 switch (sym->type) {
206 case SYM_PTR:
207 prepend(name, "*");
208 break;
209 case SYM_FN:
210 prepend(name, "( ");
211 break;
212 case SYM_STRUCT:
213 prepend(name, "struct %s ", show_ident(sym->ident));
214 return;
216 case SYM_UNION:
217 prepend(name, "union %s ", show_ident(sym->ident));
218 return;
220 case SYM_ENUM:
221 prepend(name, "enum %s ", show_ident(sym->ident));
222 return;
224 case SYM_NODE:
225 append(name, "%s", show_ident(sym->ident));
226 break;
228 case SYM_BITFIELD:
229 append(name, ":%d", sym->fieldwidth);
230 break;
232 case SYM_LABEL:
233 append(name, "label(%s:%p)", show_ident(sym->ident), sym);
234 break;
236 case SYM_ARRAY:
237 break;
239 case SYM_RESTRICT:
240 break;
242 default:
243 prepend(name, "unknown type %d", sym->type);
244 return;
247 mod = modifier_string(sym->ctype.modifiers);
248 modlen = strlen(mod);
249 name->start -= modlen;
250 memcpy(name->start, mod, modlen);
252 do_show_type(sym->ctype.base_type, name);
254 /* Postpend */
255 if (sym->ctype.as)
256 append(name, "<asn:%d>", sym->ctype.as);
258 switch (sym->type) {
259 case SYM_PTR:
260 return;
262 case SYM_FN:
263 append(name, " )( ... )");
264 return;
266 case SYM_ARRAY:
267 append(name, "[%lld]", get_expression_value(sym->array_size));
268 return;
270 case SYM_RESTRICT:
271 prepend(name, "restricted ");
272 return;
274 default:
275 break;
279 void show_type(struct symbol *sym)
281 char array[200];
282 struct type_name name;
284 name.start = name.end = array+100;
285 do_show_type(sym, &name);
286 *name.end = 0;
287 printf("%s", name.start);
290 const char *show_typename(struct symbol *sym)
292 static char array[200];
293 struct type_name name;
295 name.start = name.end = array+100;
296 do_show_type(sym, &name);
297 *name.end = 0;
298 return name.start;
301 void show_symbol(struct symbol *sym)
303 struct symbol *type;
305 if (!sym)
306 return;
308 if (sym->ctype.alignment)
309 printf(".align %ld\n", sym->ctype.alignment);
311 show_type(sym);
312 type = sym->ctype.base_type;
313 if (!type)
314 return;
317 * Show actual implementation information
319 switch (type->type) {
320 case SYM_STRUCT:
321 symbol_iterate(type->symbol_list, show_struct_member, NULL);
322 break;
324 case SYM_UNION:
325 symbol_iterate(type->symbol_list, show_struct_member, NULL);
326 break;
328 case SYM_FN: {
329 struct statement *stmt = type->stmt;
330 if (stmt) {
331 int val;
332 printf("\n");
333 val = show_statement(stmt);
334 if (val)
335 printf("\tmov.%d\t\tretval,%d\n", stmt->ret->bit_size, val);
336 printf("\tret\n");
338 break;
341 default:
342 break;
345 if (sym->initializer) {
346 printf(" = \n");
347 show_expression(sym->initializer);
351 static int show_symbol_init(struct symbol *sym);
353 static int new_pseudo(void)
355 static int nr = 0;
356 return ++nr;
359 static int new_label(void)
361 static int label = 0;
362 return ++label;
365 static void show_switch_statement(struct statement *stmt)
367 int val = show_expression(stmt->switch_expression);
368 struct symbol *sym;
369 printf("\tswitch v%d\n", val);
372 * Debugging only: Check that the case list is correct
373 * by printing it out.
375 * This is where a _real_ back-end would go through the
376 * cases to decide whether to use a lookup table or a
377 * series of comparisons etc
379 printf("# case table:\n");
380 FOR_EACH_PTR(stmt->switch_case->symbol_list, sym) {
381 struct statement *case_stmt = sym->stmt;
382 struct expression *expr = case_stmt->case_expression;
383 struct expression *to = case_stmt->case_to;
385 if (!expr) {
386 printf(" default");
387 } else {
388 if (expr->type == EXPR_VALUE) {
389 printf(" case %lld", expr->value);
390 if (to) {
391 if (to->type == EXPR_VALUE) {
392 printf(" .. %lld", to->value);
393 } else {
394 printf(" .. what?");
397 } else
398 printf(" what?");
400 printf(": .L%p\n", sym->bb_target);
401 } END_FOR_EACH_PTR(sym);
402 printf("# end case table\n");
404 show_statement(stmt->switch_statement);
406 if (stmt->switch_break->used)
407 printf(".L%p:\n", stmt->switch_break->bb_target);
410 static void show_symbol_decl(struct symbol_list *syms)
412 struct symbol *sym;
413 FOR_EACH_PTR(syms, sym) {
414 show_symbol_init(sym);
415 } END_FOR_EACH_PTR(sym);
418 static int show_return_stmt(struct statement *stmt);
421 * Print out a statement
423 int show_statement(struct statement *stmt)
425 if (!stmt)
426 return 0;
427 switch (stmt->type) {
428 case STMT_RETURN:
429 return show_return_stmt(stmt);
430 case STMT_COMPOUND: {
431 struct statement *s;
432 int last = 0;
434 show_symbol_decl(stmt->syms);
435 FOR_EACH_PTR(stmt->stmts, s) {
436 last = show_statement(s);
437 } END_FOR_EACH_PTR(s);
438 if (stmt->ret) {
439 int addr, bits;
440 printf(".L%p:\n", stmt->ret);
441 addr = show_symbol_expr(stmt->ret);
442 bits = stmt->ret->bit_size;
443 last = new_pseudo();
444 printf("\tld.%d\t\tv%d,[v%d]\n", bits, last, addr);
446 return last;
449 case STMT_EXPRESSION:
450 return show_expression(stmt->expression);
451 case STMT_IF: {
452 int val, target;
453 struct expression *cond = stmt->if_conditional;
455 /* This is only valid if nobody can jump into the "dead" statement */
456 #if 0
457 if (cond->type == EXPR_VALUE) {
458 struct statement *s = stmt->if_true;
459 if (!cond->value)
460 s = stmt->if_false;
461 show_statement(s);
462 break;
464 #endif
465 val = show_expression(cond);
466 target = new_label();
467 printf("\tje\t\tv%d,.L%d\n", val, target);
468 show_statement(stmt->if_true);
469 if (stmt->if_false) {
470 int last = new_label();
471 printf("\tjmp\t\t.L%d\n", last);
472 printf(".L%d:\n", target);
473 target = last;
474 show_statement(stmt->if_false);
476 printf(".L%d:\n", target);
477 break;
479 case STMT_SWITCH:
480 show_switch_statement(stmt);
481 break;
483 case STMT_CASE:
484 printf(".L%p:\n", stmt->case_label);
485 show_statement(stmt->case_statement);
486 break;
488 case STMT_ITERATOR: {
489 struct statement *pre_statement = stmt->iterator_pre_statement;
490 struct expression *pre_condition = stmt->iterator_pre_condition;
491 struct statement *statement = stmt->iterator_statement;
492 struct statement *post_statement = stmt->iterator_post_statement;
493 struct expression *post_condition = stmt->iterator_post_condition;
494 int val, loop_top = 0, loop_bottom = 0;
496 show_symbol_decl(stmt->iterator_syms);
497 show_statement(pre_statement);
498 if (pre_condition) {
499 if (pre_condition->type == EXPR_VALUE) {
500 if (!pre_condition->value) {
501 loop_bottom = new_label();
502 printf("\tjmp\t\t.L%d\n", loop_bottom);
504 } else {
505 loop_bottom = new_label();
506 val = show_expression(pre_condition);
507 printf("\tje\t\tv%d, .L%d\n", val, loop_bottom);
510 if (!post_condition || post_condition->type != EXPR_VALUE || post_condition->value) {
511 loop_top = new_label();
512 printf(".L%d:\n", loop_top);
514 show_statement(statement);
515 if (stmt->iterator_continue->used)
516 printf(".L%p:\n", stmt->iterator_continue);
517 show_statement(post_statement);
518 if (!post_condition) {
519 printf("\tjmp\t\t.L%d\n", loop_top);
520 } else if (post_condition->type == EXPR_VALUE) {
521 if (post_condition->value)
522 printf("\tjmp\t\t.L%d\n", loop_top);
523 } else {
524 val = show_expression(post_condition);
525 printf("\tjne\t\tv%d, .L%d\n", val, loop_top);
527 if (stmt->iterator_break->used)
528 printf(".L%p:\n", stmt->iterator_break);
529 if (loop_bottom)
530 printf(".L%d:\n", loop_bottom);
531 break;
533 case STMT_NONE:
534 break;
536 case STMT_LABEL:
537 printf(".L%p:\n", stmt->label_identifier);
538 show_statement(stmt->label_statement);
539 break;
541 case STMT_GOTO:
542 if (stmt->goto_expression) {
543 int val = show_expression(stmt->goto_expression);
544 printf("\tgoto\t\t*v%d\n", val);
545 } else {
546 printf("\tgoto\t\t.L%p\n", stmt->goto_label->bb_target);
548 break;
549 case STMT_ASM:
550 printf("\tasm( .... )\n");
551 break;
554 return 0;
557 static void show_one_statement(struct statement *stmt, void *sep, int flags)
559 show_statement(stmt);
560 if (!(flags & ITERATE_LAST))
561 printf("%s", (const char *)sep);
564 void show_statement_list(struct statement_list *stmt, const char *sep)
566 statement_iterate(stmt, show_one_statement, (void *)sep);
569 static void show_one_expression(struct expression *expr, void *sep, int flags)
571 show_expression(expr);
572 if (!(flags & ITERATE_LAST))
573 printf("%s", (const char *)sep);
576 void show_expression_list(struct expression_list *list, const char *sep)
578 expression_iterate(list, show_one_expression, (void *)sep);
581 static int show_call_expression(struct expression *expr)
583 struct symbol *direct;
584 struct expression *arg, *fn;
585 int fncall, retval;
586 int framesize;
588 if (!expr->ctype) {
589 warning(expr->pos, "\tcall with no type!");
590 return 0;
593 framesize = 0;
594 FOR_EACH_PTR_REVERSE(expr->args, arg) {
595 int new = show_expression(arg);
596 int size = arg->ctype->bit_size;
597 printf("\tpush.%d\t\tv%d\n", size, new);
598 framesize += size >> 3;
599 } END_FOR_EACH_PTR_REVERSE(arg);
601 fn = expr->fn;
603 /* Remove dereference, if any */
604 direct = NULL;
605 if (fn->type == EXPR_PREOP) {
606 if (fn->unop->type == EXPR_SYMBOL) {
607 struct symbol *sym = fn->unop->symbol;
608 if (sym->ctype.base_type->type == SYM_FN)
609 direct = sym;
612 if (direct) {
613 printf("\tcall\t\t%s\n", show_ident(direct->ident));
614 } else {
615 fncall = show_expression(fn);
616 printf("\tcall\t\t*v%d\n", fncall);
618 if (framesize)
619 printf("\tadd.%d\t\tvSP,vSP,$%d\n", bits_in_pointer, framesize);
621 retval = new_pseudo();
622 printf("\tmov.%d\t\tv%d,retval\n", expr->ctype->bit_size, retval);
623 return retval;
626 static int show_binop(struct expression *expr)
628 int left = show_expression(expr->left);
629 int right = show_expression(expr->right);
630 int new = new_pseudo();
631 const char *opname;
632 static const char *name[] = {
633 ['+'] = "add", ['-'] = "sub",
634 ['*'] = "mul", ['/'] = "div",
635 ['%'] = "mod", ['&'] = "and",
636 ['|'] = "lor", ['^'] = "xor"
638 unsigned int op = expr->op;
640 opname = show_special(op);
641 if (op < sizeof(name)/sizeof(*name))
642 opname = name[op];
643 printf("\t%s.%d\t\tv%d,v%d,v%d\n", opname,
644 expr->ctype->bit_size,
645 new, left, right);
646 return new;
649 static int show_slice(struct expression *expr)
651 int target = show_expression(expr->base);
652 int new = new_pseudo();
653 printf("\tslice.%d\t\tv%d,v%d,%d\n", expr->r_nrbits, target, new, expr->r_bitpos);
654 return new;
657 static int show_regular_preop(struct expression *expr)
659 int target = show_expression(expr->unop);
660 int new = new_pseudo();
661 static const char *name[] = {
662 ['!'] = "nonzero", ['-'] = "neg",
663 ['~'] = "not",
665 unsigned int op = expr->op;
666 const char *opname;
668 opname = show_special(op);
669 if (op < sizeof(name)/sizeof(*name))
670 opname = name[op];
671 printf("\t%s.%d\t\tv%d,v%d\n", opname, expr->ctype->bit_size, new, target);
672 return new;
676 * FIXME! Not all accesses are memory loads. We should
677 * check what kind of symbol is behind the dereference.
679 static int show_address_gen(struct expression *expr)
681 if (expr->type == EXPR_PREOP)
682 return show_expression(expr->unop);
683 return show_expression(expr->address);
686 static int show_load_gen(int bits, struct expression *expr, int addr)
688 int new = new_pseudo();
690 printf("\tld.%d\t\tv%d,[v%d]\n", bits, new, addr);
691 if (expr->type == EXPR_PREOP)
692 return new;
694 /* bitfield load! */
695 if (expr->bitpos)
696 printf("\tshr.%d\t\tv%d,v%d,$%d\n", bits, new, new, expr->bitpos);
697 printf("\tandi.%d\t\tv%d,v%d,$%llu\n", bits, new, new, (1ULL << expr->nrbits)-1);
698 return new;
701 static void show_store_gen(int bits, int value, struct expression *expr, int addr)
703 /* FIXME!!! Bitfield store! */
704 printf("\tst.%d\t\tv%d,[v%d]\n", bits, value, addr);
707 static int show_assignment(struct expression *expr)
709 struct expression *target = expr->left;
710 int val, addr, bits;
712 if (!expr->ctype)
713 return 0;
715 bits = expr->ctype->bit_size;
716 val = show_expression(expr->right);
717 addr = show_address_gen(target);
718 show_store_gen(bits, val, target, addr);
719 return val;
722 static int show_return_stmt(struct statement *stmt)
724 struct expression *expr = stmt->ret_value;
725 struct symbol *target = stmt->ret_target;
727 if (expr && expr->ctype) {
728 int val = show_expression(expr);
729 int bits = expr->ctype->bit_size;
730 int addr = show_symbol_expr(target);
731 show_store_gen(bits, val, NULL, addr);
733 printf("\tret\t\t(%p)\n", target);
734 return 0;
737 static int show_initialization(struct symbol *sym, struct expression *expr)
739 int val, addr, bits;
741 if (!expr->ctype)
742 return 0;
744 bits = expr->ctype->bit_size;
745 val = show_expression(expr);
746 addr = show_symbol_expr(sym);
747 // FIXME! The "target" expression is for bitfield store information.
748 // Leave it NULL, which works fine.
749 show_store_gen(bits, val, NULL, addr);
750 return 0;
753 static int show_access(struct expression *expr)
755 int addr = show_address_gen(expr);
756 return show_load_gen(expr->ctype->bit_size, expr, addr);
759 static int show_inc_dec(struct expression *expr, int postop)
761 int addr = show_address_gen(expr->unop);
762 int retval, new;
763 const char *opname = expr->op == SPECIAL_INCREMENT ? "add" : "sub";
764 int bits = expr->ctype->bit_size;
766 retval = show_load_gen(bits, expr->unop, addr);
767 new = retval;
768 if (postop)
769 new = new_pseudo();
770 printf("\t%s.%d\t\tv%d,v%d,$1\n", opname, bits, new, retval);
771 show_store_gen(bits, new, expr->unop, addr);
772 return retval;
775 static int show_preop(struct expression *expr)
778 * '*' is an lvalue access, and is fundamentally different
779 * from an arithmetic operation. Maybe it should have an
780 * expression type of its own..
782 if (expr->op == '*')
783 return show_access(expr);
784 if (expr->op == SPECIAL_INCREMENT || expr->op == SPECIAL_DECREMENT)
785 return show_inc_dec(expr, 0);
786 return show_regular_preop(expr);
789 static int show_postop(struct expression *expr)
791 return show_inc_dec(expr, 1);
794 static int show_symbol_expr(struct symbol *sym)
796 int new = new_pseudo();
798 if (sym->ctype.modifiers & (MOD_TOPLEVEL | MOD_EXTERN | MOD_STATIC)) {
799 printf("\tmovi.%d\t\tv%d,$%s\n", bits_in_pointer, new, show_ident(sym->ident));
800 return new;
802 if (sym->ctype.modifiers & MOD_ADDRESSABLE) {
803 printf("\taddi.%d\t\tv%d,vFP,$%lld\n", bits_in_pointer, new, sym->value);
804 return new;
806 printf("\taddi.%d\t\tv%d,vFP,$offsetof(%s:%p)\n", bits_in_pointer, new, show_ident(sym->ident), sym);
807 return new;
810 static int show_symbol_init(struct symbol *sym)
812 struct expression *expr = sym->initializer;
814 if (expr) {
815 int val, addr, bits;
817 bits = expr->ctype->bit_size;
818 val = show_expression(expr);
819 addr = show_symbol_expr(sym);
820 show_store_gen(bits, val, NULL, addr);
822 return 0;
825 static int type_is_signed(struct symbol *sym)
827 if (sym->type == SYM_NODE)
828 sym = sym->ctype.base_type;
829 if (sym->type == SYM_PTR)
830 return 0;
831 return !(sym->ctype.modifiers & MOD_UNSIGNED);
834 static int show_cast_expr(struct expression *expr)
836 struct symbol *old_type, *new_type;
837 int op = show_expression(expr->cast_expression);
838 int oldbits, newbits;
839 int new, is_signed;
841 old_type = expr->cast_expression->ctype;
842 new_type = expr->cast_type;
844 oldbits = old_type->bit_size;
845 newbits = new_type->bit_size;
846 if (oldbits >= newbits)
847 return op;
848 new = new_pseudo();
849 is_signed = type_is_signed(old_type);
850 if (is_signed) {
851 printf("\tsext%d.%d\tv%d,v%d\n", oldbits, newbits, new, op);
852 } else {
853 printf("\tandl.%d\t\tv%d,v%d,$%lu\n", newbits, new, op, (1UL << oldbits)-1);
855 return new;
858 static int show_value(struct expression *expr)
860 int new = new_pseudo();
861 unsigned long long value = expr->value;
863 printf("\tmovi.%d\t\tv%d,$%llu\n", expr->ctype->bit_size, new, value);
864 return new;
867 static int show_fvalue(struct expression *expr)
869 int new = new_pseudo();
870 long double value = expr->fvalue;
872 printf("\tmovf.%d\t\tv%d,$%Lf\n", expr->ctype->bit_size, new, value);
873 return new;
876 static int show_string_expr(struct expression *expr)
878 int new = new_pseudo();
880 printf("\tmovi.%d\t\tv%d,&%s\n", bits_in_pointer, new, show_string(expr->string));
881 return new;
884 static int show_bitfield_expr(struct expression *expr)
886 return show_access(expr);
889 int show_label_expr(struct expression *expr)
891 int new = new_pseudo();
892 printf("\tmovi.%d\t\tv%d,.L%p\n",bits_in_pointer, new, expr->label_symbol);
893 return new;
896 static int show_conditional_expr(struct expression *expr)
898 int cond = show_expression(expr->conditional);
899 int true = show_expression(expr->cond_true);
900 int false = show_expression(expr->cond_false);
901 int new = new_pseudo();
903 if (!true)
904 true = cond;
905 printf("[v%d]\tcmov.%d\t\tv%d,v%d,v%d\n", cond, expr->ctype->bit_size, new, true, false);
906 return new;
909 static int show_statement_expr(struct expression *expr)
911 return show_statement(expr->statement);
914 static int show_position_expr(struct expression *expr, struct symbol *base)
916 int new = show_expression(expr->init_expr);
917 struct symbol *ctype = expr->init_sym;
919 printf("\tinsert v%d at [%d:%d] of %s\n", new,
920 expr->init_offset, ctype->bit_offset,
921 show_ident(base->ident));
922 return 0;
925 static int show_initializer_expr(struct expression *expr, struct symbol *ctype)
927 struct expression *entry;
929 FOR_EACH_PTR(expr->expr_list, entry) {
930 // Nested initializers have their positions already
931 // recursively calculated - just output them too
932 if (entry->type == EXPR_INITIALIZER) {
933 show_initializer_expr(entry, ctype);
934 continue;
937 // Ignore initializer indexes and identifiers - the
938 // evaluator has taken them into account
939 if (entry->type == EXPR_IDENTIFIER || entry->type == EXPR_INDEX)
940 continue;
941 if (entry->type == EXPR_POS) {
942 show_position_expr(entry, ctype);
943 continue;
945 show_initialization(ctype, entry);
946 } END_FOR_EACH_PTR(entry);
947 return 0;
950 int show_symbol_expr_init(struct symbol *sym)
952 struct expression *expr = sym->initializer;
954 if (expr)
955 show_expression(expr);
956 return show_symbol_expr(sym);
960 * Print out an expression. Return the pseudo that contains the
961 * variable.
963 int show_expression(struct expression *expr)
965 if (!expr)
966 return 0;
968 if (!expr->ctype) {
969 struct position *pos = &expr->pos;
970 printf("\tno type at %s:%d:%d\n",
971 input_streams[pos->stream].name,
972 pos->line, pos->pos);
973 return 0;
976 switch (expr->type) {
977 case EXPR_CALL:
978 return show_call_expression(expr);
980 case EXPR_ASSIGNMENT:
981 return show_assignment(expr);
983 case EXPR_BINOP:
984 case EXPR_COMMA:
985 case EXPR_COMPARE:
986 case EXPR_LOGICAL:
987 return show_binop(expr);
988 case EXPR_PREOP:
989 return show_preop(expr);
990 case EXPR_POSTOP:
991 return show_postop(expr);
992 case EXPR_SYMBOL:
993 return show_symbol_expr(expr->symbol);
994 case EXPR_DEREF:
995 case EXPR_SIZEOF:
996 case EXPR_ALIGNOF:
997 warning(expr->pos, "invalid expression after evaluation");
998 return 0;
999 case EXPR_CAST:
1000 return show_cast_expr(expr);
1001 case EXPR_VALUE:
1002 return show_value(expr);
1003 case EXPR_FVALUE:
1004 return show_fvalue(expr);
1005 case EXPR_STRING:
1006 return show_string_expr(expr);
1007 case EXPR_BITFIELD:
1008 return show_bitfield_expr(expr);
1009 case EXPR_INITIALIZER:
1010 return show_initializer_expr(expr, expr->ctype);
1011 case EXPR_SELECT:
1012 case EXPR_CONDITIONAL:
1013 return show_conditional_expr(expr);
1014 case EXPR_STATEMENT:
1015 return show_statement_expr(expr);
1016 case EXPR_LABEL:
1017 return show_label_expr(expr);
1018 case EXPR_SLICE:
1019 return show_slice(expr);
1021 // None of these should exist as direct expressions: they are only
1022 // valid as sub-expressions of initializers.
1023 case EXPR_POS:
1024 warning(expr->pos, "unable to show plain initializer position expression");
1025 return 0;
1026 case EXPR_IDENTIFIER:
1027 warning(expr->pos, "unable to show identifier expression");
1028 return 0;
1029 case EXPR_INDEX:
1030 warning(expr->pos, "unable to show index expression");
1031 return 0;
1032 case EXPR_TYPE:
1033 warning(expr->pos, "unable to show type expression");
1034 return 0;
1036 return 0;