/* Print all declarations */ void print_decls(Decls decls, char* proc_id) { Decl first = decls->first; Decls rest = decls->rest; if (first) { print_decl(first, proc_id); } if (rest) { print_decls(rest, proc_id); } }
void print_stmt(stmt *t) { idt_printf("statement: %s\n", t->f_str()); if(t->flow){ gen_str_indent++; print_stmt_flow(t->flow); gen_str_indent--; } PRINT_IF(t, expr, print_expr); PRINT_IF(t, lhs, print_stmt); PRINT_IF(t, rhs, print_stmt); PRINT_IF(t, rhs, print_stmt); if(stmt_kind(t, code)){ idt_printf("structs/unions/enums:\n"); gen_str_indent++; print_sues_static_asserts(t->symtab); gen_str_indent--; if(t->symtab){ decl **iter; idt_printf("stack space %d\n", t->symtab->auto_total_size); idt_printf("decls:\n"); for(iter = t->symtab->decls; iter && *iter; iter++){ decl *d = *iter; gen_str_indent++; print_decl(d, PDECL_INDENT | PDECL_NEWLINE | PDECL_SYM_OFFSET | PDECL_ATTR | PDECL_PINIT); gen_str_indent--; } } if(t->bits.code.stmts){ stmt **iter; idt_printf("code:\n"); for(iter = t->bits.code.stmts; *iter; iter++){ gen_str_indent++; print_stmt(*iter); gen_str_indent--; } } } }
void gen_str(symtable_global *symtab) { decl **diter; print_sues_static_asserts(&symtab->stab); for(diter = symtab->stab.decls; diter && *diter; diter++){ decl *const d = *diter; print_decl(d, PDECL_INDENT | PDECL_NEWLINE | PDECL_FUNC_DESCEND | PDECL_SIZE | PDECL_PINIT | PDECL_ATTR); if(gen_str_indent != 0) fprintf(stderr, "indent (%d) not reset after %s\n", gen_str_indent, d->spel); } }
static void print_struct(struct_union_enum_st *sue) { sue_member **iter; if(!sue_complete(sue)){ idt_printf("incomplete %s %s\n", sue_str(sue), sue->spel); return; } idt_printf("%s %s (size %d):\n", sue_str(sue), sue->spel, sue_size(sue, &sue->where)); gen_str_indent++; for(iter = sue->members; iter && *iter; iter++){ decl *d = (*iter)->struct_member; idt_printf("decl %s:\n", d->spel ? d->spel : "<anon>"); gen_str_indent++; print_decl(d, PDECL_INDENT | PDECL_NEWLINE | PDECL_ATTR); if(!type_is(d->ref, type_func)){ #define SHOW_FIELD(nam) idt_printf("." #nam " = %u\n", d->bits.var.nam) SHOW_FIELD(struct_offset); if(d->bits.var.field_width){ integral_t v = const_fold_val_i(d->bits.var.field_width); gen_str_indent++; idt_printf(".field_width = %" NUMERIC_FMT_D "\n", v); SHOW_FIELD(struct_offset_bitfield); gen_str_indent--; } } gen_str_indent--; } gen_str_indent--; }
static void print_type_eng(type *ref) { if(!ref) return; print_type_eng(ref->ref); switch(ref->type){ case type_auto: ICE("__auto_type"); case type_cast: if(ref->bits.cast.is_signed_cast) fprintf(cc1_out, "%s ", ref->bits.cast.signed_true ? "signed" : "unsigned"); else fprintf(cc1_out, "%s", type_qual_to_str(ref->bits.cast.qual, 1)); break; case type_ptr: fprintf(cc1_out, "pointer to "); break; case type_block: fprintf(cc1_out, "block returning "); break; case type_func: { #ifdef ENGLISH_PRINT_ARGLIST funcargs *fargs = ref->bits.func.args; decl **iter; #endif fputs("function", cc1_out); #ifdef ENGLISH_PRINT_ARGLIST fputc('(', cc1_out); if(fargs->arglist){ for(iter = fargs->arglist; iter && *iter; iter++){ print_decl(*iter, PDECL_NONE); if(iter[1]) fputs(", ", cc1_out); } if(fargs->variadic) fputs("variadic", cc1_out); }else{ fprintf(cc1_out, "taking %s arguments", fargs->args_void ? "no" : "unspecified"); } fputc(')', cc1_out); #endif fputs(" returning ", cc1_out); break; } case type_array: fputs("array[", cc1_out); if(ref->bits.array.size) print_expr_val(ref->bits.array.size); fputs("] of ", cc1_out); break; case type_btype: fprintf(cc1_out, "%s", btype_to_str(ref->bits.type)); break; case type_tdef: case type_attr: ICE("TODO"); case type_where: break; } }