Mercurial > hg > CbC > CbC_gcc
annotate gcc/stor-layout.c @ 158:494b0b89df80 default tip
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 18:13:55 +0900 |
parents | 1830386684a0 |
children |
rev | line source |
---|---|
0 | 1 /* C-compiler utilities for types and variables storage layout |
145 | 2 Copyright (C) 1987-2020 Free Software Foundation, Inc. |
0 | 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 | |
21 #include "config.h" | |
22 #include "system.h" | |
23 #include "coretypes.h" | |
111 | 24 #include "target.h" |
25 #include "function.h" | |
26 #include "rtl.h" | |
0 | 27 #include "tree.h" |
111 | 28 #include "memmodel.h" |
0 | 29 #include "tm_p.h" |
111 | 30 #include "stringpool.h" |
31 #include "regs.h" | |
32 #include "emit-rtl.h" | |
33 #include "cgraph.h" | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
34 #include "diagnostic-core.h" |
111 | 35 #include "fold-const.h" |
36 #include "stor-layout.h" | |
37 #include "varasm.h" | |
38 #include "print-tree.h" | |
0 | 39 #include "langhooks.h" |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
40 #include "tree-inline.h" |
111 | 41 #include "dumpfile.h" |
42 #include "gimplify.h" | |
131 | 43 #include "attribs.h" |
111 | 44 #include "debug.h" |
145 | 45 #include "calls.h" |
0 | 46 |
47 /* Data type for the expressions representing sizes of data types. | |
48 It is the first integer type laid out. */ | |
111 | 49 tree sizetype_tab[(int) stk_type_kind_last]; |
0 | 50 |
51 /* If nonzero, this is an upper limit on alignment of structure fields. | |
52 The value is measured in bits. */ | |
53 unsigned int maximum_field_alignment = TARGET_DEFAULT_PACK_STRUCT * BITS_PER_UNIT; | |
54 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
55 static tree self_referential_size (tree); |
0 | 56 static void finalize_record_size (record_layout_info); |
57 static void finalize_type_size (tree); | |
58 static void place_union_field (record_layout_info, tree); | |
59 static int excess_unit_span (HOST_WIDE_INT, HOST_WIDE_INT, HOST_WIDE_INT, | |
60 HOST_WIDE_INT, tree); | |
61 extern void debug_rli (record_layout_info); | |
62 | |
63 /* Given a size SIZE that may not be a constant, return a SAVE_EXPR | |
64 to serve as the actual size-expression for a type or decl. */ | |
65 | |
66 tree | |
67 variable_size (tree size) | |
68 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
69 /* Obviously. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
70 if (TREE_CONSTANT (size)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
71 return size; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
72 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
73 /* If the size is self-referential, we can't make a SAVE_EXPR (see |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
74 save_expr for the rationale). But we can do something else. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
75 if (CONTAINS_PLACEHOLDER_P (size)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
76 return self_referential_size (size); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
77 |
111 | 78 /* If we are in the global binding level, we can't make a SAVE_EXPR |
79 since it may end up being shared across functions, so it is up | |
80 to the front-end to deal with this case. */ | |
81 if (lang_hooks.decls.global_bindings_p ()) | |
0 | 82 return size; |
83 | |
111 | 84 return save_expr (size); |
0 | 85 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
86 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
87 /* An array of functions used for self-referential size computation. */ |
111 | 88 static GTY(()) vec<tree, va_gc> *size_functions; |
89 | |
90 /* Return true if T is a self-referential component reference. */ | |
91 | |
92 static bool | |
93 self_referential_component_ref_p (tree t) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
94 { |
111 | 95 if (TREE_CODE (t) != COMPONENT_REF) |
96 return false; | |
97 | |
98 while (REFERENCE_CLASS_P (t)) | |
99 t = TREE_OPERAND (t, 0); | |
100 | |
101 return (TREE_CODE (t) == PLACEHOLDER_EXPR); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
102 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
103 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
104 /* Similar to copy_tree_r but do not copy component references involving |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
105 PLACEHOLDER_EXPRs. These nodes are spotted in find_placeholder_in_expr |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
106 and substituted in substitute_in_expr. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
107 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
108 static tree |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
109 copy_self_referential_tree_r (tree *tp, int *walk_subtrees, void *data) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
110 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
111 enum tree_code code = TREE_CODE (*tp); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
112 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
113 /* Stop at types, decls, constants like copy_tree_r. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
114 if (TREE_CODE_CLASS (code) == tcc_type |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
115 || TREE_CODE_CLASS (code) == tcc_declaration |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
116 || TREE_CODE_CLASS (code) == tcc_constant) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
117 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
118 *walk_subtrees = 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
119 return NULL_TREE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
120 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
121 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
122 /* This is the pattern built in ada/make_aligning_type. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
123 else if (code == ADDR_EXPR |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
124 && TREE_CODE (TREE_OPERAND (*tp, 0)) == PLACEHOLDER_EXPR) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
125 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
126 *walk_subtrees = 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
127 return NULL_TREE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
128 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
129 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
130 /* Default case: the component reference. */ |
111 | 131 else if (self_referential_component_ref_p (*tp)) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
132 { |
111 | 133 *walk_subtrees = 0; |
134 return NULL_TREE; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
135 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
136 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
137 /* We're not supposed to have them in self-referential size trees |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
138 because we wouldn't properly control when they are evaluated. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
139 However, not creating superfluous SAVE_EXPRs requires accurate |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
140 tracking of readonly-ness all the way down to here, which we |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
141 cannot always guarantee in practice. So punt in this case. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
142 else if (code == SAVE_EXPR) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
143 return error_mark_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
144 |
111 | 145 else if (code == STATEMENT_LIST) |
146 gcc_unreachable (); | |
147 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
148 return copy_tree_r (tp, walk_subtrees, data); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
149 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
150 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
151 /* Given a SIZE expression that is self-referential, return an equivalent |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
152 expression to serve as the actual size expression for a type. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
153 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
154 static tree |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
155 self_referential_size (tree size) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
156 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
157 static unsigned HOST_WIDE_INT fnno = 0; |
111 | 158 vec<tree> self_refs = vNULL; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
159 tree param_type_list = NULL, param_decl_list = NULL; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
160 tree t, ref, return_type, fntype, fnname, fndecl; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
161 unsigned int i; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
162 char buf[128]; |
111 | 163 vec<tree, va_gc> *args = NULL; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
164 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
165 /* Do not factor out simple operations. */ |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
166 t = skip_simple_constant_arithmetic (size); |
111 | 167 if (TREE_CODE (t) == CALL_EXPR || self_referential_component_ref_p (t)) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
168 return size; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
169 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
170 /* Collect the list of self-references in the expression. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
171 find_placeholder_in_expr (size, &self_refs); |
111 | 172 gcc_assert (self_refs.length () > 0); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
173 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
174 /* Obtain a private copy of the expression. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
175 t = size; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
176 if (walk_tree (&t, copy_self_referential_tree_r, NULL, NULL) != NULL_TREE) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
177 return size; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
178 size = t; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
179 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
180 /* Build the parameter and argument lists in parallel; also |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
181 substitute the former for the latter in the expression. */ |
111 | 182 vec_alloc (args, self_refs.length ()); |
183 FOR_EACH_VEC_ELT (self_refs, i, ref) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
184 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
185 tree subst, param_name, param_type, param_decl; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
186 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
187 if (DECL_P (ref)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
188 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
189 /* We shouldn't have true variables here. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
190 gcc_assert (TREE_READONLY (ref)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
191 subst = ref; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
192 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
193 /* This is the pattern built in ada/make_aligning_type. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
194 else if (TREE_CODE (ref) == ADDR_EXPR) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
195 subst = ref; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
196 /* Default case: the component reference. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
197 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
198 subst = TREE_OPERAND (ref, 1); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
199 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
200 sprintf (buf, "p%d", i); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
201 param_name = get_identifier (buf); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
202 param_type = TREE_TYPE (ref); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
203 param_decl |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
204 = build_decl (input_location, PARM_DECL, param_name, param_type); |
111 | 205 DECL_ARG_TYPE (param_decl) = param_type; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
206 DECL_ARTIFICIAL (param_decl) = 1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
207 TREE_READONLY (param_decl) = 1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
208 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
209 size = substitute_in_expr (size, subst, param_decl); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
210 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
211 param_type_list = tree_cons (NULL_TREE, param_type, param_type_list); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
212 param_decl_list = chainon (param_decl, param_decl_list); |
111 | 213 args->quick_push (ref); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
214 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
215 |
111 | 216 self_refs.release (); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
217 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
218 /* Append 'void' to indicate that the number of parameters is fixed. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
219 param_type_list = tree_cons (NULL_TREE, void_type_node, param_type_list); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
220 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
221 /* The 3 lists have been created in reverse order. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
222 param_type_list = nreverse (param_type_list); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
223 param_decl_list = nreverse (param_decl_list); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
224 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
225 /* Build the function type. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
226 return_type = TREE_TYPE (size); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
227 fntype = build_function_type (return_type, param_type_list); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
228 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
229 /* Build the function declaration. */ |
111 | 230 sprintf (buf, "SZ" HOST_WIDE_INT_PRINT_UNSIGNED, fnno++); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
231 fnname = get_file_function_name (buf); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
232 fndecl = build_decl (input_location, FUNCTION_DECL, fnname, fntype); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
233 for (t = param_decl_list; t; t = DECL_CHAIN (t)) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
234 DECL_CONTEXT (t) = fndecl; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
235 DECL_ARGUMENTS (fndecl) = param_decl_list; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
236 DECL_RESULT (fndecl) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
237 = build_decl (input_location, RESULT_DECL, 0, return_type); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
238 DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
239 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
240 /* The function has been created by the compiler and we don't |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
241 want to emit debug info for it. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
242 DECL_ARTIFICIAL (fndecl) = 1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
243 DECL_IGNORED_P (fndecl) = 1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
244 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
245 /* It is supposed to be "const" and never throw. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
246 TREE_READONLY (fndecl) = 1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
247 TREE_NOTHROW (fndecl) = 1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
248 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
249 /* We want it to be inlined when this is deemed profitable, as |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
250 well as discarded if every call has been integrated. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
251 DECL_DECLARED_INLINE_P (fndecl) = 1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
252 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
253 /* It is made up of a unique return statement. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
254 DECL_INITIAL (fndecl) = make_node (BLOCK); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
255 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
256 t = build2 (MODIFY_EXPR, return_type, DECL_RESULT (fndecl), size); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
257 DECL_SAVED_TREE (fndecl) = build1 (RETURN_EXPR, void_type_node, t); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
258 TREE_STATIC (fndecl) = 1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
259 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
260 /* Put it onto the list of size functions. */ |
111 | 261 vec_safe_push (size_functions, fndecl); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
262 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
263 /* Replace the original expression with a call to the size function. */ |
111 | 264 return build_call_expr_loc_vec (UNKNOWN_LOCATION, fndecl, args); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
265 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
266 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
267 /* Take, queue and compile all the size functions. It is essential that |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
268 the size functions be gimplified at the very end of the compilation |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
269 in order to guarantee transparent handling of self-referential sizes. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
270 Otherwise the GENERIC inliner would not be able to inline them back |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
271 at each of their call sites, thus creating artificial non-constant |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
272 size expressions which would trigger nasty problems later on. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
273 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
274 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
275 finalize_size_functions (void) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
276 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
277 unsigned int i; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
278 tree fndecl; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
279 |
111 | 280 for (i = 0; size_functions && size_functions->iterate (i, &fndecl); i++) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
281 { |
111 | 282 allocate_struct_function (fndecl, false); |
283 set_cfun (NULL); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
284 dump_function (TDI_original, fndecl); |
111 | 285 |
286 /* As these functions are used to describe the layout of variable-length | |
287 structures, debug info generation needs their implementation. */ | |
288 debug_hooks->size_function (fndecl); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
289 gimplify_function_tree (fndecl); |
111 | 290 cgraph_node::finalize_function (fndecl, false); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
291 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
292 |
111 | 293 vec_free (size_functions); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
294 } |
0 | 295 |
111 | 296 /* Return a machine mode of class MCLASS with SIZE bits of precision, |
297 if one exists. The mode may have padding bits as well the SIZE | |
298 value bits. If LIMIT is nonzero, disregard modes wider than | |
299 MAX_FIXED_MODE_SIZE. */ | |
300 | |
301 opt_machine_mode | |
131 | 302 mode_for_size (poly_uint64 size, enum mode_class mclass, int limit) |
0 | 303 { |
111 | 304 machine_mode mode; |
305 int i; | |
0 | 306 |
131 | 307 if (limit && maybe_gt (size, (unsigned int) MAX_FIXED_MODE_SIZE)) |
111 | 308 return opt_machine_mode (); |
0 | 309 |
310 /* Get the first mode which has this size, in the specified class. */ | |
111 | 311 FOR_EACH_MODE_IN_CLASS (mode, mclass) |
131 | 312 if (known_eq (GET_MODE_PRECISION (mode), size)) |
0 | 313 return mode; |
314 | |
111 | 315 if (mclass == MODE_INT || mclass == MODE_PARTIAL_INT) |
316 for (i = 0; i < NUM_INT_N_ENTS; i ++) | |
131 | 317 if (known_eq (int_n_data[i].bitsize, size) |
111 | 318 && int_n_enabled_p[i]) |
319 return int_n_data[i].m; | |
320 | |
321 return opt_machine_mode (); | |
0 | 322 } |
323 | |
324 /* Similar, except passed a tree node. */ | |
325 | |
111 | 326 opt_machine_mode |
0 | 327 mode_for_size_tree (const_tree size, enum mode_class mclass, int limit) |
328 { | |
329 unsigned HOST_WIDE_INT uhwi; | |
330 unsigned int ui; | |
331 | |
111 | 332 if (!tree_fits_uhwi_p (size)) |
333 return opt_machine_mode (); | |
334 uhwi = tree_to_uhwi (size); | |
0 | 335 ui = uhwi; |
336 if (uhwi != ui) | |
111 | 337 return opt_machine_mode (); |
0 | 338 return mode_for_size (ui, mclass, limit); |
339 } | |
340 | |
111 | 341 /* Return the narrowest mode of class MCLASS that contains at least |
342 SIZE bits. Abort if no such mode exists. */ | |
343 | |
344 machine_mode | |
131 | 345 smallest_mode_for_size (poly_uint64 size, enum mode_class mclass) |
0 | 346 { |
111 | 347 machine_mode mode = VOIDmode; |
348 int i; | |
0 | 349 |
350 /* Get the first mode which has at least this size, in the | |
351 specified class. */ | |
111 | 352 FOR_EACH_MODE_IN_CLASS (mode, mclass) |
131 | 353 if (known_ge (GET_MODE_PRECISION (mode), size)) |
111 | 354 break; |
355 | |
131 | 356 gcc_assert (mode != VOIDmode); |
357 | |
111 | 358 if (mclass == MODE_INT || mclass == MODE_PARTIAL_INT) |
359 for (i = 0; i < NUM_INT_N_ENTS; i ++) | |
131 | 360 if (known_ge (int_n_data[i].bitsize, size) |
361 && known_lt (int_n_data[i].bitsize, GET_MODE_PRECISION (mode)) | |
111 | 362 && int_n_enabled_p[i]) |
363 mode = int_n_data[i].m; | |
364 | |
365 return mode; | |
0 | 366 } |
367 | |
111 | 368 /* Return an integer mode of exactly the same size as MODE, if one exists. */ |
369 | |
370 opt_scalar_int_mode | |
371 int_mode_for_mode (machine_mode mode) | |
0 | 372 { |
373 switch (GET_MODE_CLASS (mode)) | |
374 { | |
375 case MODE_INT: | |
376 case MODE_PARTIAL_INT: | |
111 | 377 return as_a <scalar_int_mode> (mode); |
0 | 378 |
379 case MODE_COMPLEX_INT: | |
380 case MODE_COMPLEX_FLOAT: | |
381 case MODE_FLOAT: | |
382 case MODE_DECIMAL_FLOAT: | |
383 case MODE_FRACT: | |
384 case MODE_ACCUM: | |
385 case MODE_UFRACT: | |
386 case MODE_UACCUM: | |
131 | 387 case MODE_VECTOR_BOOL: |
388 case MODE_VECTOR_INT: | |
389 case MODE_VECTOR_FLOAT: | |
0 | 390 case MODE_VECTOR_FRACT: |
391 case MODE_VECTOR_ACCUM: | |
392 case MODE_VECTOR_UFRACT: | |
393 case MODE_VECTOR_UACCUM: | |
111 | 394 return int_mode_for_size (GET_MODE_BITSIZE (mode), 0); |
0 | 395 |
396 case MODE_RANDOM: | |
397 if (mode == BLKmode) | |
111 | 398 return opt_scalar_int_mode (); |
399 | |
400 /* fall through */ | |
0 | 401 |
402 case MODE_CC: | |
403 default: | |
404 gcc_unreachable (); | |
405 } | |
406 } | |
407 | |
111 | 408 /* Find a mode that can be used for efficient bitwise operations on MODE, |
409 if one exists. */ | |
410 | |
411 opt_machine_mode | |
412 bitwise_mode_for_mode (machine_mode mode) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
413 { |
111 | 414 /* Quick exit if we already have a suitable mode. */ |
415 scalar_int_mode int_mode; | |
416 if (is_a <scalar_int_mode> (mode, &int_mode) | |
417 && GET_MODE_BITSIZE (int_mode) <= MAX_FIXED_MODE_SIZE) | |
418 return int_mode; | |
419 | |
420 /* Reuse the sanity checks from int_mode_for_mode. */ | |
421 gcc_checking_assert ((int_mode_for_mode (mode), true)); | |
422 | |
131 | 423 poly_int64 bitsize = GET_MODE_BITSIZE (mode); |
424 | |
111 | 425 /* Try to replace complex modes with complex modes. In general we |
426 expect both components to be processed independently, so we only | |
427 care whether there is a register for the inner mode. */ | |
428 if (COMPLEX_MODE_P (mode)) | |
429 { | |
430 machine_mode trial = mode; | |
431 if ((GET_MODE_CLASS (trial) == MODE_COMPLEX_INT | |
432 || mode_for_size (bitsize, MODE_COMPLEX_INT, false).exists (&trial)) | |
433 && have_regs_of_mode[GET_MODE_INNER (trial)]) | |
434 return trial; | |
435 } | |
436 | |
437 /* Try to replace vector modes with vector modes. Also try using vector | |
438 modes if an integer mode would be too big. */ | |
131 | 439 if (VECTOR_MODE_P (mode) |
440 || maybe_gt (bitsize, MAX_FIXED_MODE_SIZE)) | |
111 | 441 { |
442 machine_mode trial = mode; | |
443 if ((GET_MODE_CLASS (trial) == MODE_VECTOR_INT | |
444 || mode_for_size (bitsize, MODE_VECTOR_INT, 0).exists (&trial)) | |
445 && have_regs_of_mode[trial] | |
446 && targetm.vector_mode_supported_p (trial)) | |
447 return trial; | |
448 } | |
449 | |
450 /* Otherwise fall back on integers while honoring MAX_FIXED_MODE_SIZE. */ | |
451 return mode_for_size (bitsize, MODE_INT, true); | |
452 } | |
453 | |
454 /* Find a type that can be used for efficient bitwise operations on MODE. | |
455 Return null if no such mode exists. */ | |
456 | |
457 tree | |
458 bitwise_type_for_mode (machine_mode mode) | |
459 { | |
460 if (!bitwise_mode_for_mode (mode).exists (&mode)) | |
461 return NULL_TREE; | |
462 | |
463 unsigned int inner_size = GET_MODE_UNIT_BITSIZE (mode); | |
464 tree inner_type = build_nonstandard_integer_type (inner_size, true); | |
465 | |
466 if (VECTOR_MODE_P (mode)) | |
467 return build_vector_type_for_mode (inner_type, mode); | |
468 | |
469 if (COMPLEX_MODE_P (mode)) | |
470 return build_complex_type (inner_type); | |
471 | |
472 gcc_checking_assert (GET_MODE_INNER (mode) == mode); | |
473 return inner_type; | |
474 } | |
475 | |
476 /* Find a mode that is suitable for representing a vector with NUNITS | |
477 elements of mode INNERMODE, if one exists. The returned mode can be | |
478 either an integer mode or a vector mode. */ | |
479 | |
480 opt_machine_mode | |
131 | 481 mode_for_vector (scalar_mode innermode, poly_uint64 nunits) |
111 | 482 { |
483 machine_mode mode; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
484 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
485 /* First, look for a supported vector type. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
486 if (SCALAR_FLOAT_MODE_P (innermode)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
487 mode = MIN_MODE_VECTOR_FLOAT; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
488 else if (SCALAR_FRACT_MODE_P (innermode)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
489 mode = MIN_MODE_VECTOR_FRACT; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
490 else if (SCALAR_UFRACT_MODE_P (innermode)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
491 mode = MIN_MODE_VECTOR_UFRACT; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
492 else if (SCALAR_ACCUM_MODE_P (innermode)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
493 mode = MIN_MODE_VECTOR_ACCUM; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
494 else if (SCALAR_UACCUM_MODE_P (innermode)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
495 mode = MIN_MODE_VECTOR_UACCUM; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
496 else |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
497 mode = MIN_MODE_VECTOR_INT; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
498 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
499 /* Do not check vector_mode_supported_p here. We'll do that |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
500 later in vector_type_mode. */ |
111 | 501 FOR_EACH_MODE_FROM (mode, mode) |
131 | 502 if (known_eq (GET_MODE_NUNITS (mode), nunits) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
503 && GET_MODE_INNER (mode) == innermode) |
111 | 504 return mode; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
505 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
506 /* For integers, try mapping it to a same-sized scalar mode. */ |
111 | 507 if (GET_MODE_CLASS (innermode) == MODE_INT) |
508 { | |
131 | 509 poly_uint64 nbits = nunits * GET_MODE_BITSIZE (innermode); |
111 | 510 if (int_mode_for_size (nbits, 0).exists (&mode) |
511 && have_regs_of_mode[mode]) | |
512 return mode; | |
513 } | |
514 | |
515 return opt_machine_mode (); | |
516 } | |
517 | |
145 | 518 /* If a piece of code is using vector mode VECTOR_MODE and also wants |
519 to operate on elements of mode ELEMENT_MODE, return the vector mode | |
520 it should use for those elements. If NUNITS is nonzero, ensure that | |
521 the mode has exactly NUNITS elements, otherwise pick whichever vector | |
522 size pairs the most naturally with VECTOR_MODE; this may mean choosing | |
523 a mode with a different size and/or number of elements, depending on | |
524 what the target prefers. Return an empty opt_machine_mode if there | |
525 is no supported vector mode with the required properties. | |
526 | |
527 Unlike mode_for_vector. any returned mode is guaranteed to satisfy | |
528 both VECTOR_MODE_P and targetm.vector_mode_supported_p. */ | |
111 | 529 |
530 opt_machine_mode | |
145 | 531 related_vector_mode (machine_mode vector_mode, scalar_mode element_mode, |
532 poly_uint64 nunits) | |
111 | 533 { |
145 | 534 gcc_assert (VECTOR_MODE_P (vector_mode)); |
535 return targetm.vectorize.related_mode (vector_mode, element_mode, nunits); | |
536 } | |
537 | |
538 /* If a piece of code is using vector mode VECTOR_MODE and also wants | |
539 to operate on integer vectors with the same element size and number | |
540 of elements, return the vector mode it should use. Return an empty | |
541 opt_machine_mode if there is no supported vector mode with the | |
542 required properties. | |
543 | |
544 Unlike mode_for_vector. any returned mode is guaranteed to satisfy | |
545 both VECTOR_MODE_P and targetm.vector_mode_supported_p. */ | |
546 | |
547 opt_machine_mode | |
548 related_int_vector_mode (machine_mode vector_mode) | |
549 { | |
550 gcc_assert (VECTOR_MODE_P (vector_mode)); | |
111 | 551 scalar_int_mode int_mode; |
145 | 552 if (int_mode_for_mode (GET_MODE_INNER (vector_mode)).exists (&int_mode)) |
553 return related_vector_mode (vector_mode, int_mode, | |
554 GET_MODE_NUNITS (vector_mode)); | |
111 | 555 return opt_machine_mode (); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
556 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
557 |
0 | 558 /* Return the alignment of MODE. This will be bounded by 1 and |
559 BIGGEST_ALIGNMENT. */ | |
560 | |
561 unsigned int | |
111 | 562 get_mode_alignment (machine_mode mode) |
0 | 563 { |
564 return MIN (BIGGEST_ALIGNMENT, MAX (1, mode_base_align[mode]*BITS_PER_UNIT)); | |
565 } | |
566 | |
111 | 567 /* Return the natural mode of an array, given that it is SIZE bytes in |
568 total and has elements of type ELEM_TYPE. */ | |
569 | |
570 static machine_mode | |
571 mode_for_array (tree elem_type, tree size) | |
572 { | |
573 tree elem_size; | |
131 | 574 poly_uint64 int_size, int_elem_size; |
575 unsigned HOST_WIDE_INT num_elems; | |
111 | 576 bool limit_p; |
577 | |
578 /* One-element arrays get the component type's mode. */ | |
579 elem_size = TYPE_SIZE (elem_type); | |
580 if (simple_cst_equal (size, elem_size)) | |
581 return TYPE_MODE (elem_type); | |
582 | |
583 limit_p = true; | |
131 | 584 if (poly_int_tree_p (size, &int_size) |
585 && poly_int_tree_p (elem_size, &int_elem_size) | |
586 && maybe_ne (int_elem_size, 0U) | |
587 && constant_multiple_p (int_size, int_elem_size, &num_elems)) | |
111 | 588 { |
131 | 589 machine_mode elem_mode = TYPE_MODE (elem_type); |
590 machine_mode mode; | |
591 if (targetm.array_mode (elem_mode, num_elems).exists (&mode)) | |
592 return mode; | |
593 if (targetm.array_mode_supported_p (elem_mode, num_elems)) | |
111 | 594 limit_p = false; |
595 } | |
596 return mode_for_size_tree (size, MODE_INT, limit_p).else_blk (); | |
597 } | |
0 | 598 |
599 /* Subroutine of layout_decl: Force alignment required for the data type. | |
600 But if the decl itself wants greater alignment, don't override that. */ | |
601 | |
602 static inline void | |
603 do_type_align (tree type, tree decl) | |
604 { | |
605 if (TYPE_ALIGN (type) > DECL_ALIGN (decl)) | |
606 { | |
111 | 607 SET_DECL_ALIGN (decl, TYPE_ALIGN (type)); |
0 | 608 if (TREE_CODE (decl) == FIELD_DECL) |
609 DECL_USER_ALIGN (decl) = TYPE_USER_ALIGN (type); | |
610 } | |
111 | 611 if (TYPE_WARN_IF_NOT_ALIGN (type) > DECL_WARN_IF_NOT_ALIGN (decl)) |
612 SET_DECL_WARN_IF_NOT_ALIGN (decl, TYPE_WARN_IF_NOT_ALIGN (type)); | |
0 | 613 } |
614 | |
615 /* Set the size, mode and alignment of a ..._DECL node. | |
616 TYPE_DECL does need this for C++. | |
617 Note that LABEL_DECL and CONST_DECL nodes do not need this, | |
618 and FUNCTION_DECL nodes have them set up in a special (and simple) way. | |
619 Don't call layout_decl for them. | |
620 | |
621 KNOWN_ALIGN is the amount of alignment we can assume this | |
622 decl has with no special effort. It is relevant only for FIELD_DECLs | |
623 and depends on the previous fields. | |
624 All that matters about KNOWN_ALIGN is which powers of 2 divide it. | |
625 If KNOWN_ALIGN is 0, it means, "as much alignment as you like": | |
626 the record will be aligned to suit. */ | |
627 | |
628 void | |
629 layout_decl (tree decl, unsigned int known_align) | |
630 { | |
631 tree type = TREE_TYPE (decl); | |
632 enum tree_code code = TREE_CODE (decl); | |
633 rtx rtl = NULL_RTX; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
634 location_t loc = DECL_SOURCE_LOCATION (decl); |
0 | 635 |
636 if (code == CONST_DECL) | |
637 return; | |
638 | |
639 gcc_assert (code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL | |
111 | 640 || code == TYPE_DECL || code == FIELD_DECL); |
0 | 641 |
642 rtl = DECL_RTL_IF_SET (decl); | |
643 | |
644 if (type == error_mark_node) | |
645 type = void_type_node; | |
646 | |
647 /* Usually the size and mode come from the data type without change, | |
648 however, the front-end may set the explicit width of the field, so its | |
649 size may not be the same as the size of its type. This happens with | |
650 bitfields, of course (an `int' bitfield may be only 2 bits, say), but it | |
651 also happens with other fields. For example, the C++ front-end creates | |
652 zero-sized fields corresponding to empty base classes, and depends on | |
653 layout_type setting DECL_FIELD_BITPOS correctly for the field. Set the | |
654 size in bytes from the size in bits. If we have already set the mode, | |
655 don't set it again since we can be called twice for FIELD_DECLs. */ | |
656 | |
657 DECL_UNSIGNED (decl) = TYPE_UNSIGNED (type); | |
658 if (DECL_MODE (decl) == VOIDmode) | |
111 | 659 SET_DECL_MODE (decl, TYPE_MODE (type)); |
0 | 660 |
661 if (DECL_SIZE (decl) == 0) | |
662 { | |
663 DECL_SIZE (decl) = TYPE_SIZE (type); | |
664 DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (type); | |
665 } | |
666 else if (DECL_SIZE_UNIT (decl) == 0) | |
667 DECL_SIZE_UNIT (decl) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
668 = fold_convert_loc (loc, sizetype, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
669 size_binop_loc (loc, CEIL_DIV_EXPR, DECL_SIZE (decl), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
670 bitsize_unit_node)); |
0 | 671 |
672 if (code != FIELD_DECL) | |
673 /* For non-fields, update the alignment from the type. */ | |
674 do_type_align (type, decl); | |
675 else | |
676 /* For fields, it's a bit more complicated... */ | |
677 { | |
678 bool old_user_align = DECL_USER_ALIGN (decl); | |
679 bool zero_bitfield = false; | |
680 bool packed_p = DECL_PACKED (decl); | |
681 unsigned int mfa; | |
682 | |
683 if (DECL_BIT_FIELD (decl)) | |
684 { | |
685 DECL_BIT_FIELD_TYPE (decl) = type; | |
686 | |
687 /* A zero-length bit-field affects the alignment of the next | |
688 field. In essence such bit-fields are not influenced by | |
689 any packing due to #pragma pack or attribute packed. */ | |
690 if (integer_zerop (DECL_SIZE (decl)) | |
691 && ! targetm.ms_bitfield_layout_p (DECL_FIELD_CONTEXT (decl))) | |
692 { | |
693 zero_bitfield = true; | |
694 packed_p = false; | |
695 if (PCC_BITFIELD_TYPE_MATTERS) | |
696 do_type_align (type, decl); | |
697 else | |
698 { | |
699 #ifdef EMPTY_FIELD_BOUNDARY | |
700 if (EMPTY_FIELD_BOUNDARY > DECL_ALIGN (decl)) | |
701 { | |
111 | 702 SET_DECL_ALIGN (decl, EMPTY_FIELD_BOUNDARY); |
0 | 703 DECL_USER_ALIGN (decl) = 0; |
704 } | |
705 #endif | |
706 } | |
707 } | |
708 | |
709 /* See if we can use an ordinary integer mode for a bit-field. | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
710 Conditions are: a fixed size that is correct for another mode, |
111 | 711 occupying a complete byte or bytes on proper boundary. */ |
0 | 712 if (TYPE_SIZE (type) != 0 |
713 && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST | |
111 | 714 && GET_MODE_CLASS (TYPE_MODE (type)) == MODE_INT) |
0 | 715 { |
111 | 716 machine_mode xmode; |
717 if (mode_for_size_tree (DECL_SIZE (decl), | |
718 MODE_INT, 1).exists (&xmode)) | |
0 | 719 { |
111 | 720 unsigned int xalign = GET_MODE_ALIGNMENT (xmode); |
721 if (!(xalign > BITS_PER_UNIT && DECL_PACKED (decl)) | |
722 && (known_align == 0 || known_align >= xalign)) | |
723 { | |
724 SET_DECL_ALIGN (decl, MAX (xalign, DECL_ALIGN (decl))); | |
725 SET_DECL_MODE (decl, xmode); | |
726 DECL_BIT_FIELD (decl) = 0; | |
727 } | |
0 | 728 } |
729 } | |
730 | |
731 /* Turn off DECL_BIT_FIELD if we won't need it set. */ | |
732 if (TYPE_MODE (type) == BLKmode && DECL_MODE (decl) == BLKmode | |
733 && known_align >= TYPE_ALIGN (type) | |
734 && DECL_ALIGN (decl) >= TYPE_ALIGN (type)) | |
735 DECL_BIT_FIELD (decl) = 0; | |
736 } | |
737 else if (packed_p && DECL_USER_ALIGN (decl)) | |
738 /* Don't touch DECL_ALIGN. For other packed fields, go ahead and | |
739 round up; we'll reduce it again below. We want packing to | |
740 supersede USER_ALIGN inherited from the type, but defer to | |
741 alignment explicitly specified on the field decl. */; | |
742 else | |
743 do_type_align (type, decl); | |
744 | |
745 /* If the field is packed and not explicitly aligned, give it the | |
746 minimum alignment. Note that do_type_align may set | |
747 DECL_USER_ALIGN, so we need to check old_user_align instead. */ | |
748 if (packed_p | |
749 && !old_user_align) | |
111 | 750 SET_DECL_ALIGN (decl, MIN (DECL_ALIGN (decl), BITS_PER_UNIT)); |
0 | 751 |
752 if (! packed_p && ! DECL_USER_ALIGN (decl)) | |
753 { | |
754 /* Some targets (i.e. i386, VMS) limit struct field alignment | |
755 to a lower boundary than alignment of variables unless | |
756 it was overridden by attribute aligned. */ | |
757 #ifdef BIGGEST_FIELD_ALIGNMENT | |
111 | 758 SET_DECL_ALIGN (decl, MIN (DECL_ALIGN (decl), |
759 (unsigned) BIGGEST_FIELD_ALIGNMENT)); | |
0 | 760 #endif |
761 #ifdef ADJUST_FIELD_ALIGN | |
111 | 762 SET_DECL_ALIGN (decl, ADJUST_FIELD_ALIGN (decl, TREE_TYPE (decl), |
763 DECL_ALIGN (decl))); | |
0 | 764 #endif |
765 } | |
766 | |
767 if (zero_bitfield) | |
768 mfa = initial_max_fld_align * BITS_PER_UNIT; | |
769 else | |
770 mfa = maximum_field_alignment; | |
771 /* Should this be controlled by DECL_USER_ALIGN, too? */ | |
772 if (mfa != 0) | |
111 | 773 SET_DECL_ALIGN (decl, MIN (DECL_ALIGN (decl), mfa)); |
0 | 774 } |
775 | |
776 /* Evaluate nonconstant size only once, either now or as soon as safe. */ | |
777 if (DECL_SIZE (decl) != 0 && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST) | |
778 DECL_SIZE (decl) = variable_size (DECL_SIZE (decl)); | |
779 if (DECL_SIZE_UNIT (decl) != 0 | |
780 && TREE_CODE (DECL_SIZE_UNIT (decl)) != INTEGER_CST) | |
781 DECL_SIZE_UNIT (decl) = variable_size (DECL_SIZE_UNIT (decl)); | |
782 | |
783 /* If requested, warn about definitions of large data objects. */ | |
131 | 784 if ((code == PARM_DECL || (code == VAR_DECL && !DECL_NONLOCAL_FRAME (decl))) |
785 && !DECL_EXTERNAL (decl)) | |
0 | 786 { |
787 tree size = DECL_SIZE_UNIT (decl); | |
788 | |
131 | 789 if (size != 0 && TREE_CODE (size) == INTEGER_CST) |
0 | 790 { |
131 | 791 /* -Wlarger-than= argument of HOST_WIDE_INT_MAX is treated |
792 as if PTRDIFF_MAX had been specified, with the value | |
793 being that on the target rather than the host. */ | |
794 unsigned HOST_WIDE_INT max_size = warn_larger_than_size; | |
795 if (max_size == HOST_WIDE_INT_MAX) | |
796 max_size = tree_to_shwi (TYPE_MAX_VALUE (ptrdiff_type_node)); | |
797 | |
798 if (compare_tree_int (size, max_size) > 0) | |
799 warning (OPT_Wlarger_than_, "size of %q+D %E bytes exceeds " | |
800 "maximum object size %wu", | |
801 decl, size, max_size); | |
0 | 802 } |
803 } | |
804 | |
805 /* If the RTL was already set, update its mode and mem attributes. */ | |
806 if (rtl) | |
807 { | |
808 PUT_MODE (rtl, DECL_MODE (decl)); | |
809 SET_DECL_RTL (decl, 0); | |
111 | 810 if (MEM_P (rtl)) |
811 set_mem_attributes (rtl, decl, 1); | |
0 | 812 SET_DECL_RTL (decl, rtl); |
813 } | |
814 } | |
815 | |
111 | 816 /* Given a VAR_DECL, PARM_DECL, RESULT_DECL, or FIELD_DECL, clears the |
817 results of a previous call to layout_decl and calls it again. */ | |
0 | 818 |
819 void | |
820 relayout_decl (tree decl) | |
821 { | |
822 DECL_SIZE (decl) = DECL_SIZE_UNIT (decl) = 0; | |
111 | 823 SET_DECL_MODE (decl, VOIDmode); |
0 | 824 if (!DECL_USER_ALIGN (decl)) |
111 | 825 SET_DECL_ALIGN (decl, 0); |
826 if (DECL_RTL_SET_P (decl)) | |
827 SET_DECL_RTL (decl, 0); | |
0 | 828 |
829 layout_decl (decl, 0); | |
830 } | |
831 | |
832 /* Begin laying out type T, which may be a RECORD_TYPE, UNION_TYPE, or | |
833 QUAL_UNION_TYPE. Return a pointer to a struct record_layout_info which | |
834 is to be passed to all other layout functions for this record. It is the | |
835 responsibility of the caller to call `free' for the storage returned. | |
836 Note that garbage collection is not permitted until we finish laying | |
837 out the record. */ | |
838 | |
839 record_layout_info | |
840 start_record_layout (tree t) | |
841 { | |
842 record_layout_info rli = XNEW (struct record_layout_info_s); | |
843 | |
844 rli->t = t; | |
845 | |
846 /* If the type has a minimum specified alignment (via an attribute | |
847 declaration, for example) use it -- otherwise, start with a | |
848 one-byte alignment. */ | |
849 rli->record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (t)); | |
850 rli->unpacked_align = rli->record_align; | |
851 rli->offset_align = MAX (rli->record_align, BIGGEST_ALIGNMENT); | |
852 | |
853 #ifdef STRUCTURE_SIZE_BOUNDARY | |
854 /* Packed structures don't need to have minimum size. */ | |
855 if (! TYPE_PACKED (t)) | |
856 { | |
857 unsigned tmp; | |
858 | |
859 /* #pragma pack overrides STRUCTURE_SIZE_BOUNDARY. */ | |
860 tmp = (unsigned) STRUCTURE_SIZE_BOUNDARY; | |
861 if (maximum_field_alignment != 0) | |
862 tmp = MIN (tmp, maximum_field_alignment); | |
863 rli->record_align = MAX (rli->record_align, tmp); | |
864 } | |
865 #endif | |
866 | |
867 rli->offset = size_zero_node; | |
868 rli->bitpos = bitsize_zero_node; | |
869 rli->prev_field = 0; | |
111 | 870 rli->pending_statics = 0; |
0 | 871 rli->packed_maybe_necessary = 0; |
872 rli->remaining_in_alignment = 0; | |
873 | |
874 return rli; | |
875 } | |
876 | |
131 | 877 /* Fold sizetype value X to bitsizetype, given that X represents a type |
878 size or offset. */ | |
879 | |
880 static tree | |
881 bits_from_bytes (tree x) | |
882 { | |
883 if (POLY_INT_CST_P (x)) | |
884 /* The runtime calculation isn't allowed to overflow sizetype; | |
885 increasing the runtime values must always increase the size | |
886 or offset of the object. This means that the object imposes | |
887 a maximum value on the runtime parameters, but we don't record | |
888 what that is. */ | |
889 return build_poly_int_cst | |
890 (bitsizetype, | |
891 poly_wide_int::from (poly_int_cst_value (x), | |
892 TYPE_PRECISION (bitsizetype), | |
893 TYPE_SIGN (TREE_TYPE (x)))); | |
894 x = fold_convert (bitsizetype, x); | |
895 gcc_checking_assert (x); | |
896 return x; | |
897 } | |
898 | |
111 | 899 /* Return the combined bit position for the byte offset OFFSET and the |
900 bit position BITPOS. | |
901 | |
902 These functions operate on byte and bit positions present in FIELD_DECLs | |
903 and assume that these expressions result in no (intermediate) overflow. | |
904 This assumption is necessary to fold the expressions as much as possible, | |
905 so as to avoid creating artificially variable-sized types in languages | |
906 supporting variable-sized types like Ada. */ | |
0 | 907 |
908 tree | |
909 bit_from_pos (tree offset, tree bitpos) | |
910 { | |
911 return size_binop (PLUS_EXPR, bitpos, | |
131 | 912 size_binop (MULT_EXPR, bits_from_bytes (offset), |
0 | 913 bitsize_unit_node)); |
914 } | |
915 | |
111 | 916 /* Return the combined truncated byte position for the byte offset OFFSET and |
917 the bit position BITPOS. */ | |
918 | |
0 | 919 tree |
920 byte_from_pos (tree offset, tree bitpos) | |
921 { | |
111 | 922 tree bytepos; |
923 if (TREE_CODE (bitpos) == MULT_EXPR | |
924 && tree_int_cst_equal (TREE_OPERAND (bitpos, 1), bitsize_unit_node)) | |
925 bytepos = TREE_OPERAND (bitpos, 0); | |
926 else | |
927 bytepos = size_binop (TRUNC_DIV_EXPR, bitpos, bitsize_unit_node); | |
928 return size_binop (PLUS_EXPR, offset, fold_convert (sizetype, bytepos)); | |
0 | 929 } |
930 | |
111 | 931 /* Split the bit position POS into a byte offset *POFFSET and a bit |
932 position *PBITPOS with the byte offset aligned to OFF_ALIGN bits. */ | |
933 | |
0 | 934 void |
935 pos_from_bit (tree *poffset, tree *pbitpos, unsigned int off_align, | |
936 tree pos) | |
937 { | |
111 | 938 tree toff_align = bitsize_int (off_align); |
939 if (TREE_CODE (pos) == MULT_EXPR | |
940 && tree_int_cst_equal (TREE_OPERAND (pos, 1), toff_align)) | |
941 { | |
942 *poffset = size_binop (MULT_EXPR, | |
943 fold_convert (sizetype, TREE_OPERAND (pos, 0)), | |
944 size_int (off_align / BITS_PER_UNIT)); | |
945 *pbitpos = bitsize_zero_node; | |
946 } | |
947 else | |
948 { | |
949 *poffset = size_binop (MULT_EXPR, | |
950 fold_convert (sizetype, | |
951 size_binop (FLOOR_DIV_EXPR, pos, | |
952 toff_align)), | |
953 size_int (off_align / BITS_PER_UNIT)); | |
954 *pbitpos = size_binop (FLOOR_MOD_EXPR, pos, toff_align); | |
955 } | |
0 | 956 } |
957 | |
958 /* Given a pointer to bit and byte offsets and an offset alignment, | |
959 normalize the offsets so they are within the alignment. */ | |
960 | |
961 void | |
962 normalize_offset (tree *poffset, tree *pbitpos, unsigned int off_align) | |
963 { | |
964 /* If the bit position is now larger than it should be, adjust it | |
965 downwards. */ | |
966 if (compare_tree_int (*pbitpos, off_align) >= 0) | |
967 { | |
111 | 968 tree offset, bitpos; |
969 pos_from_bit (&offset, &bitpos, off_align, *pbitpos); | |
970 *poffset = size_binop (PLUS_EXPR, *poffset, offset); | |
971 *pbitpos = bitpos; | |
0 | 972 } |
973 } | |
974 | |
975 /* Print debugging information about the information in RLI. */ | |
976 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
977 DEBUG_FUNCTION void |
0 | 978 debug_rli (record_layout_info rli) |
979 { | |
980 print_node_brief (stderr, "type", rli->t, 0); | |
981 print_node_brief (stderr, "\noffset", rli->offset, 0); | |
982 print_node_brief (stderr, " bitpos", rli->bitpos, 0); | |
983 | |
984 fprintf (stderr, "\naligns: rec = %u, unpack = %u, off = %u\n", | |
985 rli->record_align, rli->unpacked_align, | |
986 rli->offset_align); | |
987 | |
988 /* The ms_struct code is the only that uses this. */ | |
989 if (targetm.ms_bitfield_layout_p (rli->t)) | |
990 fprintf (stderr, "remaining in alignment = %u\n", rli->remaining_in_alignment); | |
991 | |
992 if (rli->packed_maybe_necessary) | |
993 fprintf (stderr, "packed may be necessary\n"); | |
994 | |
111 | 995 if (!vec_safe_is_empty (rli->pending_statics)) |
0 | 996 { |
997 fprintf (stderr, "pending statics:\n"); | |
131 | 998 debug (rli->pending_statics); |
0 | 999 } |
1000 } | |
1001 | |
1002 /* Given an RLI with a possibly-incremented BITPOS, adjust OFFSET and | |
1003 BITPOS if necessary to keep BITPOS below OFFSET_ALIGN. */ | |
1004 | |
1005 void | |
1006 normalize_rli (record_layout_info rli) | |
1007 { | |
1008 normalize_offset (&rli->offset, &rli->bitpos, rli->offset_align); | |
1009 } | |
1010 | |
1011 /* Returns the size in bytes allocated so far. */ | |
1012 | |
1013 tree | |
1014 rli_size_unit_so_far (record_layout_info rli) | |
1015 { | |
1016 return byte_from_pos (rli->offset, rli->bitpos); | |
1017 } | |
1018 | |
1019 /* Returns the size in bits allocated so far. */ | |
1020 | |
1021 tree | |
1022 rli_size_so_far (record_layout_info rli) | |
1023 { | |
1024 return bit_from_pos (rli->offset, rli->bitpos); | |
1025 } | |
1026 | |
1027 /* FIELD is about to be added to RLI->T. The alignment (in bits) of | |
1028 the next available location within the record is given by KNOWN_ALIGN. | |
1029 Update the variable alignment fields in RLI, and return the alignment | |
1030 to give the FIELD. */ | |
1031 | |
1032 unsigned int | |
1033 update_alignment_for_field (record_layout_info rli, tree field, | |
1034 unsigned int known_align) | |
1035 { | |
1036 /* The alignment required for FIELD. */ | |
1037 unsigned int desired_align; | |
1038 /* The type of this field. */ | |
1039 tree type = TREE_TYPE (field); | |
1040 /* True if the field was explicitly aligned by the user. */ | |
1041 bool user_align; | |
1042 bool is_bitfield; | |
1043 | |
1044 /* Do not attempt to align an ERROR_MARK node */ | |
1045 if (TREE_CODE (type) == ERROR_MARK) | |
1046 return 0; | |
1047 | |
1048 /* Lay out the field so we know what alignment it needs. */ | |
1049 layout_decl (field, known_align); | |
1050 desired_align = DECL_ALIGN (field); | |
1051 user_align = DECL_USER_ALIGN (field); | |
1052 | |
1053 is_bitfield = (type != error_mark_node | |
1054 && DECL_BIT_FIELD_TYPE (field) | |
1055 && ! integer_zerop (TYPE_SIZE (type))); | |
1056 | |
1057 /* Record must have at least as much alignment as any field. | |
1058 Otherwise, the alignment of the field within the record is | |
1059 meaningless. */ | |
1060 if (targetm.ms_bitfield_layout_p (rli->t)) | |
1061 { | |
1062 /* Here, the alignment of the underlying type of a bitfield can | |
1063 affect the alignment of a record; even a zero-sized field | |
1064 can do this. The alignment should be to the alignment of | |
1065 the type, except that for zero-size bitfields this only | |
1066 applies if there was an immediately prior, nonzero-size | |
1067 bitfield. (That's the way it is, experimentally.) */ | |
131 | 1068 if (!is_bitfield |
111 | 1069 || ((DECL_SIZE (field) == NULL_TREE |
1070 || !integer_zerop (DECL_SIZE (field))) | |
0 | 1071 ? !DECL_PACKED (field) |
1072 : (rli->prev_field | |
1073 && DECL_BIT_FIELD_TYPE (rli->prev_field) | |
1074 && ! integer_zerop (DECL_SIZE (rli->prev_field))))) | |
1075 { | |
1076 unsigned int type_align = TYPE_ALIGN (type); | |
131 | 1077 if (!is_bitfield && DECL_PACKED (field)) |
1078 type_align = desired_align; | |
1079 else | |
1080 type_align = MAX (type_align, desired_align); | |
0 | 1081 if (maximum_field_alignment != 0) |
1082 type_align = MIN (type_align, maximum_field_alignment); | |
1083 rli->record_align = MAX (rli->record_align, type_align); | |
1084 rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type)); | |
1085 } | |
1086 } | |
1087 else if (is_bitfield && PCC_BITFIELD_TYPE_MATTERS) | |
1088 { | |
1089 /* Named bit-fields cause the entire structure to have the | |
1090 alignment implied by their type. Some targets also apply the same | |
1091 rules to unnamed bitfields. */ | |
1092 if (DECL_NAME (field) != 0 | |
1093 || targetm.align_anon_bitfield ()) | |
1094 { | |
1095 unsigned int type_align = TYPE_ALIGN (type); | |
1096 | |
1097 #ifdef ADJUST_FIELD_ALIGN | |
1098 if (! TYPE_USER_ALIGN (type)) | |
111 | 1099 type_align = ADJUST_FIELD_ALIGN (field, type, type_align); |
0 | 1100 #endif |
1101 | |
1102 /* Targets might chose to handle unnamed and hence possibly | |
1103 zero-width bitfield. Those are not influenced by #pragmas | |
1104 or packed attributes. */ | |
1105 if (integer_zerop (DECL_SIZE (field))) | |
1106 { | |
1107 if (initial_max_fld_align) | |
1108 type_align = MIN (type_align, | |
1109 initial_max_fld_align * BITS_PER_UNIT); | |
1110 } | |
1111 else if (maximum_field_alignment != 0) | |
1112 type_align = MIN (type_align, maximum_field_alignment); | |
1113 else if (DECL_PACKED (field)) | |
1114 type_align = MIN (type_align, BITS_PER_UNIT); | |
1115 | |
1116 /* The alignment of the record is increased to the maximum | |
1117 of the current alignment, the alignment indicated on the | |
1118 field (i.e., the alignment specified by an __aligned__ | |
1119 attribute), and the alignment indicated by the type of | |
1120 the field. */ | |
1121 rli->record_align = MAX (rli->record_align, desired_align); | |
1122 rli->record_align = MAX (rli->record_align, type_align); | |
1123 | |
1124 if (warn_packed) | |
1125 rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type)); | |
1126 user_align |= TYPE_USER_ALIGN (type); | |
1127 } | |
1128 } | |
1129 else | |
1130 { | |
1131 rli->record_align = MAX (rli->record_align, desired_align); | |
1132 rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type)); | |
1133 } | |
1134 | |
1135 TYPE_USER_ALIGN (rli->t) |= user_align; | |
1136 | |
1137 return desired_align; | |
1138 } | |
1139 | |
111 | 1140 /* Issue a warning if the record alignment, RECORD_ALIGN, is less than |
1141 the field alignment of FIELD or FIELD isn't aligned. */ | |
1142 | |
1143 static void | |
1144 handle_warn_if_not_align (tree field, unsigned int record_align) | |
1145 { | |
1146 tree type = TREE_TYPE (field); | |
1147 | |
1148 if (type == error_mark_node) | |
1149 return; | |
1150 | |
1151 unsigned int warn_if_not_align = 0; | |
1152 | |
1153 int opt_w = 0; | |
1154 | |
1155 if (warn_if_not_aligned) | |
1156 { | |
1157 warn_if_not_align = DECL_WARN_IF_NOT_ALIGN (field); | |
1158 if (!warn_if_not_align) | |
1159 warn_if_not_align = TYPE_WARN_IF_NOT_ALIGN (type); | |
1160 if (warn_if_not_align) | |
1161 opt_w = OPT_Wif_not_aligned; | |
1162 } | |
1163 | |
1164 if (!warn_if_not_align | |
1165 && warn_packed_not_aligned | |
131 | 1166 && lookup_attribute ("aligned", TYPE_ATTRIBUTES (type))) |
111 | 1167 { |
1168 warn_if_not_align = TYPE_ALIGN (type); | |
1169 opt_w = OPT_Wpacked_not_aligned; | |
1170 } | |
1171 | |
1172 if (!warn_if_not_align) | |
1173 return; | |
1174 | |
1175 tree context = DECL_CONTEXT (field); | |
1176 | |
1177 warn_if_not_align /= BITS_PER_UNIT; | |
1178 record_align /= BITS_PER_UNIT; | |
1179 if ((record_align % warn_if_not_align) != 0) | |
1180 warning (opt_w, "alignment %u of %qT is less than %u", | |
1181 record_align, context, warn_if_not_align); | |
1182 | |
131 | 1183 tree off = byte_position (field); |
1184 if (!multiple_of_p (TREE_TYPE (off), off, size_int (warn_if_not_align))) | |
1185 { | |
1186 if (TREE_CODE (off) == INTEGER_CST) | |
1187 warning (opt_w, "%q+D offset %E in %qT isn%'t aligned to %u", | |
1188 field, off, context, warn_if_not_align); | |
1189 else | |
1190 warning (opt_w, "%q+D offset %E in %qT may not be aligned to %u", | |
1191 field, off, context, warn_if_not_align); | |
1192 } | |
111 | 1193 } |
1194 | |
0 | 1195 /* Called from place_field to handle unions. */ |
1196 | |
1197 static void | |
1198 place_union_field (record_layout_info rli, tree field) | |
1199 { | |
1200 update_alignment_for_field (rli, field, /*known_align=*/0); | |
1201 | |
1202 DECL_FIELD_OFFSET (field) = size_zero_node; | |
1203 DECL_FIELD_BIT_OFFSET (field) = bitsize_zero_node; | |
1204 SET_DECL_OFFSET_ALIGN (field, BIGGEST_ALIGNMENT); | |
111 | 1205 handle_warn_if_not_align (field, rli->record_align); |
0 | 1206 |
1207 /* If this is an ERROR_MARK return *after* having set the | |
1208 field at the start of the union. This helps when parsing | |
1209 invalid fields. */ | |
1210 if (TREE_CODE (TREE_TYPE (field)) == ERROR_MARK) | |
1211 return; | |
1212 | |
111 | 1213 if (AGGREGATE_TYPE_P (TREE_TYPE (field)) |
1214 && TYPE_TYPELESS_STORAGE (TREE_TYPE (field))) | |
1215 TYPE_TYPELESS_STORAGE (rli->t) = 1; | |
1216 | |
0 | 1217 /* We assume the union's size will be a multiple of a byte so we don't |
1218 bother with BITPOS. */ | |
1219 if (TREE_CODE (rli->t) == UNION_TYPE) | |
1220 rli->offset = size_binop (MAX_EXPR, rli->offset, DECL_SIZE_UNIT (field)); | |
1221 else if (TREE_CODE (rli->t) == QUAL_UNION_TYPE) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1222 rli->offset = fold_build3 (COND_EXPR, sizetype, DECL_QUALIFIER (field), |
0 | 1223 DECL_SIZE_UNIT (field), rli->offset); |
1224 } | |
1225 | |
1226 /* A bitfield of SIZE with a required access alignment of ALIGN is allocated | |
1227 at BYTE_OFFSET / BIT_OFFSET. Return nonzero if the field would span more | |
1228 units of alignment than the underlying TYPE. */ | |
1229 static int | |
1230 excess_unit_span (HOST_WIDE_INT byte_offset, HOST_WIDE_INT bit_offset, | |
1231 HOST_WIDE_INT size, HOST_WIDE_INT align, tree type) | |
1232 { | |
1233 /* Note that the calculation of OFFSET might overflow; we calculate it so | |
1234 that we still get the right result as long as ALIGN is a power of two. */ | |
1235 unsigned HOST_WIDE_INT offset = byte_offset * BITS_PER_UNIT + bit_offset; | |
1236 | |
1237 offset = offset % align; | |
1238 return ((offset + size + align - 1) / align | |
111 | 1239 > tree_to_uhwi (TYPE_SIZE (type)) / align); |
0 | 1240 } |
1241 | |
1242 /* RLI contains information about the layout of a RECORD_TYPE. FIELD | |
1243 is a FIELD_DECL to be added after those fields already present in | |
1244 T. (FIELD is not actually added to the TYPE_FIELDS list here; | |
1245 callers that desire that behavior must manually perform that step.) */ | |
1246 | |
1247 void | |
1248 place_field (record_layout_info rli, tree field) | |
1249 { | |
1250 /* The alignment required for FIELD. */ | |
1251 unsigned int desired_align; | |
1252 /* The alignment FIELD would have if we just dropped it into the | |
1253 record as it presently stands. */ | |
1254 unsigned int known_align; | |
1255 unsigned int actual_align; | |
1256 /* The type of this field. */ | |
1257 tree type = TREE_TYPE (field); | |
1258 | |
1259 gcc_assert (TREE_CODE (field) != ERROR_MARK); | |
1260 | |
1261 /* If FIELD is static, then treat it like a separate variable, not | |
1262 really like a structure field. If it is a FUNCTION_DECL, it's a | |
1263 method. In both cases, all we do is lay out the decl, and we do | |
1264 it *after* the record is laid out. */ | |
111 | 1265 if (VAR_P (field)) |
0 | 1266 { |
111 | 1267 vec_safe_push (rli->pending_statics, field); |
0 | 1268 return; |
1269 } | |
1270 | |
1271 /* Enumerators and enum types which are local to this class need not | |
1272 be laid out. Likewise for initialized constant fields. */ | |
1273 else if (TREE_CODE (field) != FIELD_DECL) | |
1274 return; | |
1275 | |
1276 /* Unions are laid out very differently than records, so split | |
1277 that code off to another function. */ | |
1278 else if (TREE_CODE (rli->t) != RECORD_TYPE) | |
1279 { | |
1280 place_union_field (rli, field); | |
1281 return; | |
1282 } | |
1283 | |
1284 else if (TREE_CODE (type) == ERROR_MARK) | |
1285 { | |
1286 /* Place this field at the current allocation position, so we | |
1287 maintain monotonicity. */ | |
1288 DECL_FIELD_OFFSET (field) = rli->offset; | |
1289 DECL_FIELD_BIT_OFFSET (field) = rli->bitpos; | |
1290 SET_DECL_OFFSET_ALIGN (field, rli->offset_align); | |
111 | 1291 handle_warn_if_not_align (field, rli->record_align); |
0 | 1292 return; |
1293 } | |
1294 | |
111 | 1295 if (AGGREGATE_TYPE_P (type) |
1296 && TYPE_TYPELESS_STORAGE (type)) | |
1297 TYPE_TYPELESS_STORAGE (rli->t) = 1; | |
1298 | |
0 | 1299 /* Work out the known alignment so far. Note that A & (-A) is the |
1300 value of the least-significant bit in A that is one. */ | |
1301 if (! integer_zerop (rli->bitpos)) | |
111 | 1302 known_align = least_bit_hwi (tree_to_uhwi (rli->bitpos)); |
0 | 1303 else if (integer_zerop (rli->offset)) |
1304 known_align = 0; | |
111 | 1305 else if (tree_fits_uhwi_p (rli->offset)) |
0 | 1306 known_align = (BITS_PER_UNIT |
111 | 1307 * least_bit_hwi (tree_to_uhwi (rli->offset))); |
0 | 1308 else |
1309 known_align = rli->offset_align; | |
1310 | |
1311 desired_align = update_alignment_for_field (rli, field, known_align); | |
1312 if (known_align == 0) | |
1313 known_align = MAX (BIGGEST_ALIGNMENT, rli->record_align); | |
1314 | |
1315 if (warn_packed && DECL_PACKED (field)) | |
1316 { | |
1317 if (known_align >= TYPE_ALIGN (type)) | |
1318 { | |
1319 if (TYPE_ALIGN (type) > desired_align) | |
1320 { | |
1321 if (STRICT_ALIGNMENT) | |
1322 warning (OPT_Wattributes, "packed attribute causes " | |
1323 "inefficient alignment for %q+D", field); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1324 /* Don't warn if DECL_PACKED was set by the type. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1325 else if (!TYPE_PACKED (rli->t)) |
0 | 1326 warning (OPT_Wattributes, "packed attribute is " |
1327 "unnecessary for %q+D", field); | |
1328 } | |
1329 } | |
1330 else | |
1331 rli->packed_maybe_necessary = 1; | |
1332 } | |
1333 | |
1334 /* Does this field automatically have alignment it needs by virtue | |
111 | 1335 of the fields that precede it and the record's own alignment? */ |
131 | 1336 if (known_align < desired_align |
1337 && (! targetm.ms_bitfield_layout_p (rli->t) | |
1338 || rli->prev_field == NULL)) | |
0 | 1339 { |
1340 /* No, we need to skip space before this field. | |
1341 Bump the cumulative size to multiple of field alignment. */ | |
1342 | |
111 | 1343 if (!targetm.ms_bitfield_layout_p (rli->t) |
1344 && DECL_SOURCE_LOCATION (field) != BUILTINS_LOCATION) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1345 warning (OPT_Wpadded, "padding struct to align %q+D", field); |
0 | 1346 |
1347 /* If the alignment is still within offset_align, just align | |
1348 the bit position. */ | |
1349 if (desired_align < rli->offset_align) | |
1350 rli->bitpos = round_up (rli->bitpos, desired_align); | |
1351 else | |
1352 { | |
1353 /* First adjust OFFSET by the partial bits, then align. */ | |
1354 rli->offset | |
1355 = size_binop (PLUS_EXPR, rli->offset, | |
1356 fold_convert (sizetype, | |
1357 size_binop (CEIL_DIV_EXPR, rli->bitpos, | |
1358 bitsize_unit_node))); | |
1359 rli->bitpos = bitsize_zero_node; | |
1360 | |
1361 rli->offset = round_up (rli->offset, desired_align / BITS_PER_UNIT); | |
1362 } | |
1363 | |
1364 if (! TREE_CONSTANT (rli->offset)) | |
1365 rli->offset_align = desired_align; | |
1366 } | |
1367 | |
1368 /* Handle compatibility with PCC. Note that if the record has any | |
1369 variable-sized fields, we need not worry about compatibility. */ | |
1370 if (PCC_BITFIELD_TYPE_MATTERS | |
1371 && ! targetm.ms_bitfield_layout_p (rli->t) | |
1372 && TREE_CODE (field) == FIELD_DECL | |
1373 && type != error_mark_node | |
1374 && DECL_BIT_FIELD (field) | |
1375 && (! DECL_PACKED (field) | |
1376 /* Enter for these packed fields only to issue a warning. */ | |
1377 || TYPE_ALIGN (type) <= BITS_PER_UNIT) | |
1378 && maximum_field_alignment == 0 | |
1379 && ! integer_zerop (DECL_SIZE (field)) | |
111 | 1380 && tree_fits_uhwi_p (DECL_SIZE (field)) |
1381 && tree_fits_uhwi_p (rli->offset) | |
1382 && tree_fits_uhwi_p (TYPE_SIZE (type))) | |
0 | 1383 { |
1384 unsigned int type_align = TYPE_ALIGN (type); | |
1385 tree dsize = DECL_SIZE (field); | |
111 | 1386 HOST_WIDE_INT field_size = tree_to_uhwi (dsize); |
1387 HOST_WIDE_INT offset = tree_to_uhwi (rli->offset); | |
1388 HOST_WIDE_INT bit_offset = tree_to_shwi (rli->bitpos); | |
0 | 1389 |
1390 #ifdef ADJUST_FIELD_ALIGN | |
1391 if (! TYPE_USER_ALIGN (type)) | |
111 | 1392 type_align = ADJUST_FIELD_ALIGN (field, type, type_align); |
0 | 1393 #endif |
1394 | |
1395 /* A bit field may not span more units of alignment of its type | |
1396 than its type itself. Advance to next boundary if necessary. */ | |
1397 if (excess_unit_span (offset, bit_offset, field_size, type_align, type)) | |
1398 { | |
1399 if (DECL_PACKED (field)) | |
1400 { | |
1401 if (warn_packed_bitfield_compat == 1) | |
1402 inform | |
1403 (input_location, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1404 "offset of packed bit-field %qD has changed in GCC 4.4", |
0 | 1405 field); |
1406 } | |
1407 else | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1408 rli->bitpos = round_up (rli->bitpos, type_align); |
0 | 1409 } |
1410 | |
1411 if (! DECL_PACKED (field)) | |
1412 TYPE_USER_ALIGN (rli->t) |= TYPE_USER_ALIGN (type); | |
111 | 1413 |
1414 SET_TYPE_WARN_IF_NOT_ALIGN (rli->t, | |
1415 TYPE_WARN_IF_NOT_ALIGN (type)); | |
0 | 1416 } |
1417 | |
1418 #ifdef BITFIELD_NBYTES_LIMITED | |
1419 if (BITFIELD_NBYTES_LIMITED | |
1420 && ! targetm.ms_bitfield_layout_p (rli->t) | |
1421 && TREE_CODE (field) == FIELD_DECL | |
1422 && type != error_mark_node | |
1423 && DECL_BIT_FIELD_TYPE (field) | |
1424 && ! DECL_PACKED (field) | |
1425 && ! integer_zerop (DECL_SIZE (field)) | |
111 | 1426 && tree_fits_uhwi_p (DECL_SIZE (field)) |
1427 && tree_fits_uhwi_p (rli->offset) | |
1428 && tree_fits_uhwi_p (TYPE_SIZE (type))) | |
0 | 1429 { |
1430 unsigned int type_align = TYPE_ALIGN (type); | |
1431 tree dsize = DECL_SIZE (field); | |
111 | 1432 HOST_WIDE_INT field_size = tree_to_uhwi (dsize); |
1433 HOST_WIDE_INT offset = tree_to_uhwi (rli->offset); | |
1434 HOST_WIDE_INT bit_offset = tree_to_shwi (rli->bitpos); | |
0 | 1435 |
1436 #ifdef ADJUST_FIELD_ALIGN | |
1437 if (! TYPE_USER_ALIGN (type)) | |
111 | 1438 type_align = ADJUST_FIELD_ALIGN (field, type, type_align); |
0 | 1439 #endif |
1440 | |
1441 if (maximum_field_alignment != 0) | |
1442 type_align = MIN (type_align, maximum_field_alignment); | |
1443 /* ??? This test is opposite the test in the containing if | |
1444 statement, so this code is unreachable currently. */ | |
1445 else if (DECL_PACKED (field)) | |
1446 type_align = MIN (type_align, BITS_PER_UNIT); | |
1447 | |
1448 /* A bit field may not span the unit of alignment of its type. | |
1449 Advance to next boundary if necessary. */ | |
1450 if (excess_unit_span (offset, bit_offset, field_size, type_align, type)) | |
1451 rli->bitpos = round_up (rli->bitpos, type_align); | |
1452 | |
1453 TYPE_USER_ALIGN (rli->t) |= TYPE_USER_ALIGN (type); | |
111 | 1454 SET_TYPE_WARN_IF_NOT_ALIGN (rli->t, |
1455 TYPE_WARN_IF_NOT_ALIGN (type)); | |
0 | 1456 } |
1457 #endif | |
1458 | |
1459 /* See the docs for TARGET_MS_BITFIELD_LAYOUT_P for details. | |
1460 A subtlety: | |
1461 When a bit field is inserted into a packed record, the whole | |
1462 size of the underlying type is used by one or more same-size | |
1463 adjacent bitfields. (That is, if its long:3, 32 bits is | |
1464 used in the record, and any additional adjacent long bitfields are | |
1465 packed into the same chunk of 32 bits. However, if the size | |
1466 changes, a new field of that size is allocated.) In an unpacked | |
1467 record, this is the same as using alignment, but not equivalent | |
1468 when packing. | |
1469 | |
1470 Note: for compatibility, we use the type size, not the type alignment | |
1471 to determine alignment, since that matches the documentation */ | |
1472 | |
1473 if (targetm.ms_bitfield_layout_p (rli->t)) | |
1474 { | |
1475 tree prev_saved = rli->prev_field; | |
1476 tree prev_type = prev_saved ? DECL_BIT_FIELD_TYPE (prev_saved) : NULL; | |
1477 | |
1478 /* This is a bitfield if it exists. */ | |
1479 if (rli->prev_field) | |
1480 { | |
131 | 1481 bool realign_p = known_align < desired_align; |
1482 | |
0 | 1483 /* If both are bitfields, nonzero, and the same size, this is |
1484 the middle of a run. Zero declared size fields are special | |
1485 and handled as "end of run". (Note: it's nonzero declared | |
1486 size, but equal type sizes!) (Since we know that both | |
1487 the current and previous fields are bitfields by the | |
1488 time we check it, DECL_SIZE must be present for both.) */ | |
1489 if (DECL_BIT_FIELD_TYPE (field) | |
1490 && !integer_zerop (DECL_SIZE (field)) | |
1491 && !integer_zerop (DECL_SIZE (rli->prev_field)) | |
111 | 1492 && tree_fits_shwi_p (DECL_SIZE (rli->prev_field)) |
1493 && tree_fits_uhwi_p (TYPE_SIZE (type)) | |
0 | 1494 && simple_cst_equal (TYPE_SIZE (type), TYPE_SIZE (prev_type))) |
1495 { | |
1496 /* We're in the middle of a run of equal type size fields; make | |
1497 sure we realign if we run out of bits. (Not decl size, | |
1498 type size!) */ | |
111 | 1499 HOST_WIDE_INT bitsize = tree_to_uhwi (DECL_SIZE (field)); |
0 | 1500 |
1501 if (rli->remaining_in_alignment < bitsize) | |
1502 { | |
111 | 1503 HOST_WIDE_INT typesize = tree_to_uhwi (TYPE_SIZE (type)); |
0 | 1504 |
1505 /* out of bits; bump up to next 'word'. */ | |
1506 rli->bitpos | |
1507 = size_binop (PLUS_EXPR, rli->bitpos, | |
1508 bitsize_int (rli->remaining_in_alignment)); | |
1509 rli->prev_field = field; | |
1510 if (typesize < bitsize) | |
1511 rli->remaining_in_alignment = 0; | |
1512 else | |
1513 rli->remaining_in_alignment = typesize - bitsize; | |
1514 } | |
1515 else | |
131 | 1516 { |
1517 rli->remaining_in_alignment -= bitsize; | |
1518 realign_p = false; | |
1519 } | |
0 | 1520 } |
1521 else | |
1522 { | |
1523 /* End of a run: if leaving a run of bitfields of the same type | |
1524 size, we have to "use up" the rest of the bits of the type | |
1525 size. | |
1526 | |
1527 Compute the new position as the sum of the size for the prior | |
1528 type and where we first started working on that type. | |
1529 Note: since the beginning of the field was aligned then | |
1530 of course the end will be too. No round needed. */ | |
1531 | |
1532 if (!integer_zerop (DECL_SIZE (rli->prev_field))) | |
1533 { | |
1534 rli->bitpos | |
1535 = size_binop (PLUS_EXPR, rli->bitpos, | |
1536 bitsize_int (rli->remaining_in_alignment)); | |
1537 } | |
1538 else | |
1539 /* We "use up" size zero fields; the code below should behave | |
1540 as if the prior field was not a bitfield. */ | |
1541 prev_saved = NULL; | |
1542 | |
1543 /* Cause a new bitfield to be captured, either this time (if | |
1544 currently a bitfield) or next time we see one. */ | |
111 | 1545 if (!DECL_BIT_FIELD_TYPE (field) |
0 | 1546 || integer_zerop (DECL_SIZE (field))) |
1547 rli->prev_field = NULL; | |
1548 } | |
1549 | |
131 | 1550 /* Does this field automatically have alignment it needs by virtue |
1551 of the fields that precede it and the record's own alignment? */ | |
1552 if (realign_p) | |
1553 { | |
1554 /* If the alignment is still within offset_align, just align | |
1555 the bit position. */ | |
1556 if (desired_align < rli->offset_align) | |
1557 rli->bitpos = round_up (rli->bitpos, desired_align); | |
1558 else | |
1559 { | |
1560 /* First adjust OFFSET by the partial bits, then align. */ | |
1561 tree d = size_binop (CEIL_DIV_EXPR, rli->bitpos, | |
1562 bitsize_unit_node); | |
1563 rli->offset = size_binop (PLUS_EXPR, rli->offset, | |
1564 fold_convert (sizetype, d)); | |
1565 rli->bitpos = bitsize_zero_node; | |
1566 | |
1567 rli->offset = round_up (rli->offset, | |
1568 desired_align / BITS_PER_UNIT); | |
1569 } | |
1570 | |
1571 if (! TREE_CONSTANT (rli->offset)) | |
1572 rli->offset_align = desired_align; | |
1573 } | |
1574 | |
0 | 1575 normalize_rli (rli); |
1576 } | |
1577 | |
111 | 1578 /* If we're starting a new run of same type size bitfields |
0 | 1579 (or a run of non-bitfields), set up the "first of the run" |
1580 fields. | |
1581 | |
1582 That is, if the current field is not a bitfield, or if there | |
1583 was a prior bitfield the type sizes differ, or if there wasn't | |
1584 a prior bitfield the size of the current field is nonzero. | |
1585 | |
1586 Note: we must be sure to test ONLY the type size if there was | |
1587 a prior bitfield and ONLY for the current field being zero if | |
1588 there wasn't. */ | |
1589 | |
1590 if (!DECL_BIT_FIELD_TYPE (field) | |
1591 || (prev_saved != NULL | |
1592 ? !simple_cst_equal (TYPE_SIZE (type), TYPE_SIZE (prev_type)) | |
131 | 1593 : !integer_zerop (DECL_SIZE (field)))) |
0 | 1594 { |
1595 /* Never smaller than a byte for compatibility. */ | |
1596 unsigned int type_align = BITS_PER_UNIT; | |
1597 | |
1598 /* (When not a bitfield), we could be seeing a flex array (with | |
1599 no DECL_SIZE). Since we won't be using remaining_in_alignment | |
1600 until we see a bitfield (and come by here again) we just skip | |
1601 calculating it. */ | |
1602 if (DECL_SIZE (field) != NULL | |
111 | 1603 && tree_fits_uhwi_p (TYPE_SIZE (TREE_TYPE (field))) |
1604 && tree_fits_uhwi_p (DECL_SIZE (field))) | |
0 | 1605 { |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1606 unsigned HOST_WIDE_INT bitsize |
111 | 1607 = tree_to_uhwi (DECL_SIZE (field)); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1608 unsigned HOST_WIDE_INT typesize |
111 | 1609 = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (field))); |
0 | 1610 |
1611 if (typesize < bitsize) | |
1612 rli->remaining_in_alignment = 0; | |
1613 else | |
1614 rli->remaining_in_alignment = typesize - bitsize; | |
1615 } | |
1616 | |
1617 /* Now align (conventionally) for the new type. */ | |
131 | 1618 if (! DECL_PACKED (field)) |
1619 type_align = TYPE_ALIGN (TREE_TYPE (field)); | |
0 | 1620 |
1621 if (maximum_field_alignment != 0) | |
1622 type_align = MIN (type_align, maximum_field_alignment); | |
1623 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1624 rli->bitpos = round_up (rli->bitpos, type_align); |
0 | 1625 |
1626 /* If we really aligned, don't allow subsequent bitfields | |
1627 to undo that. */ | |
1628 rli->prev_field = NULL; | |
1629 } | |
1630 } | |
1631 | |
1632 /* Offset so far becomes the position of this field after normalizing. */ | |
1633 normalize_rli (rli); | |
1634 DECL_FIELD_OFFSET (field) = rli->offset; | |
1635 DECL_FIELD_BIT_OFFSET (field) = rli->bitpos; | |
1636 SET_DECL_OFFSET_ALIGN (field, rli->offset_align); | |
111 | 1637 handle_warn_if_not_align (field, rli->record_align); |
1638 | |
1639 /* Evaluate nonconstant offsets only once, either now or as soon as safe. */ | |
1640 if (TREE_CODE (DECL_FIELD_OFFSET (field)) != INTEGER_CST) | |
1641 DECL_FIELD_OFFSET (field) = variable_size (DECL_FIELD_OFFSET (field)); | |
0 | 1642 |
1643 /* If this field ended up more aligned than we thought it would be (we | |
1644 approximate this by seeing if its position changed), lay out the field | |
1645 again; perhaps we can use an integral mode for it now. */ | |
1646 if (! integer_zerop (DECL_FIELD_BIT_OFFSET (field))) | |
111 | 1647 actual_align = least_bit_hwi (tree_to_uhwi (DECL_FIELD_BIT_OFFSET (field))); |
0 | 1648 else if (integer_zerop (DECL_FIELD_OFFSET (field))) |
1649 actual_align = MAX (BIGGEST_ALIGNMENT, rli->record_align); | |
111 | 1650 else if (tree_fits_uhwi_p (DECL_FIELD_OFFSET (field))) |
0 | 1651 actual_align = (BITS_PER_UNIT |
111 | 1652 * least_bit_hwi (tree_to_uhwi (DECL_FIELD_OFFSET (field)))); |
0 | 1653 else |
1654 actual_align = DECL_OFFSET_ALIGN (field); | |
1655 /* ACTUAL_ALIGN is still the actual alignment *within the record* . | |
1656 store / extract bit field operations will check the alignment of the | |
1657 record against the mode of bit fields. */ | |
1658 | |
1659 if (known_align != actual_align) | |
1660 layout_decl (field, actual_align); | |
1661 | |
1662 if (rli->prev_field == NULL && DECL_BIT_FIELD_TYPE (field)) | |
1663 rli->prev_field = field; | |
1664 | |
1665 /* Now add size of this field to the size of the record. If the size is | |
1666 not constant, treat the field as being a multiple of bytes and just | |
1667 adjust the offset, resetting the bit position. Otherwise, apportion the | |
1668 size amongst the bit position and offset. First handle the case of an | |
1669 unspecified size, which can happen when we have an invalid nested struct | |
1670 definition, such as struct j { struct j { int i; } }. The error message | |
1671 is printed in finish_struct. */ | |
1672 if (DECL_SIZE (field) == 0) | |
1673 /* Do nothing. */; | |
1674 else if (TREE_CODE (DECL_SIZE (field)) != INTEGER_CST | |
1675 || TREE_OVERFLOW (DECL_SIZE (field))) | |
1676 { | |
1677 rli->offset | |
1678 = size_binop (PLUS_EXPR, rli->offset, | |
1679 fold_convert (sizetype, | |
1680 size_binop (CEIL_DIV_EXPR, rli->bitpos, | |
1681 bitsize_unit_node))); | |
1682 rli->offset | |
1683 = size_binop (PLUS_EXPR, rli->offset, DECL_SIZE_UNIT (field)); | |
1684 rli->bitpos = bitsize_zero_node; | |
1685 rli->offset_align = MIN (rli->offset_align, desired_align); | |
131 | 1686 |
1687 if (!multiple_of_p (bitsizetype, DECL_SIZE (field), | |
1688 bitsize_int (rli->offset_align))) | |
1689 { | |
1690 tree type = strip_array_types (TREE_TYPE (field)); | |
1691 /* The above adjusts offset_align just based on the start of the | |
1692 field. The field might not have a size that is a multiple of | |
1693 that offset_align though. If the field is an array of fixed | |
1694 sized elements, assume there can be any multiple of those | |
1695 sizes. If it is a variable length aggregate or array of | |
1696 variable length aggregates, assume worst that the end is | |
1697 just BITS_PER_UNIT aligned. */ | |
1698 if (TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST) | |
1699 { | |
1700 if (TREE_INT_CST_LOW (TYPE_SIZE (type))) | |
1701 { | |
1702 unsigned HOST_WIDE_INT sz | |
1703 = least_bit_hwi (TREE_INT_CST_LOW (TYPE_SIZE (type))); | |
1704 rli->offset_align = MIN (rli->offset_align, sz); | |
1705 } | |
1706 } | |
1707 else | |
1708 rli->offset_align = MIN (rli->offset_align, BITS_PER_UNIT); | |
1709 } | |
0 | 1710 } |
1711 else if (targetm.ms_bitfield_layout_p (rli->t)) | |
1712 { | |
1713 rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, DECL_SIZE (field)); | |
1714 | |
131 | 1715 /* If FIELD is the last field and doesn't end at the full length |
1716 of the type then pad the struct out to the full length of the | |
1717 last type. */ | |
1718 if (DECL_BIT_FIELD_TYPE (field) | |
0 | 1719 && !integer_zerop (DECL_SIZE (field))) |
131 | 1720 { |
1721 /* We have to scan, because non-field DECLS are also here. */ | |
1722 tree probe = field; | |
1723 while ((probe = DECL_CHAIN (probe))) | |
1724 if (TREE_CODE (probe) == FIELD_DECL) | |
1725 break; | |
1726 if (!probe) | |
1727 rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, | |
1728 bitsize_int (rli->remaining_in_alignment)); | |
1729 } | |
0 | 1730 |
1731 normalize_rli (rli); | |
1732 } | |
1733 else | |
1734 { | |
1735 rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, DECL_SIZE (field)); | |
1736 normalize_rli (rli); | |
1737 } | |
1738 } | |
1739 | |
1740 /* Assuming that all the fields have been laid out, this function uses | |
1741 RLI to compute the final TYPE_SIZE, TYPE_ALIGN, etc. for the type | |
1742 indicated by RLI. */ | |
1743 | |
1744 static void | |
1745 finalize_record_size (record_layout_info rli) | |
1746 { | |
1747 tree unpadded_size, unpadded_size_unit; | |
1748 | |
1749 /* Now we want just byte and bit offsets, so set the offset alignment | |
1750 to be a byte and then normalize. */ | |
1751 rli->offset_align = BITS_PER_UNIT; | |
1752 normalize_rli (rli); | |
1753 | |
1754 /* Determine the desired alignment. */ | |
1755 #ifdef ROUND_TYPE_ALIGN | |
111 | 1756 SET_TYPE_ALIGN (rli->t, ROUND_TYPE_ALIGN (rli->t, TYPE_ALIGN (rli->t), |
1757 rli->record_align)); | |
0 | 1758 #else |
111 | 1759 SET_TYPE_ALIGN (rli->t, MAX (TYPE_ALIGN (rli->t), rli->record_align)); |
0 | 1760 #endif |
1761 | |
1762 /* Compute the size so far. Be sure to allow for extra bits in the | |
1763 size in bytes. We have guaranteed above that it will be no more | |
1764 than a single byte. */ | |
1765 unpadded_size = rli_size_so_far (rli); | |
1766 unpadded_size_unit = rli_size_unit_so_far (rli); | |
1767 if (! integer_zerop (rli->bitpos)) | |
1768 unpadded_size_unit | |
1769 = size_binop (PLUS_EXPR, unpadded_size_unit, size_one_node); | |
1770 | |
1771 /* Round the size up to be a multiple of the required alignment. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1772 TYPE_SIZE (rli->t) = round_up (unpadded_size, TYPE_ALIGN (rli->t)); |
0 | 1773 TYPE_SIZE_UNIT (rli->t) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1774 = round_up (unpadded_size_unit, TYPE_ALIGN_UNIT (rli->t)); |
0 | 1775 |
1776 if (TREE_CONSTANT (unpadded_size) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1777 && simple_cst_equal (unpadded_size, TYPE_SIZE (rli->t)) == 0 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1778 && input_location != BUILTINS_LOCATION) |
0 | 1779 warning (OPT_Wpadded, "padding struct size to alignment boundary"); |
1780 | |
1781 if (warn_packed && TREE_CODE (rli->t) == RECORD_TYPE | |
1782 && TYPE_PACKED (rli->t) && ! rli->packed_maybe_necessary | |
1783 && TREE_CONSTANT (unpadded_size)) | |
1784 { | |
1785 tree unpacked_size; | |
1786 | |
1787 #ifdef ROUND_TYPE_ALIGN | |
1788 rli->unpacked_align | |
1789 = ROUND_TYPE_ALIGN (rli->t, TYPE_ALIGN (rli->t), rli->unpacked_align); | |
1790 #else | |
1791 rli->unpacked_align = MAX (TYPE_ALIGN (rli->t), rli->unpacked_align); | |
1792 #endif | |
1793 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1794 unpacked_size = round_up (TYPE_SIZE (rli->t), rli->unpacked_align); |
0 | 1795 if (simple_cst_equal (unpacked_size, TYPE_SIZE (rli->t))) |
1796 { | |
1797 if (TYPE_NAME (rli->t)) | |
1798 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1799 tree name; |
0 | 1800 |
1801 if (TREE_CODE (TYPE_NAME (rli->t)) == IDENTIFIER_NODE) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1802 name = TYPE_NAME (rli->t); |
0 | 1803 else |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1804 name = DECL_NAME (TYPE_NAME (rli->t)); |
0 | 1805 |
1806 if (STRICT_ALIGNMENT) | |
1807 warning (OPT_Wpacked, "packed attribute causes inefficient " | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1808 "alignment for %qE", name); |
0 | 1809 else |
1810 warning (OPT_Wpacked, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1811 "packed attribute is unnecessary for %qE", name); |
0 | 1812 } |
1813 else | |
1814 { | |
1815 if (STRICT_ALIGNMENT) | |
1816 warning (OPT_Wpacked, | |
1817 "packed attribute causes inefficient alignment"); | |
1818 else | |
1819 warning (OPT_Wpacked, "packed attribute is unnecessary"); | |
1820 } | |
1821 } | |
1822 } | |
1823 } | |
1824 | |
1825 /* Compute the TYPE_MODE for the TYPE (which is a RECORD_TYPE). */ | |
1826 | |
1827 void | |
1828 compute_record_mode (tree type) | |
1829 { | |
1830 tree field; | |
111 | 1831 machine_mode mode = VOIDmode; |
0 | 1832 |
1833 /* Most RECORD_TYPEs have BLKmode, so we start off assuming that. | |
1834 However, if possible, we use a mode that fits in a register | |
1835 instead, in order to allow for better optimization down the | |
1836 line. */ | |
1837 SET_TYPE_MODE (type, BLKmode); | |
1838 | |
145 | 1839 poly_uint64 type_size; |
1840 if (!poly_int_tree_p (TYPE_SIZE (type), &type_size)) | |
0 | 1841 return; |
1842 | |
1843 /* A record which has any BLKmode members must itself be | |
1844 BLKmode; it can't go in a register. Unless the member is | |
1845 BLKmode only because it isn't aligned. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1846 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field)) |
0 | 1847 { |
1848 if (TREE_CODE (field) != FIELD_DECL) | |
1849 continue; | |
1850 | |
145 | 1851 poly_uint64 field_size; |
0 | 1852 if (TREE_CODE (TREE_TYPE (field)) == ERROR_MARK |
1853 || (TYPE_MODE (TREE_TYPE (field)) == BLKmode | |
1854 && ! TYPE_NO_FORCE_BLK (TREE_TYPE (field)) | |
1855 && !(TYPE_SIZE (TREE_TYPE (field)) != 0 | |
1856 && integer_zerop (TYPE_SIZE (TREE_TYPE (field))))) | |
145 | 1857 || !tree_fits_poly_uint64_p (bit_position (field)) |
0 | 1858 || DECL_SIZE (field) == 0 |
145 | 1859 || !poly_int_tree_p (DECL_SIZE (field), &field_size)) |
0 | 1860 return; |
1861 | |
1862 /* If this field is the whole struct, remember its mode so | |
1863 that, say, we can put a double in a class into a DF | |
1864 register instead of forcing it to live in the stack. */ | |
145 | 1865 if (known_eq (field_size, type_size) |
1866 /* Partial int types (e.g. __int20) may have TYPE_SIZE equal to | |
1867 wider types (e.g. int32), despite precision being less. Ensure | |
1868 that the TYPE_MODE of the struct does not get set to the partial | |
1869 int mode if there is a wider type also in the struct. */ | |
1870 && known_gt (GET_MODE_PRECISION (DECL_MODE (field)), | |
1871 GET_MODE_PRECISION (mode))) | |
0 | 1872 mode = DECL_MODE (field); |
1873 | |
111 | 1874 /* With some targets, it is sub-optimal to access an aligned |
1875 BLKmode structure as a scalar. */ | |
1876 if (targetm.member_type_forces_blk (field, mode)) | |
0 | 1877 return; |
1878 } | |
1879 | |
1880 /* If we only have one real field; use its mode if that mode's size | |
145 | 1881 matches the type's size. This generally only applies to RECORD_TYPE. |
1882 For UNION_TYPE, if the widest field is MODE_INT then use that mode. | |
1883 If the widest field is MODE_PARTIAL_INT, and the union will be passed | |
1884 by reference, then use that mode. */ | |
1885 if ((TREE_CODE (type) == RECORD_TYPE | |
1886 || (TREE_CODE (type) == UNION_TYPE | |
1887 && (GET_MODE_CLASS (mode) == MODE_INT | |
1888 || (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT | |
1889 && (targetm.calls.pass_by_reference | |
1890 (pack_cumulative_args (0), | |
1891 function_arg_info (type, mode, /*named=*/false))))))) | |
131 | 1892 && mode != VOIDmode |
1893 && known_eq (GET_MODE_BITSIZE (mode), type_size)) | |
111 | 1894 ; |
0 | 1895 else |
111 | 1896 mode = mode_for_size_tree (TYPE_SIZE (type), MODE_INT, 1).else_blk (); |
0 | 1897 |
1898 /* If structure's known alignment is less than what the scalar | |
1899 mode would need, and it matters, then stick with BLKmode. */ | |
111 | 1900 if (mode != BLKmode |
0 | 1901 && STRICT_ALIGNMENT |
1902 && ! (TYPE_ALIGN (type) >= BIGGEST_ALIGNMENT | |
111 | 1903 || TYPE_ALIGN (type) >= GET_MODE_ALIGNMENT (mode))) |
0 | 1904 { |
1905 /* If this is the only reason this type is BLKmode, then | |
1906 don't force containing types to be BLKmode. */ | |
1907 TYPE_NO_FORCE_BLK (type) = 1; | |
111 | 1908 mode = BLKmode; |
0 | 1909 } |
111 | 1910 |
1911 SET_TYPE_MODE (type, mode); | |
0 | 1912 } |
1913 | |
1914 /* Compute TYPE_SIZE and TYPE_ALIGN for TYPE, once it has been laid | |
1915 out. */ | |
1916 | |
1917 static void | |
1918 finalize_type_size (tree type) | |
1919 { | |
1920 /* Normally, use the alignment corresponding to the mode chosen. | |
1921 However, where strict alignment is not required, avoid | |
1922 over-aligning structures, since most compilers do not do this | |
1923 alignment. */ | |
111 | 1924 if (TYPE_MODE (type) != BLKmode |
1925 && TYPE_MODE (type) != VOIDmode | |
1926 && (STRICT_ALIGNMENT || !AGGREGATE_TYPE_P (type))) | |
0 | 1927 { |
1928 unsigned mode_align = GET_MODE_ALIGNMENT (TYPE_MODE (type)); | |
1929 | |
1930 /* Don't override a larger alignment requirement coming from a user | |
1931 alignment of one of the fields. */ | |
1932 if (mode_align >= TYPE_ALIGN (type)) | |
1933 { | |
111 | 1934 SET_TYPE_ALIGN (type, mode_align); |
0 | 1935 TYPE_USER_ALIGN (type) = 0; |
1936 } | |
1937 } | |
1938 | |
1939 /* Do machine-dependent extra alignment. */ | |
1940 #ifdef ROUND_TYPE_ALIGN | |
111 | 1941 SET_TYPE_ALIGN (type, |
1942 ROUND_TYPE_ALIGN (type, TYPE_ALIGN (type), BITS_PER_UNIT)); | |
0 | 1943 #endif |
1944 | |
1945 /* If we failed to find a simple way to calculate the unit size | |
1946 of the type, find it by division. */ | |
1947 if (TYPE_SIZE_UNIT (type) == 0 && TYPE_SIZE (type) != 0) | |
1948 /* TYPE_SIZE (type) is computed in bitsizetype. After the division, the | |
1949 result will fit in sizetype. We will get more efficient code using | |
1950 sizetype, so we force a conversion. */ | |
1951 TYPE_SIZE_UNIT (type) | |
1952 = fold_convert (sizetype, | |
1953 size_binop (FLOOR_DIV_EXPR, TYPE_SIZE (type), | |
1954 bitsize_unit_node)); | |
1955 | |
1956 if (TYPE_SIZE (type) != 0) | |
1957 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1958 TYPE_SIZE (type) = round_up (TYPE_SIZE (type), TYPE_ALIGN (type)); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1959 TYPE_SIZE_UNIT (type) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1960 = round_up (TYPE_SIZE_UNIT (type), TYPE_ALIGN_UNIT (type)); |
0 | 1961 } |
1962 | |
1963 /* Evaluate nonconstant sizes only once, either now or as soon as safe. */ | |
1964 if (TYPE_SIZE (type) != 0 && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST) | |
1965 TYPE_SIZE (type) = variable_size (TYPE_SIZE (type)); | |
1966 if (TYPE_SIZE_UNIT (type) != 0 | |
1967 && TREE_CODE (TYPE_SIZE_UNIT (type)) != INTEGER_CST) | |
1968 TYPE_SIZE_UNIT (type) = variable_size (TYPE_SIZE_UNIT (type)); | |
1969 | |
131 | 1970 /* Handle empty records as per the x86-64 psABI. */ |
1971 TYPE_EMPTY_P (type) = targetm.calls.empty_record_p (type); | |
1972 | |
0 | 1973 /* Also layout any other variants of the type. */ |
1974 if (TYPE_NEXT_VARIANT (type) | |
1975 || type != TYPE_MAIN_VARIANT (type)) | |
1976 { | |
1977 tree variant; | |
1978 /* Record layout info of this variant. */ | |
1979 tree size = TYPE_SIZE (type); | |
1980 tree size_unit = TYPE_SIZE_UNIT (type); | |
1981 unsigned int align = TYPE_ALIGN (type); | |
111 | 1982 unsigned int precision = TYPE_PRECISION (type); |
0 | 1983 unsigned int user_align = TYPE_USER_ALIGN (type); |
111 | 1984 machine_mode mode = TYPE_MODE (type); |
131 | 1985 bool empty_p = TYPE_EMPTY_P (type); |
0 | 1986 |
1987 /* Copy it into all variants. */ | |
1988 for (variant = TYPE_MAIN_VARIANT (type); | |
1989 variant != 0; | |
1990 variant = TYPE_NEXT_VARIANT (variant)) | |
1991 { | |
1992 TYPE_SIZE (variant) = size; | |
1993 TYPE_SIZE_UNIT (variant) = size_unit; | |
111 | 1994 unsigned valign = align; |
1995 if (TYPE_USER_ALIGN (variant)) | |
1996 valign = MAX (valign, TYPE_ALIGN (variant)); | |
1997 else | |
1998 TYPE_USER_ALIGN (variant) = user_align; | |
1999 SET_TYPE_ALIGN (variant, valign); | |
2000 TYPE_PRECISION (variant) = precision; | |
0 | 2001 SET_TYPE_MODE (variant, mode); |
131 | 2002 TYPE_EMPTY_P (variant) = empty_p; |
0 | 2003 } |
2004 } | |
2005 } | |
2006 | |
111 | 2007 /* Return a new underlying object for a bitfield started with FIELD. */ |
2008 | |
2009 static tree | |
2010 start_bitfield_representative (tree field) | |
2011 { | |
2012 tree repr = make_node (FIELD_DECL); | |
2013 DECL_FIELD_OFFSET (repr) = DECL_FIELD_OFFSET (field); | |
2014 /* Force the representative to begin at a BITS_PER_UNIT aligned | |
2015 boundary - C++ may use tail-padding of a base object to | |
2016 continue packing bits so the bitfield region does not start | |
2017 at bit zero (see g++.dg/abi/bitfield5.C for example). | |
2018 Unallocated bits may happen for other reasons as well, | |
2019 for example Ada which allows explicit bit-granular structure layout. */ | |
2020 DECL_FIELD_BIT_OFFSET (repr) | |
2021 = size_binop (BIT_AND_EXPR, | |
2022 DECL_FIELD_BIT_OFFSET (field), | |
2023 bitsize_int (~(BITS_PER_UNIT - 1))); | |
2024 SET_DECL_OFFSET_ALIGN (repr, DECL_OFFSET_ALIGN (field)); | |
2025 DECL_SIZE (repr) = DECL_SIZE (field); | |
2026 DECL_SIZE_UNIT (repr) = DECL_SIZE_UNIT (field); | |
2027 DECL_PACKED (repr) = DECL_PACKED (field); | |
2028 DECL_CONTEXT (repr) = DECL_CONTEXT (field); | |
2029 /* There are no indirect accesses to this field. If we introduce | |
2030 some then they have to use the record alias set. This makes | |
2031 sure to properly conflict with [indirect] accesses to addressable | |
2032 fields of the bitfield group. */ | |
2033 DECL_NONADDRESSABLE_P (repr) = 1; | |
2034 return repr; | |
2035 } | |
2036 | |
2037 /* Finish up a bitfield group that was started by creating the underlying | |
2038 object REPR with the last field in the bitfield group FIELD. */ | |
2039 | |
2040 static void | |
2041 finish_bitfield_representative (tree repr, tree field) | |
2042 { | |
2043 unsigned HOST_WIDE_INT bitsize, maxbitsize; | |
2044 tree nextf, size; | |
2045 | |
2046 size = size_diffop (DECL_FIELD_OFFSET (field), | |
2047 DECL_FIELD_OFFSET (repr)); | |
2048 while (TREE_CODE (size) == COMPOUND_EXPR) | |
2049 size = TREE_OPERAND (size, 1); | |
2050 gcc_assert (tree_fits_uhwi_p (size)); | |
2051 bitsize = (tree_to_uhwi (size) * BITS_PER_UNIT | |
2052 + tree_to_uhwi (DECL_FIELD_BIT_OFFSET (field)) | |
2053 - tree_to_uhwi (DECL_FIELD_BIT_OFFSET (repr)) | |
2054 + tree_to_uhwi (DECL_SIZE (field))); | |
2055 | |
2056 /* Round up bitsize to multiples of BITS_PER_UNIT. */ | |
2057 bitsize = (bitsize + BITS_PER_UNIT - 1) & ~(BITS_PER_UNIT - 1); | |
2058 | |
2059 /* Now nothing tells us how to pad out bitsize ... */ | |
2060 nextf = DECL_CHAIN (field); | |
2061 while (nextf && TREE_CODE (nextf) != FIELD_DECL) | |
2062 nextf = DECL_CHAIN (nextf); | |
2063 if (nextf) | |
2064 { | |
2065 tree maxsize; | |
2066 /* If there was an error, the field may be not laid out | |
2067 correctly. Don't bother to do anything. */ | |
2068 if (TREE_TYPE (nextf) == error_mark_node) | |
2069 return; | |
2070 maxsize = size_diffop (DECL_FIELD_OFFSET (nextf), | |
2071 DECL_FIELD_OFFSET (repr)); | |
2072 if (tree_fits_uhwi_p (maxsize)) | |
2073 { | |
2074 maxbitsize = (tree_to_uhwi (maxsize) * BITS_PER_UNIT | |
2075 + tree_to_uhwi (DECL_FIELD_BIT_OFFSET (nextf)) | |
2076 - tree_to_uhwi (DECL_FIELD_BIT_OFFSET (repr))); | |
2077 /* If the group ends within a bitfield nextf does not need to be | |
2078 aligned to BITS_PER_UNIT. Thus round up. */ | |
2079 maxbitsize = (maxbitsize + BITS_PER_UNIT - 1) & ~(BITS_PER_UNIT - 1); | |
2080 } | |
2081 else | |
2082 maxbitsize = bitsize; | |
2083 } | |
2084 else | |
2085 { | |
2086 /* Note that if the C++ FE sets up tail-padding to be re-used it | |
2087 creates a as-base variant of the type with TYPE_SIZE adjusted | |
2088 accordingly. So it is safe to include tail-padding here. */ | |
2089 tree aggsize = lang_hooks.types.unit_size_without_reusable_padding | |
2090 (DECL_CONTEXT (field)); | |
2091 tree maxsize = size_diffop (aggsize, DECL_FIELD_OFFSET (repr)); | |
2092 /* We cannot generally rely on maxsize to fold to an integer constant, | |
2093 so use bitsize as fallback for this case. */ | |
2094 if (tree_fits_uhwi_p (maxsize)) | |
2095 maxbitsize = (tree_to_uhwi (maxsize) * BITS_PER_UNIT | |
2096 - tree_to_uhwi (DECL_FIELD_BIT_OFFSET (repr))); | |
2097 else | |
2098 maxbitsize = bitsize; | |
2099 } | |
2100 | |
2101 /* Only if we don't artificially break up the representative in | |
2102 the middle of a large bitfield with different possibly | |
2103 overlapping representatives. And all representatives start | |
2104 at byte offset. */ | |
2105 gcc_assert (maxbitsize % BITS_PER_UNIT == 0); | |
2106 | |
2107 /* Find the smallest nice mode to use. */ | |
2108 opt_scalar_int_mode mode_iter; | |
2109 FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_INT) | |
2110 if (GET_MODE_BITSIZE (mode_iter.require ()) >= bitsize) | |
2111 break; | |
2112 | |
2113 scalar_int_mode mode; | |
2114 if (!mode_iter.exists (&mode) | |
2115 || GET_MODE_BITSIZE (mode) > maxbitsize | |
2116 || GET_MODE_BITSIZE (mode) > MAX_FIXED_MODE_SIZE) | |
2117 { | |
2118 /* We really want a BLKmode representative only as a last resort, | |
2119 considering the member b in | |
2120 struct { int a : 7; int b : 17; int c; } __attribute__((packed)); | |
2121 Otherwise we simply want to split the representative up | |
2122 allowing for overlaps within the bitfield region as required for | |
2123 struct { int a : 7; int b : 7; | |
2124 int c : 10; int d; } __attribute__((packed)); | |
2125 [0, 15] HImode for a and b, [8, 23] HImode for c. */ | |
2126 DECL_SIZE (repr) = bitsize_int (bitsize); | |
2127 DECL_SIZE_UNIT (repr) = size_int (bitsize / BITS_PER_UNIT); | |
2128 SET_DECL_MODE (repr, BLKmode); | |
2129 TREE_TYPE (repr) = build_array_type_nelts (unsigned_char_type_node, | |
2130 bitsize / BITS_PER_UNIT); | |
2131 } | |
2132 else | |
2133 { | |
2134 unsigned HOST_WIDE_INT modesize = GET_MODE_BITSIZE (mode); | |
2135 DECL_SIZE (repr) = bitsize_int (modesize); | |
2136 DECL_SIZE_UNIT (repr) = size_int (modesize / BITS_PER_UNIT); | |
2137 SET_DECL_MODE (repr, mode); | |
2138 TREE_TYPE (repr) = lang_hooks.types.type_for_mode (mode, 1); | |
2139 } | |
2140 | |
2141 /* Remember whether the bitfield group is at the end of the | |
2142 structure or not. */ | |
2143 DECL_CHAIN (repr) = nextf; | |
2144 } | |
2145 | |
2146 /* Compute and set FIELD_DECLs for the underlying objects we should | |
2147 use for bitfield access for the structure T. */ | |
2148 | |
2149 void | |
2150 finish_bitfield_layout (tree t) | |
2151 { | |
2152 tree field, prev; | |
2153 tree repr = NULL_TREE; | |
2154 | |
2155 /* Unions would be special, for the ease of type-punning optimizations | |
2156 we could use the underlying type as hint for the representative | |
2157 if the bitfield would fit and the representative would not exceed | |
2158 the union in size. */ | |
2159 if (TREE_CODE (t) != RECORD_TYPE) | |
2160 return; | |
2161 | |
2162 for (prev = NULL_TREE, field = TYPE_FIELDS (t); | |
2163 field; field = DECL_CHAIN (field)) | |
2164 { | |
2165 if (TREE_CODE (field) != FIELD_DECL) | |
2166 continue; | |
2167 | |
2168 /* In the C++ memory model, consecutive bit fields in a structure are | |
2169 considered one memory location and updating a memory location | |
2170 may not store into adjacent memory locations. */ | |
2171 if (!repr | |
2172 && DECL_BIT_FIELD_TYPE (field)) | |
2173 { | |
2174 /* Start new representative. */ | |
2175 repr = start_bitfield_representative (field); | |
2176 } | |
2177 else if (repr | |
2178 && ! DECL_BIT_FIELD_TYPE (field)) | |
2179 { | |
2180 /* Finish off new representative. */ | |
2181 finish_bitfield_representative (repr, prev); | |
2182 repr = NULL_TREE; | |
2183 } | |
2184 else if (DECL_BIT_FIELD_TYPE (field)) | |
2185 { | |
2186 gcc_assert (repr != NULL_TREE); | |
2187 | |
2188 /* Zero-size bitfields finish off a representative and | |
2189 do not have a representative themselves. This is | |
2190 required by the C++ memory model. */ | |
2191 if (integer_zerop (DECL_SIZE (field))) | |
2192 { | |
2193 finish_bitfield_representative (repr, prev); | |
2194 repr = NULL_TREE; | |
2195 } | |
2196 | |
2197 /* We assume that either DECL_FIELD_OFFSET of the representative | |
2198 and each bitfield member is a constant or they are equal. | |
2199 This is because we need to be able to compute the bit-offset | |
2200 of each field relative to the representative in get_bit_range | |
2201 during RTL expansion. | |
2202 If these constraints are not met, simply force a new | |
2203 representative to be generated. That will at most | |
2204 generate worse code but still maintain correctness with | |
2205 respect to the C++ memory model. */ | |
2206 else if (!((tree_fits_uhwi_p (DECL_FIELD_OFFSET (repr)) | |
2207 && tree_fits_uhwi_p (DECL_FIELD_OFFSET (field))) | |
2208 || operand_equal_p (DECL_FIELD_OFFSET (repr), | |
2209 DECL_FIELD_OFFSET (field), 0))) | |
2210 { | |
2211 finish_bitfield_representative (repr, prev); | |
2212 repr = start_bitfield_representative (field); | |
2213 } | |
2214 } | |
2215 else | |
2216 continue; | |
2217 | |
2218 if (repr) | |
2219 DECL_BIT_FIELD_REPRESENTATIVE (field) = repr; | |
2220 | |
2221 prev = field; | |
2222 } | |
2223 | |
2224 if (repr) | |
2225 finish_bitfield_representative (repr, prev); | |
2226 } | |
2227 | |
0 | 2228 /* Do all of the work required to layout the type indicated by RLI, |
2229 once the fields have been laid out. This function will call `free' | |
2230 for RLI, unless FREE_P is false. Passing a value other than false | |
2231 for FREE_P is bad practice; this option only exists to support the | |
2232 G++ 3.2 ABI. */ | |
2233 | |
2234 void | |
2235 finish_record_layout (record_layout_info rli, int free_p) | |
2236 { | |
2237 tree variant; | |
2238 | |
2239 /* Compute the final size. */ | |
2240 finalize_record_size (rli); | |
2241 | |
2242 /* Compute the TYPE_MODE for the record. */ | |
2243 compute_record_mode (rli->t); | |
2244 | |
2245 /* Perform any last tweaks to the TYPE_SIZE, etc. */ | |
2246 finalize_type_size (rli->t); | |
2247 | |
111 | 2248 /* Compute bitfield representatives. */ |
2249 finish_bitfield_layout (rli->t); | |
2250 | |
2251 /* Propagate TYPE_PACKED and TYPE_REVERSE_STORAGE_ORDER to variants. | |
2252 With C++ templates, it is too early to do this when the attribute | |
2253 is being parsed. */ | |
0 | 2254 for (variant = TYPE_NEXT_VARIANT (rli->t); variant; |
2255 variant = TYPE_NEXT_VARIANT (variant)) | |
111 | 2256 { |
2257 TYPE_PACKED (variant) = TYPE_PACKED (rli->t); | |
2258 TYPE_REVERSE_STORAGE_ORDER (variant) | |
2259 = TYPE_REVERSE_STORAGE_ORDER (rli->t); | |
2260 } | |
0 | 2261 |
2262 /* Lay out any static members. This is done now because their type | |
2263 may use the record's type. */ | |
111 | 2264 while (!vec_safe_is_empty (rli->pending_statics)) |
2265 layout_decl (rli->pending_statics->pop (), 0); | |
0 | 2266 |
2267 /* Clean up. */ | |
2268 if (free_p) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2269 { |
111 | 2270 vec_free (rli->pending_statics); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2271 free (rli); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2272 } |
0 | 2273 } |
2274 | |
2275 | |
2276 /* Finish processing a builtin RECORD_TYPE type TYPE. It's name is | |
2277 NAME, its fields are chained in reverse on FIELDS. | |
2278 | |
2279 If ALIGN_TYPE is non-null, it is given the same alignment as | |
2280 ALIGN_TYPE. */ | |
2281 | |
2282 void | |
2283 finish_builtin_struct (tree type, const char *name, tree fields, | |
2284 tree align_type) | |
2285 { | |
2286 tree tail, next; | |
2287 | |
2288 for (tail = NULL_TREE; fields; tail = fields, fields = next) | |
2289 { | |
2290 DECL_FIELD_CONTEXT (fields) = type; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2291 next = DECL_CHAIN (fields); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2292 DECL_CHAIN (fields) = tail; |
0 | 2293 } |
2294 TYPE_FIELDS (type) = tail; | |
2295 | |
2296 if (align_type) | |
2297 { | |
111 | 2298 SET_TYPE_ALIGN (type, TYPE_ALIGN (align_type)); |
0 | 2299 TYPE_USER_ALIGN (type) = TYPE_USER_ALIGN (align_type); |
111 | 2300 SET_TYPE_WARN_IF_NOT_ALIGN (type, |
2301 TYPE_WARN_IF_NOT_ALIGN (align_type)); | |
0 | 2302 } |
2303 | |
2304 layout_type (type); | |
2305 #if 0 /* not yet, should get fixed properly later */ | |
2306 TYPE_NAME (type) = make_type_decl (get_identifier (name), type); | |
2307 #else | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2308 TYPE_NAME (type) = build_decl (BUILTINS_LOCATION, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2309 TYPE_DECL, get_identifier (name), type); |
0 | 2310 #endif |
2311 TYPE_STUB_DECL (type) = TYPE_NAME (type); | |
2312 layout_decl (TYPE_NAME (type), 0); | |
2313 } | |
2314 | |
2315 /* Calculate the mode, size, and alignment for TYPE. | |
2316 For an array type, calculate the element separation as well. | |
2317 Record TYPE on the chain of permanent or temporary types | |
2318 so that dbxout will find out about it. | |
2319 | |
2320 TYPE_SIZE of a type is nonzero if the type has been laid out already. | |
2321 layout_type does nothing on such a type. | |
2322 | |
2323 If the type is incomplete, its TYPE_SIZE remains zero. */ | |
2324 | |
2325 void | |
2326 layout_type (tree type) | |
2327 { | |
2328 gcc_assert (type); | |
2329 | |
2330 if (type == error_mark_node) | |
2331 return; | |
2332 | |
111 | 2333 /* We don't want finalize_type_size to copy an alignment attribute to |
2334 variants that don't have it. */ | |
2335 type = TYPE_MAIN_VARIANT (type); | |
2336 | |
0 | 2337 /* Do nothing if type has been laid out before. */ |
2338 if (TYPE_SIZE (type)) | |
2339 return; | |
2340 | |
2341 switch (TREE_CODE (type)) | |
2342 { | |
2343 case LANG_TYPE: | |
2344 /* This kind of type is the responsibility | |
2345 of the language-specific code. */ | |
2346 gcc_unreachable (); | |
2347 | |
111 | 2348 case BOOLEAN_TYPE: |
0 | 2349 case INTEGER_TYPE: |
2350 case ENUMERAL_TYPE: | |
111 | 2351 { |
2352 scalar_int_mode mode | |
2353 = smallest_int_mode_for_size (TYPE_PRECISION (type)); | |
2354 SET_TYPE_MODE (type, mode); | |
2355 TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (mode)); | |
2356 /* Don't set TYPE_PRECISION here, as it may be set by a bitfield. */ | |
2357 TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (mode)); | |
2358 break; | |
2359 } | |
0 | 2360 |
2361 case REAL_TYPE: | |
111 | 2362 { |
2363 /* Allow the caller to choose the type mode, which is how decimal | |
2364 floats are distinguished from binary ones. */ | |
2365 if (TYPE_MODE (type) == VOIDmode) | |
2366 SET_TYPE_MODE | |
2367 (type, float_mode_for_size (TYPE_PRECISION (type)).require ()); | |
2368 scalar_float_mode mode = as_a <scalar_float_mode> (TYPE_MODE (type)); | |
2369 TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (mode)); | |
2370 TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (mode)); | |
2371 break; | |
2372 } | |
0 | 2373 |
2374 case FIXED_POINT_TYPE: | |
111 | 2375 { |
2376 /* TYPE_MODE (type) has been set already. */ | |
2377 scalar_mode mode = SCALAR_TYPE_MODE (type); | |
2378 TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (mode)); | |
2379 TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (mode)); | |
2380 break; | |
2381 } | |
0 | 2382 |
2383 case COMPLEX_TYPE: | |
2384 TYPE_UNSIGNED (type) = TYPE_UNSIGNED (TREE_TYPE (type)); | |
2385 SET_TYPE_MODE (type, | |
111 | 2386 GET_MODE_COMPLEX_MODE (TYPE_MODE (TREE_TYPE (type)))); |
2387 | |
0 | 2388 TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type))); |
2389 TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (TYPE_MODE (type))); | |
2390 break; | |
2391 | |
2392 case VECTOR_TYPE: | |
2393 { | |
131 | 2394 poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (type); |
0 | 2395 tree innertype = TREE_TYPE (type); |
2396 | |
2397 /* Find an appropriate mode for the vector type. */ | |
2398 if (TYPE_MODE (type) == VOIDmode) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2399 SET_TYPE_MODE (type, |
111 | 2400 mode_for_vector (SCALAR_TYPE_MODE (innertype), |
2401 nunits).else_blk ()); | |
0 | 2402 |
2403 TYPE_SATURATING (type) = TYPE_SATURATING (TREE_TYPE (type)); | |
2404 TYPE_UNSIGNED (type) = TYPE_UNSIGNED (TREE_TYPE (type)); | |
111 | 2405 /* Several boolean vector elements may fit in a single unit. */ |
2406 if (VECTOR_BOOLEAN_TYPE_P (type) | |
2407 && type->type_common.mode != BLKmode) | |
2408 TYPE_SIZE_UNIT (type) | |
2409 = size_int (GET_MODE_SIZE (type->type_common.mode)); | |
2410 else | |
2411 TYPE_SIZE_UNIT (type) = int_const_binop (MULT_EXPR, | |
2412 TYPE_SIZE_UNIT (innertype), | |
2413 size_int (nunits)); | |
131 | 2414 TYPE_SIZE (type) = int_const_binop |
2415 (MULT_EXPR, | |
2416 bits_from_bytes (TYPE_SIZE_UNIT (type)), | |
2417 bitsize_int (BITS_PER_UNIT)); | |
111 | 2418 |
2419 /* For vector types, we do not default to the mode's alignment. | |
2420 Instead, query a target hook, defaulting to natural alignment. | |
2421 This prevents ABI changes depending on whether or not native | |
2422 vector modes are supported. */ | |
2423 SET_TYPE_ALIGN (type, targetm.vector_alignment (type)); | |
2424 | |
2425 /* However, if the underlying mode requires a bigger alignment than | |
2426 what the target hook provides, we cannot use the mode. For now, | |
2427 simply reject that case. */ | |
2428 gcc_assert (TYPE_ALIGN (type) | |
2429 >= GET_MODE_ALIGNMENT (TYPE_MODE (type))); | |
0 | 2430 break; |
2431 } | |
2432 | |
2433 case VOID_TYPE: | |
2434 /* This is an incomplete type and so doesn't have a size. */ | |
111 | 2435 SET_TYPE_ALIGN (type, 1); |
0 | 2436 TYPE_USER_ALIGN (type) = 0; |
2437 SET_TYPE_MODE (type, VOIDmode); | |
2438 break; | |
2439 | |
2440 case OFFSET_TYPE: | |
2441 TYPE_SIZE (type) = bitsize_int (POINTER_SIZE); | |
111 | 2442 TYPE_SIZE_UNIT (type) = size_int (POINTER_SIZE_UNITS); |
2443 /* A pointer might be MODE_PARTIAL_INT, but ptrdiff_t must be | |
2444 integral, which may be an __intN. */ | |
2445 SET_TYPE_MODE (type, int_mode_for_size (POINTER_SIZE, 0).require ()); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2446 TYPE_PRECISION (type) = POINTER_SIZE; |
0 | 2447 break; |
2448 | |
2449 case FUNCTION_TYPE: | |
2450 case METHOD_TYPE: | |
2451 /* It's hard to see what the mode and size of a function ought to | |
2452 be, but we do know the alignment is FUNCTION_BOUNDARY, so | |
2453 make it consistent with that. */ | |
111 | 2454 SET_TYPE_MODE (type, |
2455 int_mode_for_size (FUNCTION_BOUNDARY, 0).else_blk ()); | |
0 | 2456 TYPE_SIZE (type) = bitsize_int (FUNCTION_BOUNDARY); |
2457 TYPE_SIZE_UNIT (type) = size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT); | |
2458 break; | |
2459 | |
2460 case POINTER_TYPE: | |
2461 case REFERENCE_TYPE: | |
2462 { | |
111 | 2463 scalar_int_mode mode = SCALAR_INT_TYPE_MODE (type); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2464 TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (mode)); |
0 | 2465 TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (mode)); |
2466 TYPE_UNSIGNED (type) = 1; | |
111 | 2467 TYPE_PRECISION (type) = GET_MODE_PRECISION (mode); |
0 | 2468 } |
2469 break; | |
2470 | |
2471 case ARRAY_TYPE: | |
2472 { | |
2473 tree index = TYPE_DOMAIN (type); | |
2474 tree element = TREE_TYPE (type); | |
2475 | |
2476 /* We need to know both bounds in order to compute the size. */ | |
2477 if (index && TYPE_MAX_VALUE (index) && TYPE_MIN_VALUE (index) | |
2478 && TYPE_SIZE (element)) | |
2479 { | |
2480 tree ub = TYPE_MAX_VALUE (index); | |
2481 tree lb = TYPE_MIN_VALUE (index); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2482 tree element_size = TYPE_SIZE (element); |
0 | 2483 tree length; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2484 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2485 /* Make sure that an array of zero-sized element is zero-sized |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2486 regardless of its extent. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2487 if (integer_zerop (element_size)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2488 length = size_zero_node; |
0 | 2489 |
111 | 2490 /* The computation should happen in the original signedness so |
2491 that (possible) negative values are handled appropriately | |
2492 when determining overflow. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2493 else |
111 | 2494 { |
2495 /* ??? When it is obvious that the range is signed | |
2496 represent it using ssizetype. */ | |
2497 if (TREE_CODE (lb) == INTEGER_CST | |
2498 && TREE_CODE (ub) == INTEGER_CST | |
2499 && TYPE_UNSIGNED (TREE_TYPE (lb)) | |
2500 && tree_int_cst_lt (ub, lb)) | |
2501 { | |
2502 lb = wide_int_to_tree (ssizetype, | |
2503 offset_int::from (wi::to_wide (lb), | |
2504 SIGNED)); | |
2505 ub = wide_int_to_tree (ssizetype, | |
2506 offset_int::from (wi::to_wide (ub), | |
2507 SIGNED)); | |
2508 } | |
2509 length | |
2510 = fold_convert (sizetype, | |
2511 size_binop (PLUS_EXPR, | |
2512 build_int_cst (TREE_TYPE (lb), 1), | |
2513 size_binop (MINUS_EXPR, ub, lb))); | |
2514 } | |
2515 | |
2516 /* ??? We have no way to distinguish a null-sized array from an | |
2517 array spanning the whole sizetype range, so we arbitrarily | |
2518 decide that [0, -1] is the only valid representation. */ | |
2519 if (integer_zerop (length) | |
2520 && TREE_OVERFLOW (length) | |
2521 && integer_zerop (lb)) | |
2522 length = size_zero_node; | |
0 | 2523 |
2524 TYPE_SIZE (type) = size_binop (MULT_EXPR, element_size, | |
131 | 2525 bits_from_bytes (length)); |
0 | 2526 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2527 /* If we know the size of the element, calculate the total size |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2528 directly, rather than do some division thing below. This |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2529 optimization helps Fortran assumed-size arrays (where the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2530 size of the array is determined at runtime) substantially. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2531 if (TYPE_SIZE_UNIT (element)) |
0 | 2532 TYPE_SIZE_UNIT (type) |
2533 = size_binop (MULT_EXPR, TYPE_SIZE_UNIT (element), length); | |
2534 } | |
2535 | |
2536 /* Now round the alignment and size, | |
2537 using machine-dependent criteria if any. */ | |
2538 | |
111 | 2539 unsigned align = TYPE_ALIGN (element); |
2540 if (TYPE_USER_ALIGN (type)) | |
2541 align = MAX (align, TYPE_ALIGN (type)); | |
2542 else | |
2543 TYPE_USER_ALIGN (type) = TYPE_USER_ALIGN (element); | |
2544 if (!TYPE_WARN_IF_NOT_ALIGN (type)) | |
2545 SET_TYPE_WARN_IF_NOT_ALIGN (type, | |
2546 TYPE_WARN_IF_NOT_ALIGN (element)); | |
0 | 2547 #ifdef ROUND_TYPE_ALIGN |
111 | 2548 align = ROUND_TYPE_ALIGN (type, align, BITS_PER_UNIT); |
0 | 2549 #else |
111 | 2550 align = MAX (align, BITS_PER_UNIT); |
0 | 2551 #endif |
111 | 2552 SET_TYPE_ALIGN (type, align); |
0 | 2553 SET_TYPE_MODE (type, BLKmode); |
2554 if (TYPE_SIZE (type) != 0 | |
111 | 2555 && ! targetm.member_type_forces_blk (type, VOIDmode) |
0 | 2556 /* BLKmode elements force BLKmode aggregate; |
2557 else extract/store fields may lose. */ | |
2558 && (TYPE_MODE (TREE_TYPE (type)) != BLKmode | |
2559 || TYPE_NO_FORCE_BLK (TREE_TYPE (type)))) | |
2560 { | |
111 | 2561 SET_TYPE_MODE (type, mode_for_array (TREE_TYPE (type), |
2562 TYPE_SIZE (type))); | |
0 | 2563 if (TYPE_MODE (type) != BLKmode |
2564 && STRICT_ALIGNMENT && TYPE_ALIGN (type) < BIGGEST_ALIGNMENT | |
2565 && TYPE_ALIGN (type) < GET_MODE_ALIGNMENT (TYPE_MODE (type))) | |
2566 { | |
2567 TYPE_NO_FORCE_BLK (type) = 1; | |
2568 SET_TYPE_MODE (type, BLKmode); | |
2569 } | |
2570 } | |
111 | 2571 if (AGGREGATE_TYPE_P (element)) |
2572 TYPE_TYPELESS_STORAGE (type) = TYPE_TYPELESS_STORAGE (element); | |
0 | 2573 /* When the element size is constant, check that it is at least as |
2574 large as the element alignment. */ | |
2575 if (TYPE_SIZE_UNIT (element) | |
2576 && TREE_CODE (TYPE_SIZE_UNIT (element)) == INTEGER_CST | |
2577 /* If TYPE_SIZE_UNIT overflowed, then it is certainly larger than | |
2578 TYPE_ALIGN_UNIT. */ | |
2579 && !TREE_OVERFLOW (TYPE_SIZE_UNIT (element)) | |
2580 && !integer_zerop (TYPE_SIZE_UNIT (element)) | |
2581 && compare_tree_int (TYPE_SIZE_UNIT (element), | |
2582 TYPE_ALIGN_UNIT (element)) < 0) | |
2583 error ("alignment of array elements is greater than element size"); | |
2584 break; | |
2585 } | |
2586 | |
2587 case RECORD_TYPE: | |
2588 case UNION_TYPE: | |
2589 case QUAL_UNION_TYPE: | |
2590 { | |
2591 tree field; | |
2592 record_layout_info rli; | |
2593 | |
2594 /* Initialize the layout information. */ | |
2595 rli = start_record_layout (type); | |
2596 | |
2597 /* If this is a QUAL_UNION_TYPE, we want to process the fields | |
2598 in the reverse order in building the COND_EXPR that denotes | |
2599 its size. We reverse them again later. */ | |
2600 if (TREE_CODE (type) == QUAL_UNION_TYPE) | |
2601 TYPE_FIELDS (type) = nreverse (TYPE_FIELDS (type)); | |
2602 | |
2603 /* Place all the fields. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2604 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field)) |
0 | 2605 place_field (rli, field); |
2606 | |
2607 if (TREE_CODE (type) == QUAL_UNION_TYPE) | |
2608 TYPE_FIELDS (type) = nreverse (TYPE_FIELDS (type)); | |
2609 | |
2610 /* Finish laying out the record. */ | |
2611 finish_record_layout (rli, /*free_p=*/true); | |
2612 } | |
2613 break; | |
2614 | |
2615 default: | |
2616 gcc_unreachable (); | |
2617 } | |
2618 | |
2619 /* Compute the final TYPE_SIZE, TYPE_ALIGN, etc. for TYPE. For | |
2620 records and unions, finish_record_layout already called this | |
2621 function. */ | |
111 | 2622 if (!RECORD_OR_UNION_TYPE_P (type)) |
0 | 2623 finalize_type_size (type); |
2624 | |
2625 /* We should never see alias sets on incomplete aggregates. And we | |
2626 should not call layout_type on not incomplete aggregates. */ | |
2627 if (AGGREGATE_TYPE_P (type)) | |
2628 gcc_assert (!TYPE_ALIAS_SET_KNOWN_P (type)); | |
2629 } | |
2630 | |
111 | 2631 /* Return the least alignment required for type TYPE. */ |
2632 | |
2633 unsigned int | |
2634 min_align_of_type (tree type) | |
0 | 2635 { |
111 | 2636 unsigned int align = TYPE_ALIGN (type); |
2637 if (!TYPE_USER_ALIGN (type)) | |
0 | 2638 { |
111 | 2639 align = MIN (align, BIGGEST_ALIGNMENT); |
2640 #ifdef BIGGEST_FIELD_ALIGNMENT | |
2641 align = MIN (align, BIGGEST_FIELD_ALIGNMENT); | |
2642 #endif | |
2643 unsigned int field_align = align; | |
2644 #ifdef ADJUST_FIELD_ALIGN | |
2645 field_align = ADJUST_FIELD_ALIGN (NULL_TREE, type, field_align); | |
2646 #endif | |
2647 align = MIN (align, field_align); | |
0 | 2648 } |
111 | 2649 return align / BITS_PER_UNIT; |
0 | 2650 } |
2651 | |
2652 /* Create and return a type for signed integers of PRECISION bits. */ | |
2653 | |
2654 tree | |
2655 make_signed_type (int precision) | |
2656 { | |
2657 tree type = make_node (INTEGER_TYPE); | |
2658 | |
2659 TYPE_PRECISION (type) = precision; | |
2660 | |
2661 fixup_signed_type (type); | |
2662 return type; | |
2663 } | |
2664 | |
2665 /* Create and return a type for unsigned integers of PRECISION bits. */ | |
2666 | |
2667 tree | |
2668 make_unsigned_type (int precision) | |
2669 { | |
2670 tree type = make_node (INTEGER_TYPE); | |
2671 | |
2672 TYPE_PRECISION (type) = precision; | |
2673 | |
2674 fixup_unsigned_type (type); | |
2675 return type; | |
2676 } | |
2677 | |
2678 /* Create and return a type for fract of PRECISION bits, UNSIGNEDP, | |
2679 and SATP. */ | |
2680 | |
2681 tree | |
2682 make_fract_type (int precision, int unsignedp, int satp) | |
2683 { | |
2684 tree type = make_node (FIXED_POINT_TYPE); | |
2685 | |
2686 TYPE_PRECISION (type) = precision; | |
2687 | |
2688 if (satp) | |
2689 TYPE_SATURATING (type) = 1; | |
2690 | |
2691 /* Lay out the type: set its alignment, size, etc. */ | |
111 | 2692 TYPE_UNSIGNED (type) = unsignedp; |
2693 enum mode_class mclass = unsignedp ? MODE_UFRACT : MODE_FRACT; | |
2694 SET_TYPE_MODE (type, mode_for_size (precision, mclass, 0).require ()); | |
0 | 2695 layout_type (type); |
2696 | |
2697 return type; | |
2698 } | |
2699 | |
2700 /* Create and return a type for accum of PRECISION bits, UNSIGNEDP, | |
2701 and SATP. */ | |
2702 | |
2703 tree | |
2704 make_accum_type (int precision, int unsignedp, int satp) | |
2705 { | |
2706 tree type = make_node (FIXED_POINT_TYPE); | |
2707 | |
2708 TYPE_PRECISION (type) = precision; | |
2709 | |
2710 if (satp) | |
2711 TYPE_SATURATING (type) = 1; | |
2712 | |
2713 /* Lay out the type: set its alignment, size, etc. */ | |
111 | 2714 TYPE_UNSIGNED (type) = unsignedp; |
2715 enum mode_class mclass = unsignedp ? MODE_UACCUM : MODE_ACCUM; | |
2716 SET_TYPE_MODE (type, mode_for_size (precision, mclass, 0).require ()); | |
0 | 2717 layout_type (type); |
2718 | |
2719 return type; | |
2720 } | |
2721 | |
111 | 2722 /* Initialize sizetypes so layout_type can use them. */ |
0 | 2723 |
2724 void | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2725 initialize_sizetypes (void) |
0 | 2726 { |
111 | 2727 int precision, bprecision; |
2728 | |
2729 /* Get sizetypes precision from the SIZE_TYPE target macro. */ | |
2730 if (strcmp (SIZETYPE, "unsigned int") == 0) | |
2731 precision = INT_TYPE_SIZE; | |
2732 else if (strcmp (SIZETYPE, "long unsigned int") == 0) | |
2733 precision = LONG_TYPE_SIZE; | |
2734 else if (strcmp (SIZETYPE, "long long unsigned int") == 0) | |
2735 precision = LONG_LONG_TYPE_SIZE; | |
2736 else if (strcmp (SIZETYPE, "short unsigned int") == 0) | |
2737 precision = SHORT_TYPE_SIZE; | |
2738 else | |
2739 { | |
2740 int i; | |
2741 | |
2742 precision = -1; | |
2743 for (i = 0; i < NUM_INT_N_ENTS; i++) | |
2744 if (int_n_enabled_p[i]) | |
2745 { | |
145 | 2746 char name[50], altname[50]; |
111 | 2747 sprintf (name, "__int%d unsigned", int_n_data[i].bitsize); |
145 | 2748 sprintf (altname, "__int%d__ unsigned", int_n_data[i].bitsize); |
2749 | |
2750 if (strcmp (name, SIZETYPE) == 0 | |
2751 || strcmp (altname, SIZETYPE) == 0) | |
111 | 2752 { |
2753 precision = int_n_data[i].bitsize; | |
2754 } | |
2755 } | |
2756 if (precision == -1) | |
2757 gcc_unreachable (); | |
2758 } | |
2759 | |
2760 bprecision | |
2761 = MIN (precision + LOG2_BITS_PER_UNIT + 1, MAX_FIXED_MODE_SIZE); | |
2762 bprecision = GET_MODE_PRECISION (smallest_int_mode_for_size (bprecision)); | |
2763 if (bprecision > HOST_BITS_PER_DOUBLE_INT) | |
2764 bprecision = HOST_BITS_PER_DOUBLE_INT; | |
2765 | |
2766 /* Create stubs for sizetype and bitsizetype so we can create constants. */ | |
2767 sizetype = make_node (INTEGER_TYPE); | |
2768 TYPE_NAME (sizetype) = get_identifier ("sizetype"); | |
2769 TYPE_PRECISION (sizetype) = precision; | |
2770 TYPE_UNSIGNED (sizetype) = 1; | |
2771 bitsizetype = make_node (INTEGER_TYPE); | |
2772 TYPE_NAME (bitsizetype) = get_identifier ("bitsizetype"); | |
2773 TYPE_PRECISION (bitsizetype) = bprecision; | |
2774 TYPE_UNSIGNED (bitsizetype) = 1; | |
2775 | |
2776 /* Now layout both types manually. */ | |
2777 scalar_int_mode mode = smallest_int_mode_for_size (precision); | |
2778 SET_TYPE_MODE (sizetype, mode); | |
2779 SET_TYPE_ALIGN (sizetype, GET_MODE_ALIGNMENT (TYPE_MODE (sizetype))); | |
2780 TYPE_SIZE (sizetype) = bitsize_int (precision); | |
2781 TYPE_SIZE_UNIT (sizetype) = size_int (GET_MODE_SIZE (mode)); | |
2782 set_min_and_max_values_for_integral_type (sizetype, precision, UNSIGNED); | |
2783 | |
2784 mode = smallest_int_mode_for_size (bprecision); | |
2785 SET_TYPE_MODE (bitsizetype, mode); | |
2786 SET_TYPE_ALIGN (bitsizetype, GET_MODE_ALIGNMENT (TYPE_MODE (bitsizetype))); | |
2787 TYPE_SIZE (bitsizetype) = bitsize_int (bprecision); | |
2788 TYPE_SIZE_UNIT (bitsizetype) = size_int (GET_MODE_SIZE (mode)); | |
2789 set_min_and_max_values_for_integral_type (bitsizetype, bprecision, UNSIGNED); | |
0 | 2790 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2791 /* Create the signed variants of *sizetype. */ |
111 | 2792 ssizetype = make_signed_type (TYPE_PRECISION (sizetype)); |
2793 TYPE_NAME (ssizetype) = get_identifier ("ssizetype"); | |
2794 sbitsizetype = make_signed_type (TYPE_PRECISION (bitsizetype)); | |
2795 TYPE_NAME (sbitsizetype) = get_identifier ("sbitsizetype"); | |
0 | 2796 } |
2797 | |
2798 /* TYPE is an integral type, i.e., an INTEGRAL_TYPE, ENUMERAL_TYPE | |
2799 or BOOLEAN_TYPE. Set TYPE_MIN_VALUE and TYPE_MAX_VALUE | |
2800 for TYPE, based on the PRECISION and whether or not the TYPE | |
2801 IS_UNSIGNED. PRECISION need not correspond to a width supported | |
2802 natively by the hardware; for example, on a machine with 8-bit, | |
2803 16-bit, and 32-bit register modes, PRECISION might be 7, 23, or | |
2804 61. */ | |
2805 | |
2806 void | |
2807 set_min_and_max_values_for_integral_type (tree type, | |
2808 int precision, | |
111 | 2809 signop sgn) |
0 | 2810 { |
111 | 2811 /* For bitfields with zero width we end up creating integer types |
2812 with zero precision. Don't assign any minimum/maximum values | |
2813 to those types, they don't have any valid value. */ | |
2814 if (precision < 1) | |
2815 return; | |
2816 | |
2817 TYPE_MIN_VALUE (type) | |
2818 = wide_int_to_tree (type, wi::min_value (precision, sgn)); | |
2819 TYPE_MAX_VALUE (type) | |
2820 = wide_int_to_tree (type, wi::max_value (precision, sgn)); | |
0 | 2821 } |
2822 | |
2823 /* Set the extreme values of TYPE based on its precision in bits, | |
2824 then lay it out. Used when make_signed_type won't do | |
111 | 2825 because the tree code is not INTEGER_TYPE. */ |
0 | 2826 |
2827 void | |
2828 fixup_signed_type (tree type) | |
2829 { | |
2830 int precision = TYPE_PRECISION (type); | |
2831 | |
111 | 2832 set_min_and_max_values_for_integral_type (type, precision, SIGNED); |
0 | 2833 |
2834 /* Lay out the type: set its alignment, size, etc. */ | |
2835 layout_type (type); | |
2836 } | |
2837 | |
2838 /* Set the extreme values of TYPE based on its precision in bits, | |
2839 then lay it out. This is used both in `make_unsigned_type' | |
2840 and for enumeral types. */ | |
2841 | |
2842 void | |
2843 fixup_unsigned_type (tree type) | |
2844 { | |
2845 int precision = TYPE_PRECISION (type); | |
2846 | |
2847 TYPE_UNSIGNED (type) = 1; | |
2848 | |
111 | 2849 set_min_and_max_values_for_integral_type (type, precision, UNSIGNED); |
0 | 2850 |
2851 /* Lay out the type: set its alignment, size, etc. */ | |
2852 layout_type (type); | |
2853 } | |
2854 | |
111 | 2855 /* Construct an iterator for a bitfield that spans BITSIZE bits, |
2856 starting at BITPOS. | |
2857 | |
2858 BITREGION_START is the bit position of the first bit in this | |
2859 sequence of bit fields. BITREGION_END is the last bit in this | |
2860 sequence. If these two fields are non-zero, we should restrict the | |
2861 memory access to that range. Otherwise, we are allowed to touch | |
2862 any adjacent non bit-fields. | |
2863 | |
2864 ALIGN is the alignment of the underlying object in bits. | |
2865 VOLATILEP says whether the bitfield is volatile. */ | |
2866 | |
2867 bit_field_mode_iterator | |
2868 ::bit_field_mode_iterator (HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, | |
131 | 2869 poly_int64 bitregion_start, |
2870 poly_int64 bitregion_end, | |
111 | 2871 unsigned int align, bool volatilep) |
2872 : m_mode (NARROWEST_INT_MODE), m_bitsize (bitsize), | |
2873 m_bitpos (bitpos), m_bitregion_start (bitregion_start), | |
2874 m_bitregion_end (bitregion_end), m_align (align), | |
2875 m_volatilep (volatilep), m_count (0) | |
2876 { | |
131 | 2877 if (known_eq (m_bitregion_end, 0)) |
111 | 2878 { |
2879 /* We can assume that any aligned chunk of ALIGN bits that overlaps | |
2880 the bitfield is mapped and won't trap, provided that ALIGN isn't | |
2881 too large. The cap is the biggest required alignment for data, | |
2882 or at least the word size. And force one such chunk at least. */ | |
2883 unsigned HOST_WIDE_INT units | |
2884 = MIN (align, MAX (BIGGEST_ALIGNMENT, BITS_PER_WORD)); | |
2885 if (bitsize <= 0) | |
2886 bitsize = 1; | |
131 | 2887 HOST_WIDE_INT end = bitpos + bitsize + units - 1; |
2888 m_bitregion_end = end - end % units - 1; | |
111 | 2889 } |
2890 } | |
2891 | |
2892 /* Calls to this function return successively larger modes that can be used | |
2893 to represent the bitfield. Return true if another bitfield mode is | |
2894 available, storing it in *OUT_MODE if so. */ | |
2895 | |
2896 bool | |
2897 bit_field_mode_iterator::next_mode (scalar_int_mode *out_mode) | |
2898 { | |
2899 scalar_int_mode mode; | |
2900 for (; m_mode.exists (&mode); m_mode = GET_MODE_WIDER_MODE (mode)) | |
2901 { | |
2902 unsigned int unit = GET_MODE_BITSIZE (mode); | |
2903 | |
2904 /* Skip modes that don't have full precision. */ | |
2905 if (unit != GET_MODE_PRECISION (mode)) | |
2906 continue; | |
2907 | |
2908 /* Stop if the mode is too wide to handle efficiently. */ | |
2909 if (unit > MAX_FIXED_MODE_SIZE) | |
2910 break; | |
2911 | |
2912 /* Don't deliver more than one multiword mode; the smallest one | |
2913 should be used. */ | |
2914 if (m_count > 0 && unit > BITS_PER_WORD) | |
2915 break; | |
2916 | |
2917 /* Skip modes that are too small. */ | |
2918 unsigned HOST_WIDE_INT substart = (unsigned HOST_WIDE_INT) m_bitpos % unit; | |
2919 unsigned HOST_WIDE_INT subend = substart + m_bitsize; | |
2920 if (subend > unit) | |
2921 continue; | |
2922 | |
2923 /* Stop if the mode goes outside the bitregion. */ | |
2924 HOST_WIDE_INT start = m_bitpos - substart; | |
131 | 2925 if (maybe_ne (m_bitregion_start, 0) |
2926 && maybe_lt (start, m_bitregion_start)) | |
111 | 2927 break; |
2928 HOST_WIDE_INT end = start + unit; | |
131 | 2929 if (maybe_gt (end, m_bitregion_end + 1)) |
111 | 2930 break; |
2931 | |
2932 /* Stop if the mode requires too much alignment. */ | |
2933 if (GET_MODE_ALIGNMENT (mode) > m_align | |
2934 && targetm.slow_unaligned_access (mode, m_align)) | |
2935 break; | |
2936 | |
2937 *out_mode = mode; | |
2938 m_mode = GET_MODE_WIDER_MODE (mode); | |
2939 m_count++; | |
2940 return true; | |
2941 } | |
2942 return false; | |
2943 } | |
2944 | |
2945 /* Return true if smaller modes are generally preferred for this kind | |
2946 of bitfield. */ | |
2947 | |
2948 bool | |
2949 bit_field_mode_iterator::prefer_smaller_modes () | |
2950 { | |
2951 return (m_volatilep | |
2952 ? targetm.narrow_volatile_bitfield () | |
2953 : !SLOW_BYTE_ACCESS); | |
2954 } | |
2955 | |
0 | 2956 /* Find the best machine mode to use when referencing a bit field of length |
2957 BITSIZE bits starting at BITPOS. | |
2958 | |
111 | 2959 BITREGION_START is the bit position of the first bit in this |
2960 sequence of bit fields. BITREGION_END is the last bit in this | |
2961 sequence. If these two fields are non-zero, we should restrict the | |
2962 memory access to that range. Otherwise, we are allowed to touch | |
2963 any adjacent non bit-fields. | |
2964 | |
2965 The chosen mode must have no more than LARGEST_MODE_BITSIZE bits. | |
2966 INT_MAX is a suitable value for LARGEST_MODE_BITSIZE if the caller | |
2967 doesn't want to apply a specific limit. | |
2968 | |
2969 If no mode meets all these conditions, we return VOIDmode. | |
2970 | |
0 | 2971 The underlying object is known to be aligned to a boundary of ALIGN bits. |
2972 | |
2973 If VOLATILEP is false and SLOW_BYTE_ACCESS is false, we return the | |
2974 smallest mode meeting these conditions. | |
2975 | |
2976 If VOLATILEP is false and SLOW_BYTE_ACCESS is true, we return the | |
2977 largest mode (but a mode no wider than UNITS_PER_WORD) that meets | |
2978 all the conditions. | |
2979 | |
2980 If VOLATILEP is true the narrow_volatile_bitfields target hook is used to | |
2981 decide which of the above modes should be used. */ | |
2982 | |
111 | 2983 bool |
2984 get_best_mode (int bitsize, int bitpos, | |
131 | 2985 poly_uint64 bitregion_start, poly_uint64 bitregion_end, |
111 | 2986 unsigned int align, |
2987 unsigned HOST_WIDE_INT largest_mode_bitsize, bool volatilep, | |
2988 scalar_int_mode *best_mode) | |
0 | 2989 { |
111 | 2990 bit_field_mode_iterator iter (bitsize, bitpos, bitregion_start, |
2991 bitregion_end, align, volatilep); | |
2992 scalar_int_mode mode; | |
2993 bool found = false; | |
2994 while (iter.next_mode (&mode) | |
2995 /* ??? For historical reasons, reject modes that would normally | |
2996 receive greater alignment, even if unaligned accesses are | |
2997 acceptable. This has both advantages and disadvantages. | |
2998 Removing this check means that something like: | |
2999 | |
3000 struct s { unsigned int x; unsigned int y; }; | |
3001 int f (struct s *s) { return s->x == 0 && s->y == 0; } | |
3002 | |
3003 can be implemented using a single load and compare on | |
3004 64-bit machines that have no alignment restrictions. | |
3005 For example, on powerpc64-linux-gnu, we would generate: | |
3006 | |
3007 ld 3,0(3) | |
3008 cntlzd 3,3 | |
3009 srdi 3,3,6 | |
3010 blr | |
3011 | |
3012 rather than: | |
3013 | |
3014 lwz 9,0(3) | |
3015 cmpwi 7,9,0 | |
3016 bne 7,.L3 | |
3017 lwz 3,4(3) | |
3018 cntlzw 3,3 | |
3019 srwi 3,3,5 | |
3020 extsw 3,3 | |
3021 blr | |
3022 .p2align 4,,15 | |
3023 .L3: | |
3024 li 3,0 | |
3025 blr | |
3026 | |
3027 However, accessing more than one field can make life harder | |
3028 for the gimple optimizers. For example, gcc.dg/vect/bb-slp-5.c | |
3029 has a series of unsigned short copies followed by a series of | |
3030 unsigned short comparisons. With this check, both the copies | |
3031 and comparisons remain 16-bit accesses and FRE is able | |
3032 to eliminate the latter. Without the check, the comparisons | |
3033 can be done using 2 64-bit operations, which FRE isn't able | |
3034 to handle in the same way. | |
3035 | |
3036 Either way, it would probably be worth disabling this check | |
3037 during expand. One particular example where removing the | |
3038 check would help is the get_best_mode call in store_bit_field. | |
3039 If we are given a memory bitregion of 128 bits that is aligned | |
3040 to a 64-bit boundary, and the bitfield we want to modify is | |
3041 in the second half of the bitregion, this check causes | |
3042 store_bitfield to turn the memory into a 64-bit reference | |
3043 to the _first_ half of the region. We later use | |
3044 adjust_bitfield_address to get a reference to the correct half, | |
3045 but doing so looks to adjust_bitfield_address as though we are | |
3046 moving past the end of the original object, so it drops the | |
3047 associated MEM_EXPR and MEM_OFFSET. Removing the check | |
3048 causes store_bit_field to keep a 128-bit memory reference, | |
3049 so that the final bitfield reference still has a MEM_EXPR | |
3050 and MEM_OFFSET. */ | |
3051 && GET_MODE_ALIGNMENT (mode) <= align | |
3052 && GET_MODE_BITSIZE (mode) <= largest_mode_bitsize) | |
0 | 3053 { |
111 | 3054 *best_mode = mode; |
3055 found = true; | |
3056 if (iter.prefer_smaller_modes ()) | |
0 | 3057 break; |
3058 } | |
3059 | |
111 | 3060 return found; |
0 | 3061 } |
3062 | |
3063 /* Gets minimal and maximal values for MODE (signed or unsigned depending on | |
3064 SIGN). The returned constants are made to be usable in TARGET_MODE. */ | |
3065 | |
3066 void | |
111 | 3067 get_mode_bounds (scalar_int_mode mode, int sign, |
3068 scalar_int_mode target_mode, | |
0 | 3069 rtx *mmin, rtx *mmax) |
3070 { | |
111 | 3071 unsigned size = GET_MODE_PRECISION (mode); |
0 | 3072 unsigned HOST_WIDE_INT min_val, max_val; |
3073 | |
3074 gcc_assert (size <= HOST_BITS_PER_WIDE_INT); | |
3075 | |
111 | 3076 /* Special case BImode, which has values 0 and STORE_FLAG_VALUE. */ |
3077 if (mode == BImode) | |
0 | 3078 { |
111 | 3079 if (STORE_FLAG_VALUE < 0) |
3080 { | |
3081 min_val = STORE_FLAG_VALUE; | |
3082 max_val = 0; | |
3083 } | |
3084 else | |
3085 { | |
3086 min_val = 0; | |
3087 max_val = STORE_FLAG_VALUE; | |
3088 } | |
3089 } | |
3090 else if (sign) | |
3091 { | |
3092 min_val = -(HOST_WIDE_INT_1U << (size - 1)); | |
3093 max_val = (HOST_WIDE_INT_1U << (size - 1)) - 1; | |
0 | 3094 } |
3095 else | |
3096 { | |
3097 min_val = 0; | |
111 | 3098 max_val = (HOST_WIDE_INT_1U << (size - 1) << 1) - 1; |
0 | 3099 } |
3100 | |
3101 *mmin = gen_int_mode (min_val, target_mode); | |
3102 *mmax = gen_int_mode (max_val, target_mode); | |
3103 } | |
3104 | |
3105 #include "gt-stor-layout.h" |