fix
[libfirm] / ir / common / statistics.c
1 /*
2  * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief    Compute statistics about firm library.
23  * @author   Goetz Lindenmaier
24  * @version  $Id$
25  */
26 #ifdef HAVE_CONFIG_H
27 # include "config.h"
28 #endif
29
30 #include "statistics.h"
31 #include "irgraph_t.h"
32 #include "irnode_t.h"
33 #include "irprog.h"
34 #include "irgwalk.h"
35
36 /***********************************************************************/
37 /* Statistics about allocated datastructures: counts.                  */
38
39 static void count_nodes(ir_node *n, void *env) {
40         int * counter_ptr = (int *)env;
41         (void) n;
42         (*counter_ptr)++;
43 }
44
45
46 /** Prints number of irgraphs, number of nodes in them and
47  *  totals. */
48 void print_graph_counts(int verbosity) {
49   int i, counter, total = 0;
50   int view = get_interprocedural_view();
51   ir_graph *old = current_ir_graph;
52
53   set_interprocedural_view(0);
54
55   for (i = 0; i < get_irp_n_irgs(); i++) {
56     counter = 0;
57     irg_walk_graph(get_irp_irg(i), count_nodes, NULL, &counter);
58     if (verbosity == 1)
59       printf(" +%4d nodes in graph %s.\n", counter, get_entity_name(get_irg_entity(get_irp_irg(i))));
60     total += counter;
61   }
62   printf(" +++ There are %d graphs with total %d nodes.\n", get_irp_n_irgs(), total);
63
64   current_ir_graph = old;
65   set_interprocedural_view(view);
66 }
67
68 /** Prints number of types, number of entities and totals.
69  *   */
70 void print_type_counts(int verbosity) {
71   int i, counter, total = 0;
72   for (i = 0; i < get_irp_n_types(); i++) {
73     ir_type *tp = get_irp_type(i);
74     counter = -1;
75     if (is_Class_type(tp)) counter = get_class_n_members(tp);
76     if (is_Struct_type(tp)) counter = get_struct_n_members(tp);
77     if (is_Union_type(tp)) counter = get_union_n_members(tp);
78     if (counter > -1) {
79       if (verbosity == 1)
80     printf(" +%3d entities in %s type %s.\n", counter, get_type_tpop_name(tp), get_type_name(tp));
81       total += counter;
82     }
83   }
84   printf(" +++ There are %d types with total %d entities.\n", get_irp_n_types(), total);
85   printf(" +++ Global type has %d entities\n",
86      get_class_n_members(get_glob_type()));
87
88 }
89
90 /** Prints number of tarvals.
91  *   */
92 void print_tarval_counts(int verbosity) {
93   (void) verbosity;
94   printf("tarval count not implemented.\n\n");
95 }
96
97 /** Prints number of idents.
98  *   */
99 void print_ident_counts(int verbosity) {
100   (void) verbosity;
101   printf("ident count not implemented.\n\n");
102 }
103
104
105 void print_all_counts(int verbosity) {
106   printf(" +++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
107   print_graph_counts(verbosity);
108   printf(" +++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
109   print_type_counts(verbosity);
110   printf(" +++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
111   /*
112   print_tarval_counts(verbosity);
113   printf(" +++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
114   print_ident_counts(verbosity);
115   printf(" +++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
116   */
117 }