[PATCH] Warning for mixing enums of different types
[smatch.git] / show-parse.c
blob70a5b08612e1aeabf93c600538a7339021999119
1 /*
2 * sparse/show-parse.c
4 * Copyright (C) 2003 Transmeta Corp.
5 * 2003-2004 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 "allocate.h"
21 #include "token.h"
22 #include "parse.h"
23 #include "symbol.h"
24 #include "scope.h"
25 #include "expression.h"
26 #include "target.h"
28 static int show_symbol_expr(struct symbol *sym);
29 static int show_string_expr(struct expression *expr);
31 static void do_debug_symbol(struct symbol *sym, int indent)
33 static const char indent_string[] = " ";
34 static const char *typestr[] = {
35 [SYM_UNINITIALIZED] = "none",
36 [SYM_PREPROCESSOR] = "cpp.",
37 [SYM_BASETYPE] = "base",
38 [SYM_NODE] = "node",
39 [SYM_PTR] = "ptr.",
40 [SYM_FN] = "fn..",
41 [SYM_ARRAY] = "arry",
42 [SYM_STRUCT] = "strt",
43 [SYM_UNION] = "unin",
44 [SYM_ENUM] = "enum",
45 [SYM_TYPEDEF] = "tdef",
46 [SYM_TYPEOF] = "tpof",
47 [SYM_MEMBER] = "memb",
48 [SYM_BITFIELD] = "bitf",
49 [SYM_LABEL] = "labl",
50 [SYM_RESTRICT] = "rstr",
51 [SYM_BAD] = "bad.",
54 if (!sym)
55 return;
56 fprintf(stderr, "%.*s%s%3d:%lu %lx %s (as: %d, context: %x:%x) %p (%s:%d:%d)\n",
57 indent, indent_string, typestr[sym->type],
58 sym->bit_size, sym->ctype.alignment,
59 sym->ctype.modifiers, show_ident(sym->ident),
60 sym->ctype.as, sym->ctype.in_context, sym->ctype.out_context,
61 sym, stream_name(sym->pos.stream), sym->pos.line, sym->pos.pos);
62 if (sym->type == SYM_FN) {
63 int i = 1;
64 struct symbol *arg;
65 FOR_EACH_PTR(sym->arguments, arg) {
66 fprintf(stderr, "< arg%d:\n", i);
67 do_debug_symbol(arg, 0);
68 fprintf(stderr, " end arg%d >\n", i);
69 i++;
70 } END_FOR_EACH_PTR(arg);
72 do_debug_symbol(sym->ctype.base_type, indent+2);
75 void debug_symbol(struct symbol *sym)
77 do_debug_symbol(sym, 0);
81 * Symbol type printout. The type system is by far the most
82 * complicated part of C - everything else is trivial.
84 const char *modifier_string(unsigned long mod)
86 static char buffer[100];
87 char *p = buffer;
88 const char *res,**ptr, *names[] = {
89 "auto", "register", "static", "extern",
90 "const", "volatile", "[signed]", "[unsigned]",
91 "[char]", "[short]", "[long]", "[long]",
92 "[typdef]", "[structof]", "[unionof]", "[enum]",
93 "[typeof]", "[attribute]", "inline", "[addressable]",
94 "[nocast]", "[noderef]", "[accessed]", "[toplevel]",
95 "[label]", "[assigned]", "[type]", "[safe]",
96 "[usertype]", "[force]", "[explicitly-signed]",
97 NULL
99 ptr = names;
100 while ((res = *ptr++) != NULL) {
101 if (mod & 1) {
102 char c;
103 while ((c = *res++) != '\0')
104 *p++ = c;
105 *p++ = ' ';
107 mod >>= 1;
109 *p = 0;
110 return buffer;
113 static void show_struct_member(struct symbol *sym)
115 printf("\t%s:%d:%ld at offset %ld.%d", show_ident(sym->ident), sym->bit_size, sym->ctype.alignment, sym->offset, sym->bit_offset);
116 printf("\n");
119 void show_symbol_list(struct symbol_list *list, const char *sep)
121 struct symbol *sym;
122 const char *prepend = "";
124 FOR_EACH_PTR(list, sym) {
125 puts(prepend);
126 prepend = ", ";
127 show_symbol(sym);
128 } END_FOR_EACH_PTR(sym);
131 struct type_name {
132 char *start;
133 char *end;
136 static void prepend(struct type_name *name, const char *fmt, ...)
138 static char buffer[512];
139 int n;
141 va_list args;
142 va_start(args, fmt);
143 n = vsprintf(buffer, fmt, args);
144 va_end(args);
146 name->start -= n;
147 memcpy(name->start, buffer, n);
150 static void append(struct type_name *name, const char *fmt, ...)
152 static char buffer[512];
153 int n;
155 va_list args;
156 va_start(args, fmt);
157 n = vsprintf(buffer, fmt, args);
158 va_end(args);
160 memcpy(name->end, buffer, n);
161 name->end += n;
164 static void do_show_type(struct symbol *sym, struct type_name *name)
166 int i, modlen;
167 const char *mod;
168 static struct ctype_name {
169 struct symbol *sym;
170 const char *name;
171 } typenames[] = {
172 { & char_ctype, "char" },
173 { &schar_ctype, "signed char" },
174 { &uchar_ctype, "unsigned char" },
175 { & short_ctype, "short" },
176 { &sshort_ctype, "signed short" },
177 { &ushort_ctype, "unsigned short" },
178 { & int_ctype, "int" },
179 { &sint_ctype, "signed int" },
180 { &uint_ctype, "unsigned int" },
181 { &slong_ctype, "signed long" },
182 { & long_ctype, "long" },
183 { &ulong_ctype, "unsigned long" },
184 { & llong_ctype, "long long" },
185 { &sllong_ctype, "signed long long" },
186 { &ullong_ctype, "unsigned long long" },
188 { &void_ctype, "void" },
189 { &bool_ctype, "bool" },
190 { &string_ctype, "string" },
192 { &float_ctype, "float" },
193 { &double_ctype, "double" },
194 { &ldouble_ctype,"long double" },
195 { &incomplete_ctype, "incomplete type" },
196 { &label_ctype, "label type" },
197 { &bad_ctype, "bad type" },
200 if (!sym)
201 return;
203 for (i = 0; i < sizeof(typenames)/sizeof(typenames[0]); i++) {
204 if (typenames[i].sym == sym) {
205 int len = strlen(typenames[i].name);
206 *--name->start = ' ';
207 name->start -= len;
208 memcpy(name->start, typenames[i].name, len);
209 return;
213 /* Prepend */
214 switch (sym->type) {
215 case SYM_PTR:
216 prepend(name, "*");
217 break;
218 case SYM_FN:
219 prepend(name, "( ");
220 break;
221 case SYM_STRUCT:
222 prepend(name, "struct %s ", show_ident(sym->ident));
223 return;
225 case SYM_UNION:
226 prepend(name, "union %s ", show_ident(sym->ident));
227 return;
229 case SYM_ENUM:
230 prepend(name, "enum %s ", show_ident(sym->ident));
231 break;
233 case SYM_NODE:
234 append(name, "%s", show_ident(sym->ident));
235 break;
237 case SYM_BITFIELD:
238 append(name, ":%d", sym->bit_size);
239 break;
241 case SYM_LABEL:
242 append(name, "label(%s:%p)", show_ident(sym->ident), sym);
243 break;
245 case SYM_ARRAY:
246 break;
248 case SYM_RESTRICT:
249 break;
251 default:
252 prepend(name, "unknown type %d", sym->type);
253 return;
256 mod = modifier_string(sym->ctype.modifiers);
257 modlen = strlen(mod);
258 name->start -= modlen;
259 memcpy(name->start, mod, modlen);
261 do_show_type(sym->ctype.base_type, name);
263 /* Postpend */
264 if (sym->ctype.as)
265 append(name, "<asn:%d>", sym->ctype.as);
267 switch (sym->type) {
268 case SYM_PTR:
269 return;
271 case SYM_FN:
272 append(name, " )( ... )");
273 return;
275 case SYM_ARRAY:
276 append(name, "[%lld]", get_expression_value(sym->array_size));
277 return;
279 case SYM_RESTRICT:
280 prepend(name, "restricted ");
281 return;
283 default:
284 break;
288 void show_type(struct symbol *sym)
290 char array[200];
291 struct type_name name;
293 name.start = name.end = array+100;
294 do_show_type(sym, &name);
295 *name.end = 0;
296 printf("%s", name.start);
299 const char *show_typename(struct symbol *sym)
301 static char array[200];
302 struct type_name name;
304 name.start = name.end = array+100;
305 do_show_type(sym, &name);
306 *name.end = 0;
307 return name.start;
310 void show_symbol(struct symbol *sym)
312 struct symbol *type;
314 if (!sym)
315 return;
317 if (sym->ctype.alignment)
318 printf(".align %ld\n", sym->ctype.alignment);
320 show_type(sym);
321 type = sym->ctype.base_type;
322 if (!type)
323 return;
326 * Show actual implementation information
328 switch (type->type) {
329 struct symbol *member;
331 case SYM_STRUCT:
332 case SYM_UNION:
333 printf(" {\n");
334 FOR_EACH_PTR(type->symbol_list, member) {
335 show_struct_member(member);
336 } END_FOR_EACH_PTR(member);
337 printf("}\n");
338 break;
340 case SYM_FN: {
341 struct statement *stmt = type->stmt;
342 if (stmt) {
343 int val;
344 printf("\n");
345 val = show_statement(stmt);
346 if (val)
347 printf("\tmov.%d\t\tretval,%d\n", stmt->ret->bit_size, val);
348 printf("\tret\n");
350 break;
353 default:
354 break;
357 if (sym->initializer) {
358 printf(" = \n");
359 show_expression(sym->initializer);
363 static int show_symbol_init(struct symbol *sym);
365 static int new_pseudo(void)
367 static int nr = 0;
368 return ++nr;
371 static int new_label(void)
373 static int label = 0;
374 return ++label;
377 static void show_switch_statement(struct statement *stmt)
379 int val = show_expression(stmt->switch_expression);
380 struct symbol *sym;
381 printf("\tswitch v%d\n", val);
384 * Debugging only: Check that the case list is correct
385 * by printing it out.
387 * This is where a _real_ back-end would go through the
388 * cases to decide whether to use a lookup table or a
389 * series of comparisons etc
391 printf("# case table:\n");
392 FOR_EACH_PTR(stmt->switch_case->symbol_list, sym) {
393 struct statement *case_stmt = sym->stmt;
394 struct expression *expr = case_stmt->case_expression;
395 struct expression *to = case_stmt->case_to;
397 if (!expr) {
398 printf(" default");
399 } else {
400 if (expr->type == EXPR_VALUE) {
401 printf(" case %lld", expr->value);
402 if (to) {
403 if (to->type == EXPR_VALUE) {
404 printf(" .. %lld", to->value);
405 } else {
406 printf(" .. what?");
409 } else
410 printf(" what?");
412 printf(": .L%p\n", sym->bb_target);
413 } END_FOR_EACH_PTR(sym);
414 printf("# end case table\n");
416 show_statement(stmt->switch_statement);
418 if (stmt->switch_break->used)
419 printf(".L%p:\n", stmt->switch_break->bb_target);
422 static void show_symbol_decl(struct symbol_list *syms)
424 struct symbol *sym;
425 FOR_EACH_PTR(syms, sym) {
426 show_symbol_init(sym);
427 } END_FOR_EACH_PTR(sym);
430 static int show_return_stmt(struct statement *stmt);
433 * Print out a statement
435 int show_statement(struct statement *stmt)
437 if (!stmt)
438 return 0;
439 switch (stmt->type) {
440 case STMT_DECLARATION:
441 show_symbol_decl(stmt->declaration);
442 return 0;
443 case STMT_RETURN:
444 return show_return_stmt(stmt);
445 case STMT_COMPOUND: {
446 struct statement *s;
447 int last = 0;
449 FOR_EACH_PTR(stmt->stmts, s) {
450 last = show_statement(s);
451 } END_FOR_EACH_PTR(s);
452 if (stmt->ret) {
453 int addr, bits;
454 printf(".L%p:\n", stmt->ret);
455 addr = show_symbol_expr(stmt->ret);
456 bits = stmt->ret->bit_size;
457 last = new_pseudo();
458 printf("\tld.%d\t\tv%d,[v%d]\n", bits, last, addr);
460 return last;
463 case STMT_EXPRESSION:
464 return show_expression(stmt->expression);
465 case STMT_IF: {
466 int val, target;
467 struct expression *cond = stmt->if_conditional;
469 /* This is only valid if nobody can jump into the "dead" statement */
470 #if 0
471 if (cond->type == EXPR_VALUE) {
472 struct statement *s = stmt->if_true;
473 if (!cond->value)
474 s = stmt->if_false;
475 show_statement(s);
476 break;
478 #endif
479 val = show_expression(cond);
480 target = new_label();
481 printf("\tje\t\tv%d,.L%d\n", val, target);
482 show_statement(stmt->if_true);
483 if (stmt->if_false) {
484 int last = new_label();
485 printf("\tjmp\t\t.L%d\n", last);
486 printf(".L%d:\n", target);
487 target = last;
488 show_statement(stmt->if_false);
490 printf(".L%d:\n", target);
491 break;
493 case STMT_SWITCH:
494 show_switch_statement(stmt);
495 break;
497 case STMT_CASE:
498 printf(".L%p:\n", stmt->case_label);
499 show_statement(stmt->case_statement);
500 break;
502 case STMT_ITERATOR: {
503 struct statement *pre_statement = stmt->iterator_pre_statement;
504 struct expression *pre_condition = stmt->iterator_pre_condition;
505 struct statement *statement = stmt->iterator_statement;
506 struct statement *post_statement = stmt->iterator_post_statement;
507 struct expression *post_condition = stmt->iterator_post_condition;
508 int val, loop_top = 0, loop_bottom = 0;
510 show_symbol_decl(stmt->iterator_syms);
511 show_statement(pre_statement);
512 if (pre_condition) {
513 if (pre_condition->type == EXPR_VALUE) {
514 if (!pre_condition->value) {
515 loop_bottom = new_label();
516 printf("\tjmp\t\t.L%d\n", loop_bottom);
518 } else {
519 loop_bottom = new_label();
520 val = show_expression(pre_condition);
521 printf("\tje\t\tv%d, .L%d\n", val, loop_bottom);
524 if (!post_condition || post_condition->type != EXPR_VALUE || post_condition->value) {
525 loop_top = new_label();
526 printf(".L%d:\n", loop_top);
528 show_statement(statement);
529 if (stmt->iterator_continue->used)
530 printf(".L%p:\n", stmt->iterator_continue);
531 show_statement(post_statement);
532 if (!post_condition) {
533 printf("\tjmp\t\t.L%d\n", loop_top);
534 } else if (post_condition->type == EXPR_VALUE) {
535 if (post_condition->value)
536 printf("\tjmp\t\t.L%d\n", loop_top);
537 } else {
538 val = show_expression(post_condition);
539 printf("\tjne\t\tv%d, .L%d\n", val, loop_top);
541 if (stmt->iterator_break->used)
542 printf(".L%p:\n", stmt->iterator_break);
543 if (loop_bottom)
544 printf(".L%d:\n", loop_bottom);
545 break;
547 case STMT_NONE:
548 break;
550 case STMT_LABEL:
551 printf(".L%p:\n", stmt->label_identifier);
552 show_statement(stmt->label_statement);
553 break;
555 case STMT_GOTO:
556 if (stmt->goto_expression) {
557 int val = show_expression(stmt->goto_expression);
558 printf("\tgoto\t\t*v%d\n", val);
559 } else {
560 printf("\tgoto\t\t.L%p\n", stmt->goto_label->bb_target);
562 break;
563 case STMT_ASM:
564 printf("\tasm( .... )\n");
565 break;
566 case STMT_CONTEXT: {
567 int val = show_expression(stmt->expression);
568 printf("\tcontext( %d )\n", val);
569 break;
571 case STMT_RANGE: {
572 int val = show_expression(stmt->range_expression);
573 int low = show_expression(stmt->range_low);
574 int high = show_expression(stmt->range_high);
575 printf("\trange( %d %d-%d)\n", val, low, high);
576 break;
579 return 0;
582 static int show_call_expression(struct expression *expr)
584 struct symbol *direct;
585 struct expression *arg, *fn;
586 int fncall, retval;
587 int framesize;
589 if (!expr->ctype) {
590 warning(expr->pos, "\tcall with no type!");
591 return 0;
594 framesize = 0;
595 FOR_EACH_PTR_REVERSE(expr->args, arg) {
596 int new = show_expression(arg);
597 int size = arg->ctype->bit_size;
598 printf("\tpush.%d\t\tv%d\n", size, new);
599 framesize += size >> 3;
600 } END_FOR_EACH_PTR_REVERSE(arg);
602 fn = expr->fn;
604 /* Remove dereference, if any */
605 direct = NULL;
606 if (fn->type == EXPR_PREOP) {
607 if (fn->unop->type == EXPR_SYMBOL) {
608 struct symbol *sym = fn->unop->symbol;
609 if (sym->ctype.base_type->type == SYM_FN)
610 direct = sym;
613 if (direct) {
614 printf("\tcall\t\t%s\n", show_ident(direct->ident));
615 } else {
616 fncall = show_expression(fn);
617 printf("\tcall\t\t*v%d\n", fncall);
619 if (framesize)
620 printf("\tadd.%d\t\tvSP,vSP,$%d\n", bits_in_pointer, framesize);
622 retval = new_pseudo();
623 printf("\tmov.%d\t\tv%d,retval\n", expr->ctype->bit_size, retval);
624 return retval;
627 static int show_comma(struct expression *expr)
629 show_expression(expr->left);
630 return show_expression(expr->right);
633 static int show_binop(struct expression *expr)
635 int left = show_expression(expr->left);
636 int right = show_expression(expr->right);
637 int new = new_pseudo();
638 const char *opname;
639 static const char *name[] = {
640 ['+'] = "add", ['-'] = "sub",
641 ['*'] = "mul", ['/'] = "div",
642 ['%'] = "mod", ['&'] = "and",
643 ['|'] = "lor", ['^'] = "xor"
645 unsigned int op = expr->op;
647 opname = show_special(op);
648 if (op < sizeof(name)/sizeof(*name))
649 opname = name[op];
650 printf("\t%s.%d\t\tv%d,v%d,v%d\n", opname,
651 expr->ctype->bit_size,
652 new, left, right);
653 return new;
656 static int show_slice(struct expression *expr)
658 int target = show_expression(expr->base);
659 int new = new_pseudo();
660 printf("\tslice.%d\t\tv%d,v%d,%d\n", expr->r_nrbits, target, new, expr->r_bitpos);
661 return new;
664 static int show_regular_preop(struct expression *expr)
666 int target = show_expression(expr->unop);
667 int new = new_pseudo();
668 static const char *name[] = {
669 ['!'] = "nonzero", ['-'] = "neg",
670 ['~'] = "not",
672 unsigned int op = expr->op;
673 const char *opname;
675 opname = show_special(op);
676 if (op < sizeof(name)/sizeof(*name))
677 opname = name[op];
678 printf("\t%s.%d\t\tv%d,v%d\n", opname, expr->ctype->bit_size, new, target);
679 return new;
683 * FIXME! Not all accesses are memory loads. We should
684 * check what kind of symbol is behind the dereference.
686 static int show_address_gen(struct expression *expr)
688 return show_expression(expr->unop);
691 static int show_load_gen(int bits, struct expression *expr, int addr)
693 int new = new_pseudo();
695 printf("\tld.%d\t\tv%d,[v%d]\n", bits, new, addr);
696 return new;
699 static void show_store_gen(int bits, int value, struct expression *expr, int addr)
701 /* FIXME!!! Bitfield store! */
702 printf("\tst.%d\t\tv%d,[v%d]\n", bits, value, addr);
705 static int show_assignment(struct expression *expr)
707 struct expression *target = expr->left;
708 int val, addr, bits;
710 if (!expr->ctype)
711 return 0;
713 bits = expr->ctype->bit_size;
714 val = show_expression(expr->right);
715 addr = show_address_gen(target);
716 show_store_gen(bits, val, target, addr);
717 return val;
720 static int show_return_stmt(struct statement *stmt)
722 struct expression *expr = stmt->ret_value;
723 struct symbol *target = stmt->ret_target;
725 if (expr && expr->ctype) {
726 int val = show_expression(expr);
727 int bits = expr->ctype->bit_size;
728 int addr = show_symbol_expr(target);
729 show_store_gen(bits, val, NULL, addr);
731 printf("\tret\t\t(%p)\n", target);
732 return 0;
735 static int show_initialization(struct symbol *sym, struct expression *expr)
737 int val, addr, bits;
739 if (!expr->ctype)
740 return 0;
742 bits = expr->ctype->bit_size;
743 val = show_expression(expr);
744 addr = show_symbol_expr(sym);
745 // FIXME! The "target" expression is for bitfield store information.
746 // Leave it NULL, which works fine.
747 show_store_gen(bits, val, NULL, addr);
748 return 0;
751 static int show_access(struct expression *expr)
753 int addr = show_address_gen(expr);
754 return show_load_gen(expr->ctype->bit_size, expr, addr);
757 static int show_inc_dec(struct expression *expr, int postop)
759 int addr = show_address_gen(expr->unop);
760 int retval, new;
761 const char *opname = expr->op == SPECIAL_INCREMENT ? "add" : "sub";
762 int bits = expr->ctype->bit_size;
764 retval = show_load_gen(bits, expr->unop, addr);
765 new = retval;
766 if (postop)
767 new = new_pseudo();
768 printf("\t%s.%d\t\tv%d,v%d,$1\n", opname, bits, new, retval);
769 show_store_gen(bits, new, expr->unop, addr);
770 return retval;
773 static int show_preop(struct expression *expr)
776 * '*' is an lvalue access, and is fundamentally different
777 * from an arithmetic operation. Maybe it should have an
778 * expression type of its own..
780 if (expr->op == '*')
781 return show_access(expr);
782 if (expr->op == SPECIAL_INCREMENT || expr->op == SPECIAL_DECREMENT)
783 return show_inc_dec(expr, 0);
784 return show_regular_preop(expr);
787 static int show_postop(struct expression *expr)
789 return show_inc_dec(expr, 1);
792 static int show_symbol_expr(struct symbol *sym)
794 int new = new_pseudo();
796 if (sym->initializer && sym->initializer->type == EXPR_STRING)
797 return show_string_expr(sym->initializer);
799 if (sym->ctype.modifiers & (MOD_TOPLEVEL | MOD_EXTERN | MOD_STATIC)) {
800 printf("\tmovi.%d\t\tv%d,$%s\n", bits_in_pointer, new, show_ident(sym->ident));
801 return new;
803 if (sym->ctype.modifiers & MOD_ADDRESSABLE) {
804 printf("\taddi.%d\t\tv%d,vFP,$%lld\n", bits_in_pointer, new, sym->value);
805 return new;
807 printf("\taddi.%d\t\tv%d,vFP,$offsetof(%s:%p)\n", bits_in_pointer, new, show_ident(sym->ident), sym);
808 return new;
811 static int show_symbol_init(struct symbol *sym)
813 struct expression *expr = sym->initializer;
815 if (expr) {
816 int val, addr, bits;
818 bits = expr->ctype->bit_size;
819 val = show_expression(expr);
820 addr = show_symbol_expr(sym);
821 show_store_gen(bits, val, NULL, addr);
823 return 0;
826 static int type_is_signed(struct symbol *sym)
828 if (sym->type == SYM_NODE)
829 sym = sym->ctype.base_type;
830 if (sym->type == SYM_PTR)
831 return 0;
832 return !(sym->ctype.modifiers & MOD_UNSIGNED);
835 static int show_cast_expr(struct expression *expr)
837 struct symbol *old_type, *new_type;
838 int op = show_expression(expr->cast_expression);
839 int oldbits, newbits;
840 int new, is_signed;
842 old_type = expr->cast_expression->ctype;
843 new_type = expr->cast_type;
845 oldbits = old_type->bit_size;
846 newbits = new_type->bit_size;
847 if (oldbits >= newbits)
848 return op;
849 new = new_pseudo();
850 is_signed = type_is_signed(old_type);
851 if (is_signed) {
852 printf("\tsext%d.%d\tv%d,v%d\n", oldbits, newbits, new, op);
853 } else {
854 printf("\tandl.%d\t\tv%d,v%d,$%lu\n", newbits, new, op, (1UL << oldbits)-1);
856 return new;
859 static int show_value(struct expression *expr)
861 int new = new_pseudo();
862 unsigned long long value = expr->value;
864 printf("\tmovi.%d\t\tv%d,$%llu\n", expr->ctype->bit_size, new, value);
865 return new;
868 static int show_fvalue(struct expression *expr)
870 int new = new_pseudo();
871 long double value = expr->fvalue;
873 printf("\tmovf.%d\t\tv%d,$%Lf\n", expr->ctype->bit_size, new, value);
874 return new;
877 static int show_string_expr(struct expression *expr)
879 int new = new_pseudo();
881 printf("\tmovi.%d\t\tv%d,&%s\n", bits_in_pointer, new, show_string(expr->string));
882 return new;
885 static int show_label_expr(struct expression *expr)
887 int new = new_pseudo();
888 printf("\tmovi.%d\t\tv%d,.L%p\n",bits_in_pointer, new, expr->label_symbol);
889 return new;
892 static int show_conditional_expr(struct expression *expr)
894 int cond = show_expression(expr->conditional);
895 int true = show_expression(expr->cond_true);
896 int false = show_expression(expr->cond_false);
897 int new = new_pseudo();
899 printf("[v%d]\tcmov.%d\t\tv%d,v%d,v%d\n", cond, expr->ctype->bit_size, new, true, false);
900 return new;
903 static int show_statement_expr(struct expression *expr)
905 return show_statement(expr->statement);
908 static int show_position_expr(struct expression *expr, struct symbol *base)
910 int new = show_expression(expr->init_expr);
911 struct symbol *ctype = expr->init_expr->ctype;
912 int bit_offset;
914 bit_offset = ctype ? ctype->bit_offset : -1;
916 printf("\tinsert v%d at [%d:%d] of %s\n", new,
917 expr->init_offset, bit_offset,
918 show_ident(base->ident));
919 return 0;
922 static int show_initializer_expr(struct expression *expr, struct symbol *ctype)
924 struct expression *entry;
926 FOR_EACH_PTR(expr->expr_list, entry) {
928 again:
929 // Nested initializers have their positions already
930 // recursively calculated - just output them too
931 if (entry->type == EXPR_INITIALIZER) {
932 show_initializer_expr(entry, ctype);
933 continue;
936 // Initializer indexes and identifiers should
937 // have been evaluated to EXPR_POS
938 if (entry->type == EXPR_IDENTIFIER) {
939 printf(" AT '%s':\n", show_ident(entry->expr_ident));
940 entry = entry->ident_expression;
941 goto again;
944 if (entry->type == EXPR_INDEX) {
945 printf(" AT '%d..%d:\n", entry->idx_from, entry->idx_to);
946 entry = entry->idx_expression;
947 goto again;
949 if (entry->type == EXPR_POS) {
950 show_position_expr(entry, ctype);
951 continue;
953 show_initialization(ctype, entry);
954 } END_FOR_EACH_PTR(entry);
955 return 0;
958 int show_symbol_expr_init(struct symbol *sym)
960 struct expression *expr = sym->initializer;
962 if (expr)
963 show_expression(expr);
964 return show_symbol_expr(sym);
968 * Print out an expression. Return the pseudo that contains the
969 * variable.
971 int show_expression(struct expression *expr)
973 if (!expr)
974 return 0;
976 if (!expr->ctype) {
977 struct position *pos = &expr->pos;
978 printf("\tno type at %s:%d:%d\n",
979 stream_name(pos->stream),
980 pos->line, pos->pos);
981 return 0;
984 switch (expr->type) {
985 case EXPR_CALL:
986 return show_call_expression(expr);
988 case EXPR_ASSIGNMENT:
989 return show_assignment(expr);
991 case EXPR_COMMA:
992 return show_comma(expr);
993 case EXPR_BINOP:
994 case EXPR_COMPARE:
995 case EXPR_LOGICAL:
996 return show_binop(expr);
997 case EXPR_PREOP:
998 return show_preop(expr);
999 case EXPR_POSTOP:
1000 return show_postop(expr);
1001 case EXPR_SYMBOL:
1002 return show_symbol_expr(expr->symbol);
1003 case EXPR_DEREF:
1004 case EXPR_SIZEOF:
1005 case EXPR_PTRSIZEOF:
1006 case EXPR_ALIGNOF:
1007 warning(expr->pos, "invalid expression after evaluation");
1008 return 0;
1009 case EXPR_CAST:
1010 case EXPR_IMPLIED_CAST:
1011 return show_cast_expr(expr);
1012 case EXPR_VALUE:
1013 return show_value(expr);
1014 case EXPR_FVALUE:
1015 return show_fvalue(expr);
1016 case EXPR_STRING:
1017 return show_string_expr(expr);
1018 case EXPR_INITIALIZER:
1019 return show_initializer_expr(expr, expr->ctype);
1020 case EXPR_SELECT:
1021 case EXPR_CONDITIONAL:
1022 return show_conditional_expr(expr);
1023 case EXPR_STATEMENT:
1024 return show_statement_expr(expr);
1025 case EXPR_LABEL:
1026 return show_label_expr(expr);
1027 case EXPR_SLICE:
1028 return show_slice(expr);
1030 // None of these should exist as direct expressions: they are only
1031 // valid as sub-expressions of initializers.
1032 case EXPR_POS:
1033 warning(expr->pos, "unable to show plain initializer position expression");
1034 return 0;
1035 case EXPR_IDENTIFIER:
1036 warning(expr->pos, "unable to show identifier expression");
1037 return 0;
1038 case EXPR_INDEX:
1039 warning(expr->pos, "unable to show index expression");
1040 return 0;
1041 case EXPR_TYPE:
1042 warning(expr->pos, "unable to show type expression");
1043 return 0;
1045 return 0;