- split array.h into array.h/array_t.h and make array.h independent of
[libfirm] / ir / common / statistics.c
1 /*
2  * Copyright (C) 1995-2008 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   ir_graph *old = current_ir_graph;
51
52 #ifdef INTERPROCEDURAL_VIEW
53   int view = get_interprocedural_view();
54   set_interprocedural_view(0);
55 #endif
56
57   for (i = 0; i < get_irp_n_irgs(); i++) {
58     counter = 0;
59     irg_walk_graph(get_irp_irg(i), count_nodes, NULL, &counter);
60     if (verbosity == 1)
61       printf(" +%4d nodes in graph %s.\n", counter, get_entity_name(get_irg_entity(get_irp_irg(i))));
62     total += counter;
63   }
64   printf(" +++ There are %d graphs with total %d nodes.\n", get_irp_n_irgs(), total);
65
66   current_ir_graph = old;
67 #ifdef INTERPROCEDURAL_VIEW
68   set_interprocedural_view(view);
69 #endif
70 }
71
72 /** Prints number of types, number of entities and totals.
73  *   */
74 void print_type_counts(int verbosity) {
75   int i, counter, total = 0;
76   for (i = 0; i < get_irp_n_types(); i++) {
77     ir_type *tp = get_irp_type(i);
78     counter = -1;
79     if (is_Class_type(tp)) counter = get_class_n_members(tp);
80     if (is_Struct_type(tp)) counter = get_struct_n_members(tp);
81     if (is_Union_type(tp)) counter = get_union_n_members(tp);
82     if (counter > -1) {
83       if (verbosity == 1)
84     printf(" +%3d entities in %s type %s.\n", counter, get_type_tpop_name(tp), get_type_name(tp));
85       total += counter;
86     }
87   }
88   printf(" +++ There are %d types with total %d entities.\n", get_irp_n_types(), total);
89   printf(" +++ Global type has %d entities\n",
90      get_class_n_members(get_glob_type()));
91
92 }
93
94 /** Prints number of tarvals.
95  *   */
96 void print_tarval_counts(int verbosity) {
97   (void) verbosity;
98   printf("tarval count not implemented.\n\n");
99 }
100
101 /** Prints number of idents.
102  *   */
103 void print_ident_counts(int verbosity) {
104   (void) verbosity;
105   printf("ident count not implemented.\n\n");
106 }
107
108
109 void print_all_counts(int verbosity) {
110   printf(" +++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
111   print_graph_counts(verbosity);
112   printf(" +++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
113   print_type_counts(verbosity);
114   printf(" +++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
115   /*
116   print_tarval_counts(verbosity);
117   printf(" +++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
118   print_ident_counts(verbosity);
119   printf(" +++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
120   */
121 }