sync with edgfe
[cparser] / driver / firm_cmdline.h
1 /**
2  * @file firm_cmdline.h -- Additional Firm generating backend parameters
3  *
4  * Generates Firm fro the IL.  It works with both C++ and C programs.
5  *
6  * Compile with STANDALONE_CP_FIRM_BE defined and BACK_END_IS_CP_FIRM_BE
7  * defined as 1 to get a main program back end.  Otherwise, a version to be
8  * called in the same program as the front end is produced (if needed).
9  */
10 #ifndef FIRM_CMDLINE_H
11 #define FIRM_CMDLINE_H
12
13 #include "fe_common.h"
14
15 enum an_os_support {
16   OS_SUPPORT_LINUX,         /**< create code for Linux OS */
17   OS_SUPPORT_MINGW,         /**< create code for MinGW WIN32 */
18   OS_SUPPORT_MACHO          /**< create code for MacOS Mach-O */
19 } an_os_support;
20
21 enum a_debug_mode {
22   DBG_MODE_NONE      = 0,   /**< no special debug support */
23   DBG_MODE_BACKSTORE = 1,   /**< backstores are created */
24   DBG_MODE_FULL      = 2,   /**< no register valiables */
25 };
26
27 /* optimization settings */
28 struct a_firm_opt {
29   a_byte   enabled;         /**< enable all optimizations */
30   a_byte   debug_mode;      /**< debug mode: store all local variables */
31   a_byte   const_folding;   /**< enable constant folding */
32   a_byte   reassoc;         /**< enable reassociation */
33   a_byte   cse;             /**< enable common-subexpression elimination */
34   a_byte   control_flow;    /**< enable control flow optimizations */
35   a_byte   combo;           /**< enable combined CCE, UCE and GVN */
36   a_byte   gcse;            /**< enable global common-subexpression elimination */
37   a_byte   gvn_pre;         /**< enable global common-subexpression elimination
38                                  and partial redundancy elimination */
39   a_byte   cond_eval;       /**< enable condition evaluation */
40   a_byte   if_conversion;   /**< enable if-conversion */
41   a_byte   func_calls;      /**< enable function call optimization */
42   a_byte   do_inline;       /**< do automatic inlining */
43   a_byte   auto_inline;     /**< current automatic inlining state */
44   a_byte   tail_rec;        /**< tail recursion optimization */
45   a_byte   strength_red;    /**< enable strength reduction */
46   a_byte   scalar_replace;  /**< enable scalar replacement */
47   a_byte   confirm;         /**< enable Confirm optimization */
48   a_byte   muls;            /**< enable architecture dependent mul optimization */
49   a_byte   divs;            /**< enable architecture dependent div optimization */
50   a_byte   mods;            /**< enable architecture dependent mod optimization */
51   a_byte   fragile_ops;     /**< enable fragile ops optimization */
52   a_byte   load_store;      /**< enable load store optimization */
53   a_byte   load_store_pre;  /**< enable new load store optimization */
54   a_byte   modes;           /**< enable integer mode optimizations */
55   a_byte   precise_exc;     /**< use precise exception context */
56   a_byte   use_DivMod;      /**< use DivMod nodes */
57   a_byte   remove_unused;   /**< remove unused functions */
58   a_byte   cloning;         /**< enable procedure cloning */
59   a_byte   auto_sync;       /**< automatically create Sync nodes */
60   a_byte   alias_analysis;  /**< enable Alias Analysis */
61   a_byte   strict_alias;    /**< enable strict Alias Analysis (using type based AA) */
62   a_byte   no_alias;        /**< no aliasing possible. */
63   a_byte   sync;            /**< use Syncs to remove unnecessary memory dependencies */
64   a_byte   deconv;          /**< enable conv node optimization */
65   a_byte   cc_opt;          /**< optimize calling conventions */
66   a_byte   bool_opt;        /**< perform bool simplification */
67   a_byte   shape_blocks;    /**< end block melting */
68   a_byte   freestanding;    /**< if set, freestanding mode is enabled */
69   a_byte   fp_model;        /**< fp model */
70   a_byte   lower_ll;        /**< lower double word access */
71   a_byte   vrfy;            /**< Firm verifier setting */
72   a_byte   check_all;       /**< enable checking all Firm phases */
73   a_byte   lower;           /**< enable Firm lowering */
74   a_byte   os_support;      /**< current os support */
75   a_byte   honor_restrict;  /**< enable restrict keyword */
76   a_byte   lower_bitfields; /**< lower bitfield access */
77   a_byte   pic;             /**< generate position independent code */
78   int      clone_threshold; /**< The threshold value for procedure cloning. */
79   unsigned inline_maxsize;  /**< Maximum function size for inlining. */
80   unsigned inline_threshold;/**< Inlining benefice threshold. */
81   a_byte   vrfy_edges;      /**< verify edges */
82   a_byte   grs_simd_opt;
83   a_byte   grs_create_pattern;
84   unsigned spare_size;      /**< allowed spare size for table switches in machine words. */
85 };
86
87 /** statistic options */
88 typedef enum a_firmstat_selection_tag {
89   STAT_NONE        = 0x00000000,
90   STAT_BEFORE_OPT  = 0x00000001,
91   STAT_AFTER_OPT   = 0x00000002,
92   STAT_AFTER_LOWER = 0x00000004,
93   STAT_FINAL_IR    = 0x00000008,
94   STAT_FINAL       = 0x00000010,
95 } a_firmstat_selection;
96
97 /* backend selection */
98 typedef enum a_backend_selection_tag {
99   BE_NONE      = 0,       /**< no backend */
100   BE_FIRM_BE   = 1,       /**< Use Firm internal backend facility. */
101   BE_FIRM2C    = 2        /**< Use generic Firm2C backend */
102 } a_backend_selection;
103
104 /* dumping options */
105 struct a_firm_dump {
106   a_byte debug_print;   /**< enable debug print */
107   a_byte all_types;     /**< dump the All_types graph */
108   a_byte no_blocks;     /**< dump non-blocked graph */
109   a_byte extbb;         /**< dumps extended basic blocks */
110   a_byte ir_graph;      /**< dump all graphs */
111   a_byte all_phases;    /**< dump the IR graph after all phases */
112   a_byte edge_labels;   /**< use edge labels when dumping IR graphs */
113   a_byte statistic;     /**< Firm statistic setting */
114   a_byte stat_pattern;  /**< enable Firm statistic pattern */
115   a_byte stat_dag;      /**< enable Firm DAG statistic */
116   a_byte gen_firm_asm;  /**< generate Firm assembler and exit */
117   char   *filter;       /**< the dump filter */
118 };
119
120 struct a_firm_be_opt {
121   a_byte selection;
122   a_byte node_stat;
123 };
124
125 #ifdef FIRM_EXT_GRS
126 struct a_firm_ext_grs {
127   a_byte simd_opt;          /**< enable graph based SIMD optimization */
128   a_byte create_pattern;    /**< enable pattern creation for SIMD opts */
129 };
130 #endif
131
132
133 extern struct a_firm_be_opt firm_be_opt;
134 extern struct a_firm_opt firm_opt;
135 extern struct a_firm_dump firm_dump;
136 extern struct a_firm_ext_grs firm_ext_grs;
137
138
139 /**
140  * prints the firm version number
141  */
142 void print_firm_version(FILE *f);
143
144 /**
145  * called by the generic command line parser
146  * to handle the --firm= or -f options
147  */
148 int firm_option(const char *opt);
149
150 /**
151  * called by the generic command line parser
152  * to handle the --backend= or -b options
153  */
154 int firm_be_option(const char *opt);
155
156 #endif /* FIRM_CMDLINE_H */