aboutsummaryrefslogtreecommitdiff
path: root/gcc/flags.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/flags.h')
-rw-r--r--gcc/flags.h71
1 files changed, 45 insertions, 26 deletions
diff --git a/gcc/flags.h b/gcc/flags.h
index d5d4d78..bfd645b 100644
--- a/gcc/flags.h
+++ b/gcc/flags.h
@@ -42,19 +42,32 @@ extern bool final_insns_dump_p;
/* Other basic status info about current function. */
-/* Target-dependent global state. */
-struct target_flag_state {
+/* Align flags tuple with alignment in log form and with a maximum skip. */
+
+struct align_flags_tuple
+{
/* Values of the -falign-* flags: how much to align labels in code.
- 0 means `use default', 1 means `don't align'.
- For each variable, there is an _log variant which is the power
- of two not less than the variable, for .align output. */
- int x_align_loops_log;
- int x_align_loops_max_skip;
- int x_align_jumps_log;
- int x_align_jumps_max_skip;
- int x_align_labels_log;
- int x_align_labels_max_skip;
- int x_align_functions_log;
+ log is "align to 2^log" (so 0 means no alignment).
+ maxskip is the maximum allowed amount of padding to insert. */
+ int log;
+ int maxskip;
+};
+
+/* Target-dependent global state. */
+
+struct align_flags
+{
+ align_flags_tuple levels[2];
+};
+
+struct target_flag_state
+{
+ /* Each falign-foo can generate up to two levels of alignment:
+ -falign-foo=N:M[:N2:M2] */
+ align_flags x_align_loops;
+ align_flags x_align_jumps;
+ align_flags x_align_labels;
+ align_flags x_align_functions;
/* The excess precision currently in effect. */
enum excess_precision x_flag_excess_precision;
@@ -67,20 +80,26 @@ extern struct target_flag_state *this_target_flag_state;
#define this_target_flag_state (&default_target_flag_state)
#endif
-#define align_loops_log \
- (this_target_flag_state->x_align_loops_log)
-#define align_loops_max_skip \
- (this_target_flag_state->x_align_loops_max_skip)
-#define align_jumps_log \
- (this_target_flag_state->x_align_jumps_log)
-#define align_jumps_max_skip \
- (this_target_flag_state->x_align_jumps_max_skip)
-#define align_labels_log \
- (this_target_flag_state->x_align_labels_log)
-#define align_labels_max_skip \
- (this_target_flag_state->x_align_labels_max_skip)
-#define align_functions_log \
- (this_target_flag_state->x_align_functions_log)
+#define state_align_loops (this_target_flag_state->x_align_loops)
+#define state_align_jumps (this_target_flag_state->x_align_jumps)
+#define state_align_labels (this_target_flag_state->x_align_labels)
+#define state_align_functions (this_target_flag_state->x_align_functions)
+#define align_loops_log (state_align_loops.levels[0].log)
+#define align_jumps_log (state_align_jumps.levels[0].log)
+#define align_labels_log (state_align_labels.levels[0].log)
+#define align_functions_log (state_align_functions.levels[0].log)
+#define align_loops_max_skip (state_align_loops.levels[0].maxskip)
+#define align_jumps_max_skip (state_align_jumps.levels[0].maxskip)
+#define align_labels_max_skip (state_align_labels.levels[0].maxskip)
+#define align_functions_max_skip (state_align_functions.levels[0].maxskip)
+#define align_loops_value (align_loops_max_skip + 1)
+#define align_jumps_value (align_jumps_max_skip + 1)
+#define align_labels_value (align_labels_max_skip + 1)
+#define align_functions_value (align_functions_max_skip + 1)
+
+/* String representaions of the above options are available in
+ const char *str_align_foo. NULL if not set. */
+
#define flag_excess_precision \
(this_target_flag_state->x_flag_excess_precision)