1 /* Alignment-related classes.
2 Copyright (C) 2018-2021 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 /* Align flags tuple with alignment in log form and with a maximum skip. */
22 struct align_flags_tuple
24 /* Values of the -falign-* flags: how much to align labels in code.
25 log is "align to 2^log" (so 0 means no alignment).
26 maxskip is the maximum allowed amount of padding to insert. */
30 /* Normalize filled values so that maxskip is not bigger than 1 << log. */
38 /* Return original value of an alignment flag. */
45 /* Alignment flags is structure used as value of -align-* options.
46 It's used in target-dependant code. */
51 /* Default constructor. */
52 align_flags (int log0
= 0, int maxskip0
= 0, int log1
= 0, int maxskip1
= 0)
55 levels
[0].maxskip
= maxskip0
;
57 levels
[1].maxskip
= maxskip1
;
61 /* Normalize both components of align_flags. */
64 for (unsigned i
= 0; i
< 2; i
++)
65 levels
[i
].normalize ();
68 /* Get alignment that is common bigger alignment of alignments F0 and F1. */
69 static align_flags
max (const align_flags f0
, const align_flags f1
)
71 int log0
= MAX (f0
.levels
[0].log
, f1
.levels
[0].log
);
72 int maxskip0
= MAX (f0
.levels
[0].maxskip
, f1
.levels
[0].maxskip
);
73 int log1
= MAX (f0
.levels
[1].log
, f1
.levels
[1].log
);
74 int maxskip1
= MAX (f0
.levels
[1].maxskip
, f1
.levels
[1].maxskip
);
75 return align_flags (log0
, maxskip0
, log1
, maxskip1
);
78 align_flags_tuple levels
[2];
81 /* Define maximum supported code alignment. */
82 #define MAX_CODE_ALIGN 16
83 #define MAX_CODE_ALIGN_VALUE (1 << MAX_CODE_ALIGN)