1 1.1 mrg /* Alignment-related classes. 2 1.1.1.3 mrg Copyright (C) 2018-2022 Free Software Foundation, Inc. 3 1.1 mrg 4 1.1 mrg This file is part of GCC. 5 1.1 mrg 6 1.1 mrg GCC is free software; you can redistribute it and/or modify it under 7 1.1 mrg the terms of the GNU General Public License as published by the Free 8 1.1 mrg Software Foundation; either version 3, or (at your option) any later 9 1.1 mrg version. 10 1.1 mrg 11 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 1.1 mrg for more details. 15 1.1 mrg 16 1.1 mrg You should have received a copy of the GNU General Public License 17 1.1 mrg along with GCC; see the file COPYING3. If not see 18 1.1 mrg <http://www.gnu.org/licenses/>. */ 19 1.1 mrg 20 1.1 mrg /* Align flags tuple with alignment in log form and with a maximum skip. */ 21 1.1 mrg 22 1.1 mrg struct align_flags_tuple 23 1.1 mrg { 24 1.1 mrg /* Values of the -falign-* flags: how much to align labels in code. 25 1.1 mrg log is "align to 2^log" (so 0 means no alignment). 26 1.1 mrg maxskip is the maximum allowed amount of padding to insert. */ 27 1.1 mrg int log; 28 1.1 mrg int maxskip; 29 1.1 mrg 30 1.1 mrg /* Normalize filled values so that maxskip is not bigger than 1 << log. */ 31 1.1 mrg void normalize () 32 1.1 mrg { 33 1.1 mrg int n = (1 << log); 34 1.1 mrg if (maxskip > n) 35 1.1 mrg maxskip = n - 1; 36 1.1 mrg } 37 1.1 mrg 38 1.1 mrg /* Return original value of an alignment flag. */ 39 1.1 mrg int get_value () 40 1.1 mrg { 41 1.1 mrg return maxskip + 1; 42 1.1 mrg } 43 1.1 mrg }; 44 1.1 mrg 45 1.1 mrg /* Alignment flags is structure used as value of -align-* options. 46 1.1 mrg It's used in target-dependant code. */ 47 1.1 mrg 48 1.1.1.2 mrg class align_flags 49 1.1 mrg { 50 1.1.1.2 mrg public: 51 1.1 mrg /* Default constructor. */ 52 1.1 mrg align_flags (int log0 = 0, int maxskip0 = 0, int log1 = 0, int maxskip1 = 0) 53 1.1 mrg { 54 1.1 mrg levels[0].log = log0; 55 1.1 mrg levels[0].maxskip = maxskip0; 56 1.1 mrg levels[1].log = log1; 57 1.1 mrg levels[1].maxskip = maxskip1; 58 1.1 mrg normalize (); 59 1.1 mrg } 60 1.1 mrg 61 1.1 mrg /* Normalize both components of align_flags. */ 62 1.1 mrg void normalize () 63 1.1 mrg { 64 1.1 mrg for (unsigned i = 0; i < 2; i++) 65 1.1 mrg levels[i].normalize (); 66 1.1 mrg } 67 1.1 mrg 68 1.1 mrg /* Get alignment that is common bigger alignment of alignments F0 and F1. */ 69 1.1 mrg static align_flags max (const align_flags f0, const align_flags f1) 70 1.1 mrg { 71 1.1 mrg int log0 = MAX (f0.levels[0].log, f1.levels[0].log); 72 1.1 mrg int maxskip0 = MAX (f0.levels[0].maxskip, f1.levels[0].maxskip); 73 1.1 mrg int log1 = MAX (f0.levels[1].log, f1.levels[1].log); 74 1.1 mrg int maxskip1 = MAX (f0.levels[1].maxskip, f1.levels[1].maxskip); 75 1.1 mrg return align_flags (log0, maxskip0, log1, maxskip1); 76 1.1 mrg } 77 1.1 mrg 78 1.1 mrg align_flags_tuple levels[2]; 79 1.1 mrg }; 80 1.1 mrg 81 1.1 mrg /* Define maximum supported code alignment. */ 82 1.1 mrg #define MAX_CODE_ALIGN 16 83 1.1 mrg #define MAX_CODE_ALIGN_VALUE (1 << MAX_CODE_ALIGN) 84