irop: Constify get_op_ops().
[libfirm] / ir / ir / irflag.c
1 /*
2  * This file is part of libFirm.
3  * Copyright (C) 2012 University of Karlsruhe.
4  */
5
6 /**
7  * @file
8  * @brief   Flags to control optimizations.
9  * @author  Michael Beck, Sebastian Hack
10  */
11 #include "config.h"
12
13 #include <stdio.h>
14
15 #include "lc_opts.h"
16
17 #include "firm_common.h"
18 #include "irtools.h"
19 #include "irflag_t.h"
20
21 /* DISABLE - don't do this optimization
22    ENABLE  - lets see, if there is a better graph */
23 #define ON   -1
24 #define OFF   0
25
26 #define FLAG(name, value, def)     (irf_##name & def) |
27 #define E_FLAG(name, value, def)    FLAG(name, value, def)
28 #define I_FLAG(name, value, def)    FLAG(name, value, def)
29 #define R_FLAG(name, value)
30
31 optimization_state_t libFIRM_opt =
32 #include "irflag_t.def"
33   0;
34
35 #undef FLAG
36 #undef E_FLAG
37 #undef I_FLAG
38 #undef R_FLAG
39
40 optimization_state_t libFIRM_running = 0;
41
42 optimization_state_t libFIRM_verb = 0;
43
44 void set_opt_optimize(int value);
45
46 /* an external flag can be set and get from outside */
47 #define E_FLAG(name, value, def)           \
48 void set_opt_##name(int flag) {            \
49   if (flag) libFIRM_opt |= irf_##name;     \
50   else      libFIRM_opt &= ~irf_##name;    \
51 }                                          \
52 int (get_opt_##name)(void) {               \
53   return get_opt_##name##_();              \
54 }
55
56 /* an internal flag can only be set from outside */
57 #define I_FLAG(name, value, def)          \
58 void set_opt_##name(int flag) {           \
59   if (flag) libFIRM_opt |= irf_##name;    \
60   else      libFIRM_opt &= ~irf_##name;   \
61 }                                         \
62
63 #define R_FLAG(name, value)
64
65 /* generate them */
66 #include "irflag_t.def"
67
68 #undef I_FLAG
69 #undef E_FLAG
70 #undef R_FLAG
71
72 void set_optimize(int value)
73 {
74         set_opt_optimize(value);
75 }
76
77 int (get_optimize)(void)
78 {
79         return get_opt_optimize();
80 }
81
82 void save_optimization_state(optimization_state_t *state)
83 {
84         *state = libFIRM_opt;
85 }
86
87 void restore_optimization_state(const optimization_state_t *state)
88 {
89         libFIRM_opt = *state;
90 }
91
92 void all_optimizations_off(void)
93 {
94         libFIRM_opt = 0;
95 }
96
97 #ifdef _DEBUG
98 void firm_show_flags(FILE *f)
99 {
100         if (! f)
101                 f = stdout;
102         printf("Firm optimization state:\n");
103 #define E_FLAG(name, value, def) printf(" %-20s = %s\n", #name, get_opt_##name() ? "ON" : "OFF");
104 #define I_FLAG(name, value, def) printf(" %-20s = %s\n", #name, get_opt_##name() ? "ON" : "OFF");
105 #define R_FLAG(name, value)      printf(" %-20s = %s\n", #name, is_##name##_running() ? "is running" : "not running");
106 #include "irflag_t.def"
107 #undef I_FLAG
108 #undef E_FLAG
109 #undef R_FLAG
110         printf("\n");
111 }
112 #endif
113
114 static const lc_opt_table_entry_t firm_flags[] = {
115 #define I_FLAG(name, val, def) LC_OPT_ENT_BIT(#name, #name, &libFIRM_opt, (1 << val)),
116 #define E_FLAG(name, val, def) LC_OPT_ENT_BIT(#name, #name, &libFIRM_opt, (1 << val)),
117 #define R_FLAG(name, val)
118 #include "irflag_t.def"
119 #undef I_FLAG
120 #undef E_FLAG
121 #undef R_FLAG
122         LC_OPT_LAST
123 };
124
125 void firm_init_flags(void)
126 {
127         lc_opt_entry_t *grp = lc_opt_get_grp(firm_opt_get_root(), "opt");
128         lc_opt_add_table(grp, firm_flags);
129 }
130
131 firm_verification_t opt_do_node_verification = FIRM_VERIFICATION_ON;
132
133 void do_node_verification(firm_verification_t mode)
134 {
135         opt_do_node_verification = mode;
136 }