annotate gcc/tree-streamer-out.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Routines for emitting trees to a file stream.
kono
parents:
diff changeset
2
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3 Copyright (C) 2011-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
4 Contributed by Diego Novillo <dnovillo@google.com>
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 This file is part of GCC.
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
9 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
10 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
11 version.
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
16 for more details.
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
19 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
20 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 #include "config.h"
kono
parents:
diff changeset
23 #include "system.h"
kono
parents:
diff changeset
24 #include "coretypes.h"
kono
parents:
diff changeset
25 #include "backend.h"
kono
parents:
diff changeset
26 #include "target.h"
kono
parents:
diff changeset
27 #include "tree.h"
kono
parents:
diff changeset
28 #include "gimple.h"
kono
parents:
diff changeset
29 #include "tree-streamer.h"
kono
parents:
diff changeset
30 #include "cgraph.h"
kono
parents:
diff changeset
31 #include "alias.h"
kono
parents:
diff changeset
32 #include "stor-layout.h"
kono
parents:
diff changeset
33 #include "gomp-constants.h"
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 /* Output the STRING constant to the string
kono
parents:
diff changeset
37 table in OB. Then put the index onto the INDEX_STREAM. */
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 void
kono
parents:
diff changeset
40 streamer_write_string_cst (struct output_block *ob,
kono
parents:
diff changeset
41 struct lto_output_stream *index_stream,
kono
parents:
diff changeset
42 tree string)
kono
parents:
diff changeset
43 {
kono
parents:
diff changeset
44 streamer_write_string_with_length (ob, index_stream,
kono
parents:
diff changeset
45 string ? TREE_STRING_POINTER (string)
kono
parents:
diff changeset
46 : NULL,
kono
parents:
diff changeset
47 string ? TREE_STRING_LENGTH (string) : 0,
kono
parents:
diff changeset
48 true);
kono
parents:
diff changeset
49 }
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 /* Output the identifier ID to the string
kono
parents:
diff changeset
53 table in OB. Then put the index onto the INDEX_STREAM. */
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 static void
kono
parents:
diff changeset
56 write_identifier (struct output_block *ob,
kono
parents:
diff changeset
57 struct lto_output_stream *index_stream,
kono
parents:
diff changeset
58 tree id)
kono
parents:
diff changeset
59 {
kono
parents:
diff changeset
60 streamer_write_string_with_length (ob, index_stream,
kono
parents:
diff changeset
61 IDENTIFIER_POINTER (id),
kono
parents:
diff changeset
62 IDENTIFIER_LENGTH (id),
kono
parents:
diff changeset
63 true);
kono
parents:
diff changeset
64 }
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 /* Pack all the non-pointer fields of the TS_BASE structure of
kono
parents:
diff changeset
68 expression EXPR into bitpack BP. */
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 static inline void
kono
parents:
diff changeset
71 pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
72 {
kono
parents:
diff changeset
73 bp_pack_value (bp, TREE_CODE (expr), 16);
kono
parents:
diff changeset
74 if (!TYPE_P (expr))
kono
parents:
diff changeset
75 {
kono
parents:
diff changeset
76 bp_pack_value (bp, TREE_SIDE_EFFECTS (expr), 1);
kono
parents:
diff changeset
77 bp_pack_value (bp, TREE_CONSTANT (expr), 1);
kono
parents:
diff changeset
78 bp_pack_value (bp, TREE_READONLY (expr), 1);
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 /* TREE_PUBLIC is used on types to indicate that the type
kono
parents:
diff changeset
81 has a TYPE_CACHED_VALUES vector. This is not streamed out,
kono
parents:
diff changeset
82 so we skip it here. */
kono
parents:
diff changeset
83 bp_pack_value (bp, TREE_PUBLIC (expr), 1);
kono
parents:
diff changeset
84 }
kono
parents:
diff changeset
85 else
kono
parents:
diff changeset
86 bp_pack_value (bp, 0, 4);
kono
parents:
diff changeset
87 bp_pack_value (bp, TREE_ADDRESSABLE (expr), 1);
kono
parents:
diff changeset
88 bp_pack_value (bp, TREE_THIS_VOLATILE (expr), 1);
kono
parents:
diff changeset
89 if (DECL_P (expr))
kono
parents:
diff changeset
90 {
kono
parents:
diff changeset
91 bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
kono
parents:
diff changeset
92 bp_pack_value (bp, DECL_NAMELESS (expr), 1);
kono
parents:
diff changeset
93 }
kono
parents:
diff changeset
94 else if (TYPE_P (expr))
kono
parents:
diff changeset
95 bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
kono
parents:
diff changeset
96 else
kono
parents:
diff changeset
97 bp_pack_value (bp, 0, 1);
kono
parents:
diff changeset
98 /* We write debug info two times, do not confuse the second one.
kono
parents:
diff changeset
99 The only relevant TREE_ASM_WRITTEN use is on SSA names. */
kono
parents:
diff changeset
100 bp_pack_value (bp, (TREE_CODE (expr) != SSA_NAME
kono
parents:
diff changeset
101 ? 0 : TREE_ASM_WRITTEN (expr)), 1);
kono
parents:
diff changeset
102 if (TYPE_P (expr))
kono
parents:
diff changeset
103 bp_pack_value (bp, TYPE_ARTIFICIAL (expr), 1);
kono
parents:
diff changeset
104 else
kono
parents:
diff changeset
105 bp_pack_value (bp, TREE_NO_WARNING (expr), 1);
kono
parents:
diff changeset
106 bp_pack_value (bp, TREE_NOTHROW (expr), 1);
kono
parents:
diff changeset
107 bp_pack_value (bp, TREE_STATIC (expr), 1);
kono
parents:
diff changeset
108 if (TREE_CODE (expr) != TREE_BINFO)
kono
parents:
diff changeset
109 bp_pack_value (bp, TREE_PRIVATE (expr), 1);
kono
parents:
diff changeset
110 else
kono
parents:
diff changeset
111 bp_pack_value (bp, 0, 1);
kono
parents:
diff changeset
112 bp_pack_value (bp, TREE_PROTECTED (expr), 1);
kono
parents:
diff changeset
113 bp_pack_value (bp, TREE_DEPRECATED (expr), 1);
kono
parents:
diff changeset
114 if (TYPE_P (expr))
kono
parents:
diff changeset
115 {
kono
parents:
diff changeset
116 if (AGGREGATE_TYPE_P (expr))
kono
parents:
diff changeset
117 bp_pack_value (bp, TYPE_REVERSE_STORAGE_ORDER (expr), 1);
kono
parents:
diff changeset
118 else
kono
parents:
diff changeset
119 bp_pack_value (bp, TYPE_SATURATING (expr), 1);
kono
parents:
diff changeset
120 bp_pack_value (bp, TYPE_ADDR_SPACE (expr), 8);
kono
parents:
diff changeset
121 }
kono
parents:
diff changeset
122 else if (TREE_CODE (expr) == BIT_FIELD_REF || TREE_CODE (expr) == MEM_REF)
kono
parents:
diff changeset
123 {
kono
parents:
diff changeset
124 bp_pack_value (bp, REF_REVERSE_STORAGE_ORDER (expr), 1);
kono
parents:
diff changeset
125 bp_pack_value (bp, 0, 8);
kono
parents:
diff changeset
126 }
kono
parents:
diff changeset
127 else if (TREE_CODE (expr) == SSA_NAME)
kono
parents:
diff changeset
128 {
kono
parents:
diff changeset
129 bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
kono
parents:
diff changeset
130 bp_pack_value (bp, 0, 8);
kono
parents:
diff changeset
131 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
132 else if (TREE_CODE (expr) == CALL_EXPR)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
133 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
134 bp_pack_value (bp, CALL_EXPR_BY_DESCRIPTOR (expr), 1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
135 bp_pack_value (bp, 0, 8);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
136 }
111
kono
parents:
diff changeset
137 else
kono
parents:
diff changeset
138 bp_pack_value (bp, 0, 9);
kono
parents:
diff changeset
139 }
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 /* Pack all the non-pointer fields of the TS_INTEGER_CST structure of
kono
parents:
diff changeset
143 expression EXPR into bitpack BP. */
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 static void
kono
parents:
diff changeset
146 pack_ts_int_cst_value_fields (struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
147 {
kono
parents:
diff changeset
148 int i;
kono
parents:
diff changeset
149 /* Note that the number of elements has already been written out in
kono
parents:
diff changeset
150 streamer_write_tree_header. */
kono
parents:
diff changeset
151 for (i = 0; i < TREE_INT_CST_EXT_NUNITS (expr); i++)
kono
parents:
diff changeset
152 bp_pack_var_len_int (bp, TREE_INT_CST_ELT (expr, i));
kono
parents:
diff changeset
153 }
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 /* Pack all the non-pointer fields of the TS_REAL_CST structure of
kono
parents:
diff changeset
157 expression EXPR into bitpack BP. */
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 static void
kono
parents:
diff changeset
160 pack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
161 {
kono
parents:
diff changeset
162 unsigned i;
kono
parents:
diff changeset
163 REAL_VALUE_TYPE r;
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 r = TREE_REAL_CST (expr);
kono
parents:
diff changeset
166 bp_pack_value (bp, r.cl, 2);
kono
parents:
diff changeset
167 bp_pack_value (bp, r.decimal, 1);
kono
parents:
diff changeset
168 bp_pack_value (bp, r.sign, 1);
kono
parents:
diff changeset
169 bp_pack_value (bp, r.signalling, 1);
kono
parents:
diff changeset
170 bp_pack_value (bp, r.canonical, 1);
kono
parents:
diff changeset
171 bp_pack_value (bp, r.uexp, EXP_BITS);
kono
parents:
diff changeset
172 for (i = 0; i < SIGSZ; i++)
kono
parents:
diff changeset
173 bp_pack_value (bp, r.sig[i], HOST_BITS_PER_LONG);
kono
parents:
diff changeset
174 }
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 /* Pack all the non-pointer fields of the TS_FIXED_CST structure of
kono
parents:
diff changeset
178 expression EXPR into bitpack BP. */
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 static void
kono
parents:
diff changeset
181 pack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
182 {
kono
parents:
diff changeset
183 struct fixed_value fv = TREE_FIXED_CST (expr);
kono
parents:
diff changeset
184 bp_pack_machine_mode (bp, fv.mode);
kono
parents:
diff changeset
185 bp_pack_var_len_int (bp, fv.data.low);
kono
parents:
diff changeset
186 bp_pack_var_len_int (bp, fv.data.high);
kono
parents:
diff changeset
187 }
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 /* Pack all the non-pointer fields of the TS_DECL_COMMON structure
kono
parents:
diff changeset
190 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 static void
kono
parents:
diff changeset
193 pack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
194 {
kono
parents:
diff changeset
195 bp_pack_machine_mode (bp, DECL_MODE (expr));
kono
parents:
diff changeset
196 bp_pack_value (bp, DECL_NONLOCAL (expr), 1);
kono
parents:
diff changeset
197 bp_pack_value (bp, DECL_VIRTUAL_P (expr), 1);
kono
parents:
diff changeset
198 bp_pack_value (bp, DECL_IGNORED_P (expr), 1);
kono
parents:
diff changeset
199 bp_pack_value (bp, DECL_ABSTRACT_P (expr), 1);
kono
parents:
diff changeset
200 bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1);
kono
parents:
diff changeset
201 bp_pack_value (bp, DECL_USER_ALIGN (expr), 1);
kono
parents:
diff changeset
202 bp_pack_value (bp, DECL_PRESERVE_P (expr), 1);
kono
parents:
diff changeset
203 bp_pack_value (bp, DECL_EXTERNAL (expr), 1);
kono
parents:
diff changeset
204 bp_pack_value (bp, DECL_GIMPLE_REG_P (expr), 1);
kono
parents:
diff changeset
205 bp_pack_var_len_unsigned (bp, DECL_ALIGN (expr));
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 if (TREE_CODE (expr) == LABEL_DECL)
kono
parents:
diff changeset
208 {
kono
parents:
diff changeset
209 /* Note that we do not write LABEL_DECL_UID. The reader will
kono
parents:
diff changeset
210 always assume an initial value of -1 so that the
kono
parents:
diff changeset
211 label_to_block_map is recreated by gimple_set_bb. */
kono
parents:
diff changeset
212 bp_pack_var_len_unsigned (bp, EH_LANDING_PAD_NR (expr));
kono
parents:
diff changeset
213 }
kono
parents:
diff changeset
214
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
215 else if (TREE_CODE (expr) == FIELD_DECL)
111
kono
parents:
diff changeset
216 {
kono
parents:
diff changeset
217 bp_pack_value (bp, DECL_PACKED (expr), 1);
kono
parents:
diff changeset
218 bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
219 bp_pack_value (bp, DECL_PADDING_P (expr), 1);
111
kono
parents:
diff changeset
220 bp_pack_value (bp, expr->decl_common.off_align, 8);
kono
parents:
diff changeset
221 }
kono
parents:
diff changeset
222
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
223 else if (VAR_P (expr))
111
kono
parents:
diff changeset
224 {
kono
parents:
diff changeset
225 bp_pack_value (bp, DECL_HAS_DEBUG_EXPR_P (expr), 1);
kono
parents:
diff changeset
226 bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1);
kono
parents:
diff changeset
227 }
kono
parents:
diff changeset
228
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
229 else if (TREE_CODE (expr) == PARM_DECL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
230 bp_pack_value (bp, DECL_HIDDEN_STRING_LENGTH (expr), 1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
231
111
kono
parents:
diff changeset
232 if (TREE_CODE (expr) == RESULT_DECL
kono
parents:
diff changeset
233 || TREE_CODE (expr) == PARM_DECL
kono
parents:
diff changeset
234 || VAR_P (expr))
kono
parents:
diff changeset
235 {
kono
parents:
diff changeset
236 bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
kono
parents:
diff changeset
237 if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
kono
parents:
diff changeset
238 bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
kono
parents:
diff changeset
239 }
kono
parents:
diff changeset
240 }
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 /* Pack all the non-pointer fields of the TS_DECL_WRTL structure
kono
parents:
diff changeset
244 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 static void
kono
parents:
diff changeset
247 pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
248 {
kono
parents:
diff changeset
249 bp_pack_value (bp, DECL_REGISTER (expr), 1);
kono
parents:
diff changeset
250 }
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
kono
parents:
diff changeset
254 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
255
kono
parents:
diff changeset
256 static void
kono
parents:
diff changeset
257 pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
258 {
kono
parents:
diff changeset
259 bp_pack_value (bp, DECL_COMMON (expr), 1);
kono
parents:
diff changeset
260 bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
kono
parents:
diff changeset
261 bp_pack_value (bp, DECL_WEAK (expr), 1);
kono
parents:
diff changeset
262 bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr), 1);
kono
parents:
diff changeset
263 bp_pack_value (bp, DECL_COMDAT (expr), 1);
kono
parents:
diff changeset
264 bp_pack_value (bp, DECL_VISIBILITY (expr), 2);
kono
parents:
diff changeset
265 bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr), 1);
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 if (VAR_P (expr))
kono
parents:
diff changeset
268 {
kono
parents:
diff changeset
269 bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
kono
parents:
diff changeset
270 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
kono
parents:
diff changeset
271 bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
kono
parents:
diff changeset
272 }
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 if (TREE_CODE (expr) == FUNCTION_DECL)
kono
parents:
diff changeset
275 {
kono
parents:
diff changeset
276 bp_pack_value (bp, DECL_FINAL_P (expr), 1);
kono
parents:
diff changeset
277 bp_pack_value (bp, DECL_CXX_CONSTRUCTOR_P (expr), 1);
kono
parents:
diff changeset
278 bp_pack_value (bp, DECL_CXX_DESTRUCTOR_P (expr), 1);
kono
parents:
diff changeset
279 }
kono
parents:
diff changeset
280 }
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
kono
parents:
diff changeset
284 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 static void
kono
parents:
diff changeset
287 pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
288 {
kono
parents:
diff changeset
289 bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
kono
parents:
diff changeset
290 DECL_BUILT_IN_CLASS (expr));
kono
parents:
diff changeset
291 bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
kono
parents:
diff changeset
292 bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
kono
parents:
diff changeset
293 bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
kono
parents:
diff changeset
294 bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
kono
parents:
diff changeset
295 bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
kono
parents:
diff changeset
296 bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
kono
parents:
diff changeset
297 bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
298 bp_pack_value (bp, DECL_IS_OPERATOR_NEW_P (expr), 1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
299 bp_pack_value (bp, DECL_IS_OPERATOR_DELETE_P (expr), 1);
111
kono
parents:
diff changeset
300 bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
kono
parents:
diff changeset
301 bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
kono
parents:
diff changeset
302 bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
kono
parents:
diff changeset
303 bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
kono
parents:
diff changeset
304 bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
kono
parents:
diff changeset
305 bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
kono
parents:
diff changeset
306 bp_pack_value (bp, DECL_PURE_P (expr), 1);
kono
parents:
diff changeset
307 bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
kono
parents:
diff changeset
308 if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
309 bp_pack_value (bp, DECL_UNCHECKED_FUNCTION_CODE (expr), 32);
111
kono
parents:
diff changeset
310 }
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 /* Pack all the non-pointer fields of the TS_TYPE_COMMON structure
kono
parents:
diff changeset
314 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
315
kono
parents:
diff changeset
316 static void
kono
parents:
diff changeset
317 pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
318 {
kono
parents:
diff changeset
319 /* for VECTOR_TYPE, TYPE_MODE reevaluates the mode using target_flags
kono
parents:
diff changeset
320 not necessary valid in a global context.
kono
parents:
diff changeset
321 Use the raw value previously set by layout_type. */
kono
parents:
diff changeset
322 bp_pack_machine_mode (bp, TYPE_MODE_RAW (expr));
kono
parents:
diff changeset
323 /* TYPE_NO_FORCE_BLK is private to stor-layout and need
kono
parents:
diff changeset
324 no streaming. */
kono
parents:
diff changeset
325 bp_pack_value (bp, TYPE_PACKED (expr), 1);
kono
parents:
diff changeset
326 bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
kono
parents:
diff changeset
327 bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
kono
parents:
diff changeset
328 bp_pack_value (bp, TYPE_READONLY (expr), 1);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
329 unsigned vla_p;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
330 if (in_lto_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
331 vla_p = TYPE_LANG_FLAG_0 (TYPE_MAIN_VARIANT (expr));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
332 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
333 vla_p = variably_modified_type_p (expr, NULL_TREE);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
334 bp_pack_value (bp, vla_p, 1);
111
kono
parents:
diff changeset
335 /* We used to stream TYPE_ALIAS_SET == 0 information to let frontends mark
kono
parents:
diff changeset
336 types that are opaque for TBAA. This however did not work as intended,
kono
parents:
diff changeset
337 because TYPE_ALIAS_SET == 0 was regularly lost in type merging. */
kono
parents:
diff changeset
338 if (RECORD_OR_UNION_TYPE_P (expr))
kono
parents:
diff changeset
339 {
kono
parents:
diff changeset
340 bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
kono
parents:
diff changeset
341 bp_pack_value (bp, TYPE_FINAL_P (expr), 1);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
342 bp_pack_value (bp, TYPE_CXX_ODR_P (expr), 1);
111
kono
parents:
diff changeset
343 }
kono
parents:
diff changeset
344 else if (TREE_CODE (expr) == ARRAY_TYPE)
kono
parents:
diff changeset
345 bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
346 if (TREE_CODE (expr) == ARRAY_TYPE || TREE_CODE (expr) == INTEGER_TYPE)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
347 bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
111
kono
parents:
diff changeset
348 if (AGGREGATE_TYPE_P (expr))
kono
parents:
diff changeset
349 bp_pack_value (bp, TYPE_TYPELESS_STORAGE (expr), 1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
350 bp_pack_value (bp, TYPE_EMPTY_P (expr), 1);
111
kono
parents:
diff changeset
351 bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
kono
parents:
diff changeset
352 bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
kono
parents:
diff changeset
353 }
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 /* Pack all the non-pointer fields of the TS_BLOCK structure
kono
parents:
diff changeset
357 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 static void
kono
parents:
diff changeset
360 pack_ts_block_value_fields (struct output_block *ob,
kono
parents:
diff changeset
361 struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
362 {
kono
parents:
diff changeset
363 /* BLOCK_NUMBER is recomputed. */
kono
parents:
diff changeset
364 /* Stream BLOCK_SOURCE_LOCATION for the limited cases we can handle - those
kono
parents:
diff changeset
365 that represent inlined function scopes.
kono
parents:
diff changeset
366 For the rest them on the floor instead of ICEing in dwarf2out.c. */
kono
parents:
diff changeset
367 if (inlined_function_outer_scope_p (expr))
kono
parents:
diff changeset
368 stream_output_location (ob, bp, BLOCK_SOURCE_LOCATION (expr));
kono
parents:
diff changeset
369 else
kono
parents:
diff changeset
370 stream_output_location (ob, bp, UNKNOWN_LOCATION);
kono
parents:
diff changeset
371 }
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 /* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
kono
parents:
diff changeset
374 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 static void
kono
parents:
diff changeset
377 pack_ts_translation_unit_decl_value_fields (struct output_block *ob,
kono
parents:
diff changeset
378 struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
379 {
kono
parents:
diff changeset
380 bp_pack_string (ob, bp, TRANSLATION_UNIT_LANGUAGE (expr), true);
kono
parents:
diff changeset
381 }
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 /* Pack all the non-pointer fields of the TS_OMP_CLAUSE structure
kono
parents:
diff changeset
385 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 static void
kono
parents:
diff changeset
388 pack_ts_omp_clause_value_fields (struct output_block *ob,
kono
parents:
diff changeset
389 struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
390 {
kono
parents:
diff changeset
391 stream_output_location (ob, bp, OMP_CLAUSE_LOCATION (expr));
kono
parents:
diff changeset
392 switch (OMP_CLAUSE_CODE (expr))
kono
parents:
diff changeset
393 {
kono
parents:
diff changeset
394 case OMP_CLAUSE_DEFAULT:
kono
parents:
diff changeset
395 bp_pack_enum (bp, omp_clause_default_kind, OMP_CLAUSE_DEFAULT_LAST,
kono
parents:
diff changeset
396 OMP_CLAUSE_DEFAULT_KIND (expr));
kono
parents:
diff changeset
397 break;
kono
parents:
diff changeset
398 case OMP_CLAUSE_SCHEDULE:
kono
parents:
diff changeset
399 bp_pack_enum (bp, omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_LAST,
kono
parents:
diff changeset
400 OMP_CLAUSE_SCHEDULE_KIND (expr));
kono
parents:
diff changeset
401 break;
kono
parents:
diff changeset
402 case OMP_CLAUSE_DEPEND:
kono
parents:
diff changeset
403 bp_pack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST,
kono
parents:
diff changeset
404 OMP_CLAUSE_DEPEND_KIND (expr));
kono
parents:
diff changeset
405 break;
kono
parents:
diff changeset
406 case OMP_CLAUSE_MAP:
kono
parents:
diff changeset
407 bp_pack_enum (bp, gomp_map_kind, GOMP_MAP_LAST,
kono
parents:
diff changeset
408 OMP_CLAUSE_MAP_KIND (expr));
kono
parents:
diff changeset
409 break;
kono
parents:
diff changeset
410 case OMP_CLAUSE_PROC_BIND:
kono
parents:
diff changeset
411 bp_pack_enum (bp, omp_clause_proc_bind_kind, OMP_CLAUSE_PROC_BIND_LAST,
kono
parents:
diff changeset
412 OMP_CLAUSE_PROC_BIND_KIND (expr));
kono
parents:
diff changeset
413 break;
kono
parents:
diff changeset
414 case OMP_CLAUSE_REDUCTION:
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
415 case OMP_CLAUSE_TASK_REDUCTION:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
416 case OMP_CLAUSE_IN_REDUCTION:
111
kono
parents:
diff changeset
417 bp_pack_enum (bp, tree_code, MAX_TREE_CODES,
kono
parents:
diff changeset
418 OMP_CLAUSE_REDUCTION_CODE (expr));
kono
parents:
diff changeset
419 break;
kono
parents:
diff changeset
420 default:
kono
parents:
diff changeset
421 break;
kono
parents:
diff changeset
422 }
kono
parents:
diff changeset
423 }
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425
kono
parents:
diff changeset
426 /* Pack all the bitfields in EXPR into a bit pack. */
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 void
kono
parents:
diff changeset
429 streamer_write_tree_bitfields (struct output_block *ob, tree expr)
kono
parents:
diff changeset
430 {
kono
parents:
diff changeset
431 bitpack_d bp = bitpack_create (ob->main_stream);
kono
parents:
diff changeset
432 enum tree_code code;
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 code = TREE_CODE (expr);
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 /* Note that all these functions are highly sensitive to changes in
kono
parents:
diff changeset
437 the types and sizes of each of the fields being packed. */
kono
parents:
diff changeset
438 pack_ts_base_value_fields (&bp, expr);
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
kono
parents:
diff changeset
441 pack_ts_int_cst_value_fields (&bp, expr);
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
kono
parents:
diff changeset
444 pack_ts_real_cst_value_fields (&bp, expr);
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
kono
parents:
diff changeset
447 pack_ts_fixed_cst_value_fields (&bp, expr);
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
kono
parents:
diff changeset
450 stream_output_location (ob, &bp, DECL_SOURCE_LOCATION (expr));
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
kono
parents:
diff changeset
453 pack_ts_decl_common_value_fields (&bp, expr);
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
kono
parents:
diff changeset
456 pack_ts_decl_wrtl_value_fields (&bp, expr);
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
kono
parents:
diff changeset
459 pack_ts_decl_with_vis_value_fields (&bp, expr);
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
kono
parents:
diff changeset
462 pack_ts_function_decl_value_fields (&bp, expr);
kono
parents:
diff changeset
463
kono
parents:
diff changeset
464 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
kono
parents:
diff changeset
465 pack_ts_type_common_value_fields (&bp, expr);
kono
parents:
diff changeset
466
kono
parents:
diff changeset
467 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
kono
parents:
diff changeset
468 {
kono
parents:
diff changeset
469 stream_output_location (ob, &bp, EXPR_LOCATION (expr));
kono
parents:
diff changeset
470 if (code == MEM_REF
kono
parents:
diff changeset
471 || code == TARGET_MEM_REF)
kono
parents:
diff changeset
472 {
kono
parents:
diff changeset
473 bp_pack_value (&bp, MR_DEPENDENCE_CLIQUE (expr), sizeof (short) * 8);
kono
parents:
diff changeset
474 if (MR_DEPENDENCE_CLIQUE (expr) != 0)
kono
parents:
diff changeset
475 bp_pack_value (&bp, MR_DEPENDENCE_BASE (expr), sizeof (short) * 8);
kono
parents:
diff changeset
476 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
477 else if (code == CALL_EXPR)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
478 bp_pack_enum (&bp, internal_fn, IFN_LAST, CALL_EXPR_IFN (expr));
111
kono
parents:
diff changeset
479 }
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
kono
parents:
diff changeset
482 pack_ts_block_value_fields (ob, &bp, expr);
kono
parents:
diff changeset
483
kono
parents:
diff changeset
484 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
kono
parents:
diff changeset
485 pack_ts_translation_unit_decl_value_fields (ob, &bp, expr);
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
488 cl_optimization_stream_out (ob, &bp, TREE_OPTIMIZATION (expr));
111
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
kono
parents:
diff changeset
491 bp_pack_var_len_unsigned (&bp, CONSTRUCTOR_NELTS (expr));
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
kono
parents:
diff changeset
494 /* Don't stream these when passing things to a different target. */
kono
parents:
diff changeset
495 && !lto_stream_offload_p)
kono
parents:
diff changeset
496 cl_target_option_stream_out (ob, &bp, TREE_TARGET_OPTION (expr));
kono
parents:
diff changeset
497
kono
parents:
diff changeset
498 if (code == OMP_CLAUSE)
kono
parents:
diff changeset
499 pack_ts_omp_clause_value_fields (ob, &bp, expr);
kono
parents:
diff changeset
500
kono
parents:
diff changeset
501 streamer_write_bitpack (&bp);
kono
parents:
diff changeset
502 }
kono
parents:
diff changeset
503
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 /* Emit the chain of tree nodes starting at T. OB is the output block
kono
parents:
diff changeset
506 to write to. REF_P is true if chain elements should be emitted
kono
parents:
diff changeset
507 as references. */
kono
parents:
diff changeset
508
kono
parents:
diff changeset
509 void
kono
parents:
diff changeset
510 streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
kono
parents:
diff changeset
511 {
kono
parents:
diff changeset
512 while (t)
kono
parents:
diff changeset
513 {
kono
parents:
diff changeset
514 /* We avoid outputting external vars or functions by reference
kono
parents:
diff changeset
515 to the global decls section as we do not want to have them
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
516 enter decl merging. We should not need to do this anymore because
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
517 free_lang_data removes them from block scopes. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
518 gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
519 stream_write_tree (ob, t, ref_p);
111
kono
parents:
diff changeset
520
kono
parents:
diff changeset
521 t = TREE_CHAIN (t);
kono
parents:
diff changeset
522 }
kono
parents:
diff changeset
523
kono
parents:
diff changeset
524 /* Write a sentinel to terminate the chain. */
kono
parents:
diff changeset
525 stream_write_tree (ob, NULL_TREE, ref_p);
kono
parents:
diff changeset
526 }
kono
parents:
diff changeset
527
kono
parents:
diff changeset
528
kono
parents:
diff changeset
529 /* Write all pointer fields in the TS_COMMON structure of EXPR to output
kono
parents:
diff changeset
530 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
531 fields. */
kono
parents:
diff changeset
532
kono
parents:
diff changeset
533 static void
kono
parents:
diff changeset
534 write_ts_common_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
535 {
kono
parents:
diff changeset
536 if (TREE_CODE (expr) != IDENTIFIER_NODE)
kono
parents:
diff changeset
537 stream_write_tree (ob, TREE_TYPE (expr), ref_p);
kono
parents:
diff changeset
538 }
kono
parents:
diff changeset
539
kono
parents:
diff changeset
540
kono
parents:
diff changeset
541 /* Write all pointer fields in the TS_VECTOR structure of EXPR to output
kono
parents:
diff changeset
542 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
543 fields. */
kono
parents:
diff changeset
544
kono
parents:
diff changeset
545 static void
kono
parents:
diff changeset
546 write_ts_vector_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
547 {
kono
parents:
diff changeset
548 /* Note that the number of elements for EXPR has already been emitted
kono
parents:
diff changeset
549 in EXPR's header (see streamer_write_tree_header). */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
550 unsigned int count = vector_cst_encoded_nelts (expr);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
551 for (unsigned int i = 0; i < count; ++i)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
552 stream_write_tree (ob, VECTOR_CST_ENCODED_ELT (expr, i), ref_p);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
553 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
554
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
555
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
556 /* Write all pointer fields in the TS_POLY_INT_CST structure of EXPR to
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
557 output block OB. If REF_P is true, write a reference to EXPR's pointer
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
558 fields. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
559
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
560 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
561 write_ts_poly_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
562 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
563 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
564 stream_write_tree (ob, POLY_INT_CST_COEFF (expr, i), ref_p);
111
kono
parents:
diff changeset
565 }
kono
parents:
diff changeset
566
kono
parents:
diff changeset
567
kono
parents:
diff changeset
568 /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
kono
parents:
diff changeset
569 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
570 fields. */
kono
parents:
diff changeset
571
kono
parents:
diff changeset
572 static void
kono
parents:
diff changeset
573 write_ts_complex_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
574 {
kono
parents:
diff changeset
575 stream_write_tree (ob, TREE_REALPART (expr), ref_p);
kono
parents:
diff changeset
576 stream_write_tree (ob, TREE_IMAGPART (expr), ref_p);
kono
parents:
diff changeset
577 }
kono
parents:
diff changeset
578
kono
parents:
diff changeset
579
kono
parents:
diff changeset
580 /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
kono
parents:
diff changeset
581 to output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
582 pointer fields. */
kono
parents:
diff changeset
583
kono
parents:
diff changeset
584 static void
kono
parents:
diff changeset
585 write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
586 bool ref_p)
kono
parents:
diff changeset
587 {
kono
parents:
diff changeset
588 /* Drop names that were created for anonymous entities. */
kono
parents:
diff changeset
589 if (DECL_NAME (expr)
kono
parents:
diff changeset
590 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
591 && IDENTIFIER_ANON_P (DECL_NAME (expr)))
111
kono
parents:
diff changeset
592 stream_write_tree (ob, NULL_TREE, ref_p);
kono
parents:
diff changeset
593 else
kono
parents:
diff changeset
594 stream_write_tree (ob, DECL_NAME (expr), ref_p);
kono
parents:
diff changeset
595 if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
kono
parents:
diff changeset
596 && ! DECL_CONTEXT (expr))
kono
parents:
diff changeset
597 stream_write_tree (ob, (*all_translation_units)[0], ref_p);
kono
parents:
diff changeset
598 else
kono
parents:
diff changeset
599 stream_write_tree (ob, DECL_CONTEXT (expr), ref_p);
kono
parents:
diff changeset
600 }
kono
parents:
diff changeset
601
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
kono
parents:
diff changeset
604 output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
605 pointer fields. */
kono
parents:
diff changeset
606
kono
parents:
diff changeset
607 static void
kono
parents:
diff changeset
608 write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
609 bool ref_p)
kono
parents:
diff changeset
610 {
kono
parents:
diff changeset
611 stream_write_tree (ob, DECL_SIZE (expr), ref_p);
kono
parents:
diff changeset
612 stream_write_tree (ob, DECL_SIZE_UNIT (expr), ref_p);
kono
parents:
diff changeset
613
kono
parents:
diff changeset
614 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
kono
parents:
diff changeset
615 special handling in LTO, it must be handled by streamer hooks. */
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 stream_write_tree (ob, DECL_ATTRIBUTES (expr), ref_p);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
618
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
619 /* On non-early-LTO enabled targets we claim we compiled with -g0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
620 but dwarf2out still did its set_decl_origin_self game fooling
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
621 itself late. Und that here since we won't have access to the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
622 early generated abstract DIEs. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
623 tree ao = DECL_ABSTRACT_ORIGIN (expr);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
624 if (debug_info_level == DINFO_LEVEL_NONE
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
625 && ao == expr)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
626 ao = NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
627 stream_write_tree (ob, ao, ref_p);
111
kono
parents:
diff changeset
628
kono
parents:
diff changeset
629 if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
kono
parents:
diff changeset
630 && DECL_HAS_VALUE_EXPR_P (expr))
kono
parents:
diff changeset
631 stream_write_tree (ob, DECL_VALUE_EXPR (expr), ref_p);
kono
parents:
diff changeset
632
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
633 if (VAR_P (expr)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
634 && DECL_HAS_DEBUG_EXPR_P (expr))
111
kono
parents:
diff changeset
635 stream_write_tree (ob, DECL_DEBUG_EXPR (expr), ref_p);
kono
parents:
diff changeset
636 }
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638
kono
parents:
diff changeset
639 /* Write all pointer fields in the TS_DECL_NON_COMMON structure of
kono
parents:
diff changeset
640 EXPR to output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
641 pointer fields. */
kono
parents:
diff changeset
642
kono
parents:
diff changeset
643 static void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
644 write_ts_decl_non_common_tree_pointers (struct output_block *, tree, bool)
111
kono
parents:
diff changeset
645 {
kono
parents:
diff changeset
646 }
kono
parents:
diff changeset
647
kono
parents:
diff changeset
648
kono
parents:
diff changeset
649 /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
kono
parents:
diff changeset
650 to output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
651 pointer fields. */
kono
parents:
diff changeset
652
kono
parents:
diff changeset
653 static void
kono
parents:
diff changeset
654 write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
655 bool ref_p)
kono
parents:
diff changeset
656 {
kono
parents:
diff changeset
657 /* Make sure we don't inadvertently set the assembler name. */
kono
parents:
diff changeset
658 if (DECL_ASSEMBLER_NAME_SET_P (expr))
kono
parents:
diff changeset
659 stream_write_tree (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
kono
parents:
diff changeset
660 else
kono
parents:
diff changeset
661 stream_write_tree (ob, NULL_TREE, false);
kono
parents:
diff changeset
662 }
kono
parents:
diff changeset
663
kono
parents:
diff changeset
664
kono
parents:
diff changeset
665 /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
kono
parents:
diff changeset
666 output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
667 pointer fields. */
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669 static void
kono
parents:
diff changeset
670 write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
671 bool ref_p)
kono
parents:
diff changeset
672 {
kono
parents:
diff changeset
673 stream_write_tree (ob, DECL_FIELD_OFFSET (expr), ref_p);
kono
parents:
diff changeset
674 stream_write_tree (ob, DECL_BIT_FIELD_TYPE (expr), ref_p);
kono
parents:
diff changeset
675 stream_write_tree (ob, DECL_BIT_FIELD_REPRESENTATIVE (expr), ref_p);
kono
parents:
diff changeset
676 stream_write_tree (ob, DECL_FIELD_BIT_OFFSET (expr), ref_p);
kono
parents:
diff changeset
677 }
kono
parents:
diff changeset
678
kono
parents:
diff changeset
679
kono
parents:
diff changeset
680 /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
kono
parents:
diff changeset
681 to output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
682 pointer fields. */
kono
parents:
diff changeset
683
kono
parents:
diff changeset
684 static void
kono
parents:
diff changeset
685 write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
686 bool ref_p)
kono
parents:
diff changeset
687 {
kono
parents:
diff changeset
688 /* DECL_STRUCT_FUNCTION is handled by lto_output_function. */
kono
parents:
diff changeset
689 stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
kono
parents:
diff changeset
690 /* Don't stream these when passing things to a different target. */
kono
parents:
diff changeset
691 if (!lto_stream_offload_p)
kono
parents:
diff changeset
692 stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
kono
parents:
diff changeset
693 stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p);
kono
parents:
diff changeset
694 }
kono
parents:
diff changeset
695
kono
parents:
diff changeset
696
kono
parents:
diff changeset
697 /* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
kono
parents:
diff changeset
698 output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
699 pointer fields. */
kono
parents:
diff changeset
700
kono
parents:
diff changeset
701 static void
kono
parents:
diff changeset
702 write_ts_type_common_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
703 bool ref_p)
kono
parents:
diff changeset
704 {
kono
parents:
diff changeset
705 stream_write_tree (ob, TYPE_SIZE (expr), ref_p);
kono
parents:
diff changeset
706 stream_write_tree (ob, TYPE_SIZE_UNIT (expr), ref_p);
kono
parents:
diff changeset
707 stream_write_tree (ob, TYPE_ATTRIBUTES (expr), ref_p);
kono
parents:
diff changeset
708 stream_write_tree (ob, TYPE_NAME (expr), ref_p);
kono
parents:
diff changeset
709 /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
kono
parents:
diff changeset
710 reconstructed during fixup. */
kono
parents:
diff changeset
711 /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
kono
parents:
diff changeset
712 during fixup. */
kono
parents:
diff changeset
713 stream_write_tree (ob, TYPE_MAIN_VARIANT (expr), ref_p);
kono
parents:
diff changeset
714 stream_write_tree (ob, TYPE_CONTEXT (expr), ref_p);
kono
parents:
diff changeset
715 /* TYPE_CANONICAL is re-computed during type merging, so no need
kono
parents:
diff changeset
716 to stream it here. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
717 /* Do not stream TYPE_STUB_DECL; it is not needed by LTO but currently
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
718 it cannot be freed by free_lang_data without triggering ICEs in
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
719 langhooks. */
111
kono
parents:
diff changeset
720 }
kono
parents:
diff changeset
721
kono
parents:
diff changeset
722 /* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
kono
parents:
diff changeset
723 to output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
724 pointer fields. */
kono
parents:
diff changeset
725
kono
parents:
diff changeset
726 static void
kono
parents:
diff changeset
727 write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
728 bool ref_p)
kono
parents:
diff changeset
729 {
kono
parents:
diff changeset
730 if (TREE_CODE (expr) == ENUMERAL_TYPE)
kono
parents:
diff changeset
731 stream_write_tree (ob, TYPE_VALUES (expr), ref_p);
kono
parents:
diff changeset
732 else if (TREE_CODE (expr) == ARRAY_TYPE)
kono
parents:
diff changeset
733 stream_write_tree (ob, TYPE_DOMAIN (expr), ref_p);
kono
parents:
diff changeset
734 else if (RECORD_OR_UNION_TYPE_P (expr))
kono
parents:
diff changeset
735 streamer_write_chain (ob, TYPE_FIELDS (expr), ref_p);
kono
parents:
diff changeset
736 else if (TREE_CODE (expr) == FUNCTION_TYPE
kono
parents:
diff changeset
737 || TREE_CODE (expr) == METHOD_TYPE)
kono
parents:
diff changeset
738 stream_write_tree (ob, TYPE_ARG_TYPES (expr), ref_p);
kono
parents:
diff changeset
739
kono
parents:
diff changeset
740 if (!POINTER_TYPE_P (expr))
kono
parents:
diff changeset
741 stream_write_tree (ob, TYPE_MIN_VALUE_RAW (expr), ref_p);
kono
parents:
diff changeset
742 stream_write_tree (ob, TYPE_MAX_VALUE_RAW (expr), ref_p);
kono
parents:
diff changeset
743 }
kono
parents:
diff changeset
744
kono
parents:
diff changeset
745
kono
parents:
diff changeset
746 /* Write all pointer fields in the TS_LIST structure of EXPR to output
kono
parents:
diff changeset
747 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
748 fields. */
kono
parents:
diff changeset
749
kono
parents:
diff changeset
750 static void
kono
parents:
diff changeset
751 write_ts_list_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
752 {
kono
parents:
diff changeset
753 stream_write_tree (ob, TREE_PURPOSE (expr), ref_p);
kono
parents:
diff changeset
754 stream_write_tree (ob, TREE_VALUE (expr), ref_p);
kono
parents:
diff changeset
755 stream_write_tree (ob, TREE_CHAIN (expr), ref_p);
kono
parents:
diff changeset
756 }
kono
parents:
diff changeset
757
kono
parents:
diff changeset
758
kono
parents:
diff changeset
759 /* Write all pointer fields in the TS_VEC structure of EXPR to output
kono
parents:
diff changeset
760 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
761 fields. */
kono
parents:
diff changeset
762
kono
parents:
diff changeset
763 static void
kono
parents:
diff changeset
764 write_ts_vec_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
765 {
kono
parents:
diff changeset
766 int i;
kono
parents:
diff changeset
767
kono
parents:
diff changeset
768 /* Note that the number of slots for EXPR has already been emitted
kono
parents:
diff changeset
769 in EXPR's header (see streamer_write_tree_header). */
kono
parents:
diff changeset
770 for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
kono
parents:
diff changeset
771 stream_write_tree (ob, TREE_VEC_ELT (expr, i), ref_p);
kono
parents:
diff changeset
772 }
kono
parents:
diff changeset
773
kono
parents:
diff changeset
774
kono
parents:
diff changeset
775 /* Write all pointer fields in the TS_EXP structure of EXPR to output
kono
parents:
diff changeset
776 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
777 fields. */
kono
parents:
diff changeset
778
kono
parents:
diff changeset
779 static void
kono
parents:
diff changeset
780 write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
781 {
kono
parents:
diff changeset
782 int i;
kono
parents:
diff changeset
783
kono
parents:
diff changeset
784 for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
kono
parents:
diff changeset
785 stream_write_tree (ob, TREE_OPERAND (expr, i), ref_p);
kono
parents:
diff changeset
786 stream_write_tree (ob, TREE_BLOCK (expr), ref_p);
kono
parents:
diff changeset
787 }
kono
parents:
diff changeset
788
kono
parents:
diff changeset
789
kono
parents:
diff changeset
790 /* Write all pointer fields in the TS_BLOCK structure of EXPR to output
kono
parents:
diff changeset
791 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
792 fields. */
kono
parents:
diff changeset
793
kono
parents:
diff changeset
794 static void
kono
parents:
diff changeset
795 write_ts_block_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
796 {
kono
parents:
diff changeset
797 streamer_write_chain (ob, BLOCK_VARS (expr), ref_p);
kono
parents:
diff changeset
798
kono
parents:
diff changeset
799 stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
800 stream_write_tree (ob, BLOCK_ABSTRACT_ORIGIN (expr), ref_p);
111
kono
parents:
diff changeset
801
kono
parents:
diff changeset
802 /* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information
kono
parents:
diff changeset
803 for early inlined BLOCKs so drop it on the floor instead of ICEing in
kono
parents:
diff changeset
804 dwarf2out.c. */
kono
parents:
diff changeset
805
kono
parents:
diff changeset
806 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
kono
parents:
diff changeset
807 streaming time. */
kono
parents:
diff changeset
808
kono
parents:
diff changeset
809 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
kono
parents:
diff changeset
810 list is re-constructed from BLOCK_SUPERCONTEXT. */
kono
parents:
diff changeset
811 }
kono
parents:
diff changeset
812
kono
parents:
diff changeset
813
kono
parents:
diff changeset
814 /* Write all pointer fields in the TS_BINFO structure of EXPR to output
kono
parents:
diff changeset
815 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
816 fields. */
kono
parents:
diff changeset
817
kono
parents:
diff changeset
818 static void
kono
parents:
diff changeset
819 write_ts_binfo_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
820 {
kono
parents:
diff changeset
821 unsigned i;
kono
parents:
diff changeset
822 tree t;
kono
parents:
diff changeset
823
kono
parents:
diff changeset
824 /* Note that the number of BINFO slots has already been emitted in
kono
parents:
diff changeset
825 EXPR's header (see streamer_write_tree_header) because this length
kono
parents:
diff changeset
826 is needed to build the empty BINFO node on the reader side. */
kono
parents:
diff changeset
827 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
kono
parents:
diff changeset
828 stream_write_tree (ob, t, ref_p);
kono
parents:
diff changeset
829 stream_write_tree (ob, NULL_TREE, false);
kono
parents:
diff changeset
830
kono
parents:
diff changeset
831 stream_write_tree (ob, BINFO_OFFSET (expr), ref_p);
kono
parents:
diff changeset
832 stream_write_tree (ob, BINFO_VTABLE (expr), ref_p);
kono
parents:
diff changeset
833
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
834 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
835 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used by C++ FE only. */
111
kono
parents:
diff changeset
836 }
kono
parents:
diff changeset
837
kono
parents:
diff changeset
838
kono
parents:
diff changeset
839 /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
kono
parents:
diff changeset
840 output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
841 pointer fields. */
kono
parents:
diff changeset
842
kono
parents:
diff changeset
843 static void
kono
parents:
diff changeset
844 write_ts_constructor_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
845 bool ref_p)
kono
parents:
diff changeset
846 {
kono
parents:
diff changeset
847 unsigned i;
kono
parents:
diff changeset
848 tree index, value;
kono
parents:
diff changeset
849
kono
parents:
diff changeset
850 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
kono
parents:
diff changeset
851 {
kono
parents:
diff changeset
852 stream_write_tree (ob, index, ref_p);
kono
parents:
diff changeset
853 stream_write_tree (ob, value, ref_p);
kono
parents:
diff changeset
854 }
kono
parents:
diff changeset
855 }
kono
parents:
diff changeset
856
kono
parents:
diff changeset
857
kono
parents:
diff changeset
858 /* Write all pointer fields in the TS_OMP_CLAUSE structure of EXPR
kono
parents:
diff changeset
859 to output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
860 pointer fields. */
kono
parents:
diff changeset
861
kono
parents:
diff changeset
862 static void
kono
parents:
diff changeset
863 write_ts_omp_clause_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
864 bool ref_p)
kono
parents:
diff changeset
865 {
kono
parents:
diff changeset
866 int i;
kono
parents:
diff changeset
867 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
kono
parents:
diff changeset
868 stream_write_tree (ob, OMP_CLAUSE_OPERAND (expr, i), ref_p);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
869 switch (OMP_CLAUSE_CODE (expr))
111
kono
parents:
diff changeset
870 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
871 case OMP_CLAUSE_REDUCTION:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
872 case OMP_CLAUSE_TASK_REDUCTION:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
873 case OMP_CLAUSE_IN_REDUCTION:
111
kono
parents:
diff changeset
874 /* We don't stream these right now, handle it if streaming
kono
parents:
diff changeset
875 of them is needed. */
kono
parents:
diff changeset
876 gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) == NULL);
kono
parents:
diff changeset
877 gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) == NULL);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
878 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
879 default:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
880 break;
111
kono
parents:
diff changeset
881 }
kono
parents:
diff changeset
882 stream_write_tree (ob, OMP_CLAUSE_CHAIN (expr), ref_p);
kono
parents:
diff changeset
883 }
kono
parents:
diff changeset
884
kono
parents:
diff changeset
885
kono
parents:
diff changeset
886 /* Write all pointer fields in EXPR to output block OB. If REF_P is true,
kono
parents:
diff changeset
887 the leaves of EXPR are emitted as references. */
kono
parents:
diff changeset
888
kono
parents:
diff changeset
889 void
kono
parents:
diff changeset
890 streamer_write_tree_body (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
891 {
kono
parents:
diff changeset
892 enum tree_code code;
kono
parents:
diff changeset
893
kono
parents:
diff changeset
894 lto_stats.num_tree_bodies_output++;
kono
parents:
diff changeset
895
kono
parents:
diff changeset
896 code = TREE_CODE (expr);
kono
parents:
diff changeset
897
kono
parents:
diff changeset
898 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
kono
parents:
diff changeset
899 write_ts_common_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
900
kono
parents:
diff changeset
901 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
kono
parents:
diff changeset
902 write_ts_vector_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
903
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
904 if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
905 write_ts_poly_tree_pointers (ob, expr, ref_p);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
906
111
kono
parents:
diff changeset
907 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
kono
parents:
diff changeset
908 write_ts_complex_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
909
kono
parents:
diff changeset
910 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
kono
parents:
diff changeset
911 write_ts_decl_minimal_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
912
kono
parents:
diff changeset
913 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
kono
parents:
diff changeset
914 write_ts_decl_common_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
915
kono
parents:
diff changeset
916 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
kono
parents:
diff changeset
917 write_ts_decl_non_common_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
918
kono
parents:
diff changeset
919 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
kono
parents:
diff changeset
920 write_ts_decl_with_vis_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
921
kono
parents:
diff changeset
922 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
kono
parents:
diff changeset
923 write_ts_field_decl_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
924
kono
parents:
diff changeset
925 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
kono
parents:
diff changeset
926 write_ts_function_decl_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
927
kono
parents:
diff changeset
928 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
kono
parents:
diff changeset
929 write_ts_type_common_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
930
kono
parents:
diff changeset
931 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
kono
parents:
diff changeset
932 write_ts_type_non_common_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
933
kono
parents:
diff changeset
934 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
kono
parents:
diff changeset
935 write_ts_list_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
936
kono
parents:
diff changeset
937 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
kono
parents:
diff changeset
938 write_ts_vec_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
939
kono
parents:
diff changeset
940 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
kono
parents:
diff changeset
941 write_ts_exp_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
942
kono
parents:
diff changeset
943 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
kono
parents:
diff changeset
944 write_ts_block_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
945
kono
parents:
diff changeset
946 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
kono
parents:
diff changeset
947 write_ts_binfo_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
948
kono
parents:
diff changeset
949 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
kono
parents:
diff changeset
950 write_ts_constructor_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
951
kono
parents:
diff changeset
952 if (code == OMP_CLAUSE)
kono
parents:
diff changeset
953 write_ts_omp_clause_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
954 }
kono
parents:
diff changeset
955
kono
parents:
diff changeset
956
kono
parents:
diff changeset
957 /* Emit header information for tree EXPR to output block OB. The header
kono
parents:
diff changeset
958 contains everything needed to instantiate an empty skeleton for
kono
parents:
diff changeset
959 EXPR on the reading side. IX is the index into the streamer cache
kono
parents:
diff changeset
960 where EXPR is stored. */
kono
parents:
diff changeset
961
kono
parents:
diff changeset
962 void
kono
parents:
diff changeset
963 streamer_write_tree_header (struct output_block *ob, tree expr)
kono
parents:
diff changeset
964 {
kono
parents:
diff changeset
965 enum LTO_tags tag;
kono
parents:
diff changeset
966 enum tree_code code;
kono
parents:
diff changeset
967
kono
parents:
diff changeset
968 /* We should not see any tree nodes not handled by the streamer. */
kono
parents:
diff changeset
969 code = TREE_CODE (expr);
kono
parents:
diff changeset
970
kono
parents:
diff changeset
971 /* The header of a tree node consists of its tag, the size of
kono
parents:
diff changeset
972 the node, and any other information needed to instantiate
kono
parents:
diff changeset
973 EXPR on the reading side (such as the number of slots in
kono
parents:
diff changeset
974 variable sized nodes). */
kono
parents:
diff changeset
975 tag = lto_tree_code_to_tag (code);
kono
parents:
diff changeset
976 streamer_write_record_start (ob, tag);
kono
parents:
diff changeset
977
kono
parents:
diff changeset
978 /* The text in strings and identifiers are completely emitted in
kono
parents:
diff changeset
979 the header. */
kono
parents:
diff changeset
980 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
kono
parents:
diff changeset
981 streamer_write_string_cst (ob, ob->main_stream, expr);
kono
parents:
diff changeset
982 else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
kono
parents:
diff changeset
983 write_identifier (ob, ob->main_stream, expr);
kono
parents:
diff changeset
984 else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
985 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
986 bitpack_d bp = bitpack_create (ob->main_stream);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
987 bp_pack_value (&bp, VECTOR_CST_LOG2_NPATTERNS (expr), 8);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
988 bp_pack_value (&bp, VECTOR_CST_NELTS_PER_PATTERN (expr), 8);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
989 streamer_write_bitpack (&bp);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
990 }
111
kono
parents:
diff changeset
991 else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
kono
parents:
diff changeset
992 streamer_write_hwi (ob, TREE_VEC_LENGTH (expr));
kono
parents:
diff changeset
993 else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
kono
parents:
diff changeset
994 streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr));
kono
parents:
diff changeset
995 else if (TREE_CODE (expr) == CALL_EXPR)
kono
parents:
diff changeset
996 streamer_write_uhwi (ob, call_expr_nargs (expr));
kono
parents:
diff changeset
997 else if (TREE_CODE (expr) == OMP_CLAUSE)
kono
parents:
diff changeset
998 streamer_write_uhwi (ob, OMP_CLAUSE_CODE (expr));
kono
parents:
diff changeset
999 else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
kono
parents:
diff changeset
1000 {
kono
parents:
diff changeset
1001 gcc_checking_assert (TREE_INT_CST_NUNITS (expr));
kono
parents:
diff changeset
1002 streamer_write_uhwi (ob, TREE_INT_CST_NUNITS (expr));
kono
parents:
diff changeset
1003 streamer_write_uhwi (ob, TREE_INT_CST_EXT_NUNITS (expr));
kono
parents:
diff changeset
1004 }
kono
parents:
diff changeset
1005 }
kono
parents:
diff changeset
1006
kono
parents:
diff changeset
1007
kono
parents:
diff changeset
1008 /* Emit the integer constant CST to output block OB. If REF_P is true,
kono
parents:
diff changeset
1009 CST's type will be emitted as a reference. */
kono
parents:
diff changeset
1010
kono
parents:
diff changeset
1011 void
kono
parents:
diff changeset
1012 streamer_write_integer_cst (struct output_block *ob, tree cst, bool ref_p)
kono
parents:
diff changeset
1013 {
kono
parents:
diff changeset
1014 int i;
kono
parents:
diff changeset
1015 int len = TREE_INT_CST_NUNITS (cst);
kono
parents:
diff changeset
1016 gcc_assert (!TREE_OVERFLOW (cst));
kono
parents:
diff changeset
1017 streamer_write_record_start (ob, LTO_integer_cst);
kono
parents:
diff changeset
1018 stream_write_tree (ob, TREE_TYPE (cst), ref_p);
kono
parents:
diff changeset
1019 /* We're effectively streaming a non-sign-extended wide_int here,
kono
parents:
diff changeset
1020 so there's no need to stream TREE_INT_CST_EXT_NUNITS or any
kono
parents:
diff changeset
1021 array members beyond LEN. We'll recreate the tree from the
kono
parents:
diff changeset
1022 wide_int and the type. */
kono
parents:
diff changeset
1023 streamer_write_uhwi (ob, len);
kono
parents:
diff changeset
1024 for (i = 0; i < len; i++)
kono
parents:
diff changeset
1025 streamer_write_hwi (ob, TREE_INT_CST_ELT (cst, i));
kono
parents:
diff changeset
1026 }