BugFix for generated functions
[libfirm] / ir / ir / irflag.c
1 /*
2  * Project:     libFIRM
3  * File name:   ir/ir/irflag.c
4  * Purpose:     Flags to control optimizations.
5  * Author:      Christian Schaefer, Goetz Lindenmaier
6  * Modified by:
7  * Created:
8  * CVS-ID:      $Id$
9  * Copyright:   (c) 1999-2003 Universität Karlsruhe
10  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
11  */
12
13 #ifdef HAVE_CONFIG_H
14 # include "config.h"
15 #endif
16
17 #include "firm_common.h"
18 #include "irflag_t.h"
19
20 /* DISABLE - don't do this optimization
21    ENABLE  - lets see, if there is a better graph */
22 #define ON      (-1)
23 #define OFF  (0)
24
25 #define FLAG(name, value, def)  (irf_##name & def) |
26 #define E_FLAG(name, value, def)        FLAG(name, value, def)
27 #define I_FLAG(name, value, def)        FLAG(name, value, def)
28
29 optimization_state_t libFIRM_opt =
30 #include "irflag_t.def"
31   0;
32
33 #undef FLAG
34 #undef E_FLAG
35 #undef I_FLAG
36
37
38 /* verbose is always off on default */
39 optimization_state_t libFIRM_verb = 0;
40
41 /** The Firm verbosity level */
42 int firm_verbosity_level;
43
44 /* an external flag can be set and get from outside */
45 #define E_FLAG(name, value, def)           \
46 void set_opt_##name(int flag) {            \
47   if (flag) libFIRM_opt |= irf_##name;     \
48   else      libFIRM_opt &= ~irf_##name;    \
49 }                                          \
50 void set_opt_##name##_verbose(int flag) {  \
51   if (flag) libFIRM_verb |= irf_##name;    \
52   else      libFIRM_verb &= ~irf_##name;   \
53 }                                          \
54 int (get_opt_##name)(void) {               \
55   return _get_opt_##name();                \
56 }
57
58 /* an internal flag can only be set from outside */
59 #define I_FLAG(name, value, def)          \
60 void set_opt_##name(int flag) {           \
61   if (flag) libFIRM_opt |= irf_##name;    \
62   else      libFIRM_opt &= ~irf_##name;   \
63 }                                         \
64 void set_opt_##name##_verbose(int flag) { \
65   if (flag) libFIRM_verb |= irf_##name;   \
66   else      libFIRM_verb &= ~irf_##name;  \
67 }
68
69 /* generate them */
70 #include "irflag_t.def"
71
72 #undef I_FLAG
73 #undef E_FLAG
74
75 /* for compatibility reasons */
76 void set_optimize(int value) {
77   if (value) libFIRM_opt |= irf_optimize;
78   else       libFIRM_opt &= ~irf_optimize;
79 }
80
81 int (get_optimize)(void) {
82   return get_opt_optimize();
83 }
84
85 void set_opt_control_flow(int value)
86 {
87   set_opt_control_flow_straightening(value);
88   set_opt_control_flow_weak_simplification(value);
89   set_opt_control_flow_strong_simplification(value);
90   set_opt_critical_edges(value);
91 }
92
93 void set_firm_verbosity (int value) {
94   firm_verbosity_level = value;
95 }
96
97 int  (get_firm_verbosity) (void) {
98   return _get_firm_verbosity();
99 }
100
101 /* Save the current optimization state. */
102 void save_optimization_state(optimization_state_t *state)
103 {
104   *state = libFIRM_opt;
105 }
106
107 /* Restore the current optimization state. */
108 void restore_optimization_state(const optimization_state_t *state)
109 {
110   libFIRM_opt = *state;
111 }
112
113 #ifdef _DEBUG
114 void firm_show_flags(void) {
115 #define E_FLAG(name, value, def) printf(#name " = %s\n", get_opt_##name() ? "ON" : "OFF");
116 #define I_FLAG(name, value, def) printf(#name " = %s\n", get_opt_##name() ? "ON" : "OFF");
117 #include "irflag_t.def"
118 }
119 #endif