Line data Source code
1 : /* Alignment-related classes.
2 : Copyright (C) 2018-2026 Free Software Foundation, Inc.
3 :
4 : This file is part of GCC.
5 :
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
9 : version.
10 :
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
14 : for more details.
15 :
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/>. */
19 :
20 : /* Align flags tuple with alignment in log form and with a maximum skip. */
21 :
22 : struct align_flags_tuple
23 : {
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. */
27 : int log;
28 : int maxskip;
29 :
30 : /* Normalize filled values so that maxskip is not bigger than 1 << log. */
31 99293606 : void normalize ()
32 : {
33 99293606 : int n = (1 << log);
34 97016878 : if (maxskip > n)
35 0 : maxskip = n - 1;
36 : }
37 :
38 : /* Return original value of an alignment flag. */
39 : int get_value ()
40 : {
41 : return maxskip + 1;
42 : }
43 : };
44 :
45 : /* Alignment flags is structure used as value of -align-* options.
46 : It's used in target-dependant code. */
47 :
48 : class align_flags
49 : {
50 : public:
51 : /* Default constructor. */
52 48209027 : align_flags (int log0 = 0, int maxskip0 = 0, int log1 = 0, int maxskip1 = 0)
53 48209027 : {
54 48209027 : levels[0].log = log0;
55 48209027 : levels[0].maxskip = maxskip0;
56 48209027 : levels[1].log = log1;
57 48209027 : levels[1].maxskip = maxskip1;
58 29848289 : normalize ();
59 : }
60 :
61 : /* Normalize both components of align_flags. */
62 49347391 : void normalize ()
63 : {
64 148042173 : for (unsigned i = 0; i < 2; i++)
65 98694782 : levels[i].normalize ();
66 49347391 : }
67 :
68 : /* Get alignment that is common bigger alignment of alignments F0 and F1. */
69 18360738 : static align_flags max (const align_flags f0, const align_flags f1)
70 : {
71 18360738 : int log0 = MAX (f0.levels[0].log, f1.levels[0].log);
72 18360738 : int maxskip0 = MAX (f0.levels[0].maxskip, f1.levels[0].maxskip);
73 18360738 : int log1 = MAX (f0.levels[1].log, f1.levels[1].log);
74 18360738 : int maxskip1 = MAX (f0.levels[1].maxskip, f1.levels[1].maxskip);
75 18360738 : return align_flags (log0, maxskip0, log1, maxskip1);
76 : }
77 :
78 : align_flags_tuple levels[2];
79 : };
80 :
81 : /* Define maximum supported code alignment. */
82 : #define MAX_CODE_ALIGN 16
83 : #define MAX_CODE_ALIGN_VALUE (1 << MAX_CODE_ALIGN)
|