1 #include <stdio.h> 2 #include "allocate.h" 3 #include "linearize.h" 4 #include "storage.h" 5 6 __DECLARE_ALLOCATOR(struct ptr_list, ptrlist); 7 8 9 typedef void (*get_t)(struct allocator_stats*); 10 11 static void show_stats(get_t get, struct allocator_stats * tot) 12 { 13 struct allocator_stats x; 14 15 if (get) 16 get(&x); 17 else 18 x = *tot; 19 fprintf(stderr, "%16s: %8d, %10ld, %10ld, %6.2f%%, %8.2f\n", 20 x.name, x.allocations, x.useful_bytes, x.total_bytes, 21 100 * (double) x.useful_bytes / (x.total_bytes ? : 1), 22 (double) x.useful_bytes / (x.allocations ? : 1)); 23 24 tot->allocations += x.allocations; 25 tot->useful_bytes += x.useful_bytes; 26 tot->total_bytes += x.total_bytes; 27 } 28 29 void show_allocation_stats(void) 30 { 31 struct allocator_stats tot = { .name = "total", }; 32 33 fprintf(stderr, "%16s: %8s, %10s, %10s, %7s, %8s\n", "allocator", "allocs", 34 "bytes", "total", "%usage", "average"); 35 show_stats(get_token_stats, &tot); 36 show_stats(get_ident_stats, &tot); 37 show_stats(get_symbol_stats, &tot); 38 show_stats(get_expression_stats, &tot); 39 show_stats(get_statement_stats, &tot); 40 show_stats(get_scope_stats, &tot); 41 show_stats(get_basic_block_stats, &tot); 42 show_stats(get_instruction_stats, &tot); 43 show_stats(get_pseudo_stats, &tot); 44 show_stats(get_pseudo_user_stats, &tot); 45 show_stats(get_ptrlist_stats, &tot); 46 show_stats(get_multijmp_stats, &tot); 47 show_stats(get_asm_rules_stats, &tot); 48 show_stats(get_asm_constraint_stats, &tot); 49 show_stats(get_context_stats, &tot); 50 show_stats(get_string_stats, &tot); 51 show_stats(get_bytes_stats, &tot); 52 //show_stats(get_storage_stats, &tot); 53 //show_stats(get_storage_hash_stats, &tot); 54 55 show_stats(NULL, &tot); 56 } 57 58 void report_stats(void) 59 { 60 if (fmem_report) 61 show_allocation_stats(); 62 }