OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [tree-streamer-out.c] - Blame information for rev 749

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 684 jeremybenn
/* Routines for emitting trees to a file stream.
2
 
3
   Copyright 2011 Free Software Foundation, Inc.
4
   Contributed by Diego Novillo <dnovillo@google.com>
5
 
6
This file is part of GCC.
7
 
8
GCC is free software; you can redistribute it and/or modify it under
9
the terms of the GNU General Public License as published by the Free
10
Software Foundation; either version 3, or (at your option) any later
11
version.
12
 
13
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14
WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16
for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING3.  If not see
20
<http://www.gnu.org/licenses/>.  */
21
 
22
#include "config.h"
23
#include "system.h"
24
#include "coretypes.h"
25
#include "diagnostic.h"
26
#include "tree.h"
27
#include "tree-streamer.h"
28
#include "data-streamer.h"
29
#include "streamer-hooks.h"
30
 
31
/* Output the STRING constant to the string
32
   table in OB.  Then put the index onto the INDEX_STREAM.  */
33
 
34
void
35
streamer_write_string_cst (struct output_block *ob,
36
                           struct lto_output_stream *index_stream,
37
                           tree string)
38
{
39
  streamer_write_string_with_length (ob, index_stream,
40
                                     string ? TREE_STRING_POINTER (string)
41
                                            : NULL,
42
                                     string ? TREE_STRING_LENGTH (string) : 0,
43
                                     true);
44
}
45
 
46
 
47
/* Output the identifier ID to the string
48
   table in OB.  Then put the index onto the INDEX_STREAM.  */
49
 
50
static void
51
write_identifier (struct output_block *ob,
52
                   struct lto_output_stream *index_stream,
53
                   tree id)
54
{
55
  streamer_write_string_with_length (ob, index_stream,
56
                                     IDENTIFIER_POINTER (id),
57
                                     IDENTIFIER_LENGTH (id),
58
                                     true);
59
}
60
 
61
 
62
/* Pack all the non-pointer fields of the TS_BASE structure of
63
   expression EXPR into bitpack BP.  */
64
 
65
static void
66
pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
67
{
68
  bp_pack_value (bp, TREE_CODE (expr), 16);
69
  if (!TYPE_P (expr))
70
    {
71
      bp_pack_value (bp, TREE_SIDE_EFFECTS (expr), 1);
72
      bp_pack_value (bp, TREE_CONSTANT (expr), 1);
73
      bp_pack_value (bp, TREE_READONLY (expr), 1);
74
 
75
      /* TREE_PUBLIC is used on types to indicate that the type
76
         has a TYPE_CACHED_VALUES vector.  This is not streamed out,
77
         so we skip it here.  */
78
      bp_pack_value (bp, TREE_PUBLIC (expr), 1);
79
    }
80
  else
81
    bp_pack_value (bp, 0, 4);
82
  bp_pack_value (bp, TREE_ADDRESSABLE (expr), 1);
83
  bp_pack_value (bp, TREE_THIS_VOLATILE (expr), 1);
84
  if (DECL_P (expr))
85
    bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
86
  else if (TYPE_P (expr))
87
    bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
88
  else
89
    bp_pack_value (bp, 0, 1);
90
  /* We write debug info two times, do not confuse the second one.  */
91
  bp_pack_value (bp, ((TYPE_P (expr) || TREE_CODE (expr) == TYPE_DECL)
92
                      ? 0 : TREE_ASM_WRITTEN (expr)), 1);
93
  if (TYPE_P (expr))
94
    bp_pack_value (bp, TYPE_ARTIFICIAL (expr), 1);
95
  else
96
    bp_pack_value (bp, TREE_NO_WARNING (expr), 1);
97
  bp_pack_value (bp, TREE_USED (expr), 1);
98
  bp_pack_value (bp, TREE_NOTHROW (expr), 1);
99
  bp_pack_value (bp, TREE_STATIC (expr), 1);
100
  bp_pack_value (bp, TREE_PRIVATE (expr), 1);
101
  bp_pack_value (bp, TREE_PROTECTED (expr), 1);
102
  bp_pack_value (bp, TREE_DEPRECATED (expr), 1);
103
  if (TYPE_P (expr))
104
    {
105
      bp_pack_value (bp, TYPE_SATURATING (expr), 1);
106
      bp_pack_value (bp, TYPE_ADDR_SPACE (expr), 8);
107
    }
108
  else if (TREE_CODE (expr) == SSA_NAME)
109
    bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
110
  else
111
    bp_pack_value (bp, 0, 1);
112
}
113
 
114
 
115
/* Pack all the non-pointer fields of the TS_REAL_CST structure of
116
   expression EXPR into bitpack BP.  */
117
 
118
static void
119
pack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
120
{
121
  unsigned i;
122
  REAL_VALUE_TYPE r;
123
 
124
  r = TREE_REAL_CST (expr);
125
  bp_pack_value (bp, r.cl, 2);
126
  bp_pack_value (bp, r.decimal, 1);
127
  bp_pack_value (bp, r.sign, 1);
128
  bp_pack_value (bp, r.signalling, 1);
129
  bp_pack_value (bp, r.canonical, 1);
130
  bp_pack_value (bp, r.uexp, EXP_BITS);
131
  for (i = 0; i < SIGSZ; i++)
132
    bp_pack_value (bp, r.sig[i], HOST_BITS_PER_LONG);
133
}
134
 
135
 
136
/* Pack all the non-pointer fields of the TS_FIXED_CST structure of
137
   expression EXPR into bitpack BP.  */
138
 
139
static void
140
pack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
141
{
142
  struct fixed_value fv = TREE_FIXED_CST (expr);
143
  bp_pack_enum (bp, machine_mode, MAX_MACHINE_MODE, fv.mode);
144
  bp_pack_var_len_int (bp, fv.data.low);
145
  bp_pack_var_len_int (bp, fv.data.high);
146
}
147
 
148
 
149
/* Pack all the non-pointer fields of the TS_DECL_COMMON structure
150
   of expression EXPR into bitpack BP.  */
151
 
152
static void
153
pack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
154
{
155
  bp_pack_enum (bp, machine_mode, MAX_MACHINE_MODE, DECL_MODE (expr));
156
  bp_pack_value (bp, DECL_NONLOCAL (expr), 1);
157
  bp_pack_value (bp, DECL_VIRTUAL_P (expr), 1);
158
  bp_pack_value (bp, DECL_IGNORED_P (expr), 1);
159
  bp_pack_value (bp, DECL_ABSTRACT (expr), 1);
160
  bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1);
161
  bp_pack_value (bp, DECL_USER_ALIGN (expr), 1);
162
  bp_pack_value (bp, DECL_PRESERVE_P (expr), 1);
163
  bp_pack_value (bp, DECL_DEBUG_EXPR_IS_FROM (expr), 1);
164
  bp_pack_value (bp, DECL_EXTERNAL (expr), 1);
165
  bp_pack_value (bp, DECL_GIMPLE_REG_P (expr), 1);
166
  bp_pack_var_len_unsigned (bp, DECL_ALIGN (expr));
167
 
168
  if (TREE_CODE (expr) == LABEL_DECL)
169
    {
170
      /* Note that we do not write LABEL_DECL_UID.  The reader will
171
         always assume an initial value of -1 so that the
172
         label_to_block_map is recreated by gimple_set_bb.  */
173
      bp_pack_value (bp, DECL_ERROR_ISSUED (expr), 1);
174
      bp_pack_var_len_unsigned (bp, EH_LANDING_PAD_NR (expr));
175
    }
176
 
177
  if (TREE_CODE (expr) == FIELD_DECL)
178
    {
179
      bp_pack_value (bp, DECL_PACKED (expr), 1);
180
      bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1);
181
      bp_pack_value (bp, expr->decl_common.off_align, 8);
182
    }
183
 
184
  if (TREE_CODE (expr) == RESULT_DECL
185
      || TREE_CODE (expr) == PARM_DECL
186
      || TREE_CODE (expr) == VAR_DECL)
187
    {
188
      bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
189
      if (TREE_CODE (expr) == VAR_DECL
190
          || TREE_CODE (expr) == PARM_DECL)
191
        bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
192
      bp_pack_value (bp, DECL_RESTRICTED_P (expr), 1);
193
    }
194
}
195
 
196
 
197
/* Pack all the non-pointer fields of the TS_DECL_WRTL structure
198
   of expression EXPR into bitpack BP.  */
199
 
200
static void
201
pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
202
{
203
  bp_pack_value (bp, DECL_REGISTER (expr), 1);
204
}
205
 
206
 
207
/* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
208
   of expression EXPR into bitpack BP.  */
209
 
210
static void
211
pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
212
{
213
  bp_pack_value (bp, DECL_DEFER_OUTPUT (expr), 1);
214
  bp_pack_value (bp, DECL_COMMON (expr), 1);
215
  bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
216
  bp_pack_value (bp, DECL_WEAK (expr), 1);
217
  bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr),  1);
218
  bp_pack_value (bp, DECL_COMDAT (expr),  1);
219
  bp_pack_value (bp, DECL_VISIBILITY (expr),  2);
220
  bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr),  1);
221
 
222
  if (TREE_CODE (expr) == VAR_DECL)
223
    {
224
      bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
225
      bp_pack_value (bp, DECL_IN_TEXT_SECTION (expr), 1);
226
      bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
227
      bp_pack_value (bp, DECL_TLS_MODEL (expr),  3);
228
    }
229
 
230
  if (VAR_OR_FUNCTION_DECL_P (expr))
231
    bp_pack_var_len_unsigned (bp, DECL_INIT_PRIORITY (expr));
232
}
233
 
234
 
235
/* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
236
   of expression EXPR into bitpack BP.  */
237
 
238
static void
239
pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
240
{
241
  /* For normal/md builtins we only write the class and code, so they
242
     should never be handled here.  */
243
  gcc_assert (!streamer_handle_as_builtin_p (expr));
244
 
245
  bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
246
                DECL_BUILT_IN_CLASS (expr));
247
  bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
248
  bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
249
  bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
250
  bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
251
  bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
252
  bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
253
  bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
254
  bp_pack_value (bp, DECL_IS_OPERATOR_NEW (expr), 1);
255
  bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
256
  bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
257
  bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
258
  bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
259
  bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
260
  bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
261
  bp_pack_value (bp, DECL_PURE_P (expr), 1);
262
  bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
263
  if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
264
    bp_pack_value (bp, DECL_FUNCTION_CODE (expr), 11);
265
  if (DECL_STATIC_DESTRUCTOR (expr))
266
    bp_pack_var_len_unsigned (bp, DECL_FINI_PRIORITY (expr));
267
}
268
 
269
 
270
/* Pack all the non-pointer fields of the TS_TYPE_COMMON structure
271
   of expression EXPR into bitpack BP.  */
272
 
273
static void
274
pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
275
{
276
  bp_pack_enum (bp, machine_mode, MAX_MACHINE_MODE, TYPE_MODE (expr));
277
  bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
278
  bp_pack_value (bp, TYPE_NO_FORCE_BLK (expr), 1);
279
  bp_pack_value (bp, TYPE_NEEDS_CONSTRUCTING (expr), 1);
280
  if (RECORD_OR_UNION_TYPE_P (expr))
281
    bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
282
  bp_pack_value (bp, TYPE_PACKED (expr), 1);
283
  bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
284
  bp_pack_value (bp, TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr), 2);
285
  bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
286
  bp_pack_value (bp, TYPE_READONLY (expr), 1);
287
  bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
288
  bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
289
  bp_pack_var_len_int (bp, TYPE_ALIAS_SET (expr) == 0 ? 0 : -1);
290
}
291
 
292
 
293
/* Pack all the non-pointer fields of the TS_BLOCK structure
294
   of expression EXPR into bitpack BP.  */
295
 
296
static void
297
pack_ts_block_value_fields (struct bitpack_d *bp, tree expr)
298
{
299
  bp_pack_value (bp, BLOCK_ABSTRACT (expr), 1);
300
  /* BLOCK_NUMBER is recomputed.  */
301
}
302
 
303
/* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
304
   of expression EXPR into bitpack BP.  */
305
 
306
static void
307
pack_ts_translation_unit_decl_value_fields (struct bitpack_d *bp ATTRIBUTE_UNUSED, tree expr ATTRIBUTE_UNUSED)
308
{
309
}
310
 
311
 
312
/* Pack all the bitfields in EXPR into a bit pack.  */
313
 
314
void
315
streamer_pack_tree_bitfields (struct bitpack_d *bp, tree expr)
316
{
317
  enum tree_code code;
318
 
319
  code = TREE_CODE (expr);
320
 
321
  /* Note that all these functions are highly sensitive to changes in
322
     the types and sizes of each of the fields being packed.  */
323
  pack_ts_base_value_fields (bp, expr);
324
 
325
  if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
326
    pack_ts_real_cst_value_fields (bp, expr);
327
 
328
  if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
329
    pack_ts_fixed_cst_value_fields (bp, expr);
330
 
331
  if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
332
    pack_ts_decl_common_value_fields (bp, expr);
333
 
334
  if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
335
    pack_ts_decl_wrtl_value_fields (bp, expr);
336
 
337
  if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
338
    pack_ts_decl_with_vis_value_fields (bp, expr);
339
 
340
  if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
341
    pack_ts_function_decl_value_fields (bp, expr);
342
 
343
  if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
344
    pack_ts_type_common_value_fields (bp, expr);
345
 
346
  if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
347
    pack_ts_block_value_fields (bp, expr);
348
 
349
  if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
350
    pack_ts_translation_unit_decl_value_fields (bp, expr);
351
}
352
 
353
 
354
/* Write the code and class of builtin EXPR to output block OB.  IX is
355
   the index into the streamer cache where EXPR is stored.*/
356
 
357
void
358
streamer_write_builtin (struct output_block *ob, tree expr)
359
{
360
  gcc_assert (streamer_handle_as_builtin_p (expr));
361
 
362
  if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_MD
363
      && !targetm.builtin_decl)
364
    sorry ("tree bytecode streams do not support machine specific builtin "
365
           "functions on this target");
366
 
367
  streamer_write_record_start (ob, LTO_builtin_decl);
368
  streamer_write_enum (ob->main_stream, built_in_class, BUILT_IN_LAST,
369
                       DECL_BUILT_IN_CLASS (expr));
370
  streamer_write_uhwi (ob, DECL_FUNCTION_CODE (expr));
371
 
372
  if (DECL_ASSEMBLER_NAME_SET_P (expr))
373
    {
374
      /* When the assembler name of a builtin gets a user name,
375
         the new name is always prefixed with '*' by
376
         set_builtin_user_assembler_name.  So, to prevent the
377
         reader side from adding a second '*', we omit it here.  */
378
      const char *str = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (expr));
379
      if (strlen (str) > 1 && str[0] == '*')
380
        streamer_write_string (ob, ob->main_stream, &str[1], true);
381
      else
382
        streamer_write_string (ob, ob->main_stream, NULL, true);
383
    }
384
  else
385
    streamer_write_string (ob, ob->main_stream, NULL, true);
386
}
387
 
388
 
389
/* Emit the chain of tree nodes starting at T.  OB is the output block
390
   to write to.  REF_P is true if chain elements should be emitted
391
   as references.  */
392
 
393
void
394
streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
395
{
396
  int i, count;
397
 
398
  count = list_length (t);
399
  streamer_write_hwi (ob, count);
400
  for (i = 0; i < count; i++)
401
    {
402
      tree saved_chain;
403
 
404
      /* Clear TREE_CHAIN to avoid blindly recursing into the rest
405
         of the list.  */
406
      saved_chain = TREE_CHAIN (t);
407
      TREE_CHAIN (t) = NULL_TREE;
408
 
409
      /* We avoid outputting external vars or functions by reference
410
         to the global decls section as we do not want to have them
411
         enter decl merging.  This is, of course, only for the call
412
         for streaming BLOCK_VARS, but other callers are safe.  */
413
      if (VAR_OR_FUNCTION_DECL_P (t)
414
          && DECL_EXTERNAL (t))
415
        stream_write_tree_shallow_non_ref (ob, t, ref_p);
416
      else
417
        stream_write_tree (ob, t, ref_p);
418
 
419
      TREE_CHAIN (t) = saved_chain;
420
      t = TREE_CHAIN (t);
421
    }
422
}
423
 
424
 
425
/* Write all pointer fields in the TS_COMMON structure of EXPR to output
426
   block OB.  If REF_P is true, write a reference to EXPR's pointer
427
   fields.  */
428
 
429
static void
430
write_ts_common_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
431
{
432
  if (TREE_CODE (expr) != IDENTIFIER_NODE)
433
    stream_write_tree (ob, TREE_TYPE (expr), ref_p);
434
}
435
 
436
 
437
/* Write all pointer fields in the TS_VECTOR structure of EXPR to output
438
   block OB.  If REF_P is true, write a reference to EXPR's pointer
439
   fields.  */
440
 
441
static void
442
write_ts_vector_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
443
{
444
  streamer_write_chain (ob, TREE_VECTOR_CST_ELTS (expr), ref_p);
445
}
446
 
447
 
448
/* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
449
   block OB.  If REF_P is true, write a reference to EXPR's pointer
450
   fields.  */
451
 
452
static void
453
write_ts_complex_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
454
{
455
  stream_write_tree (ob, TREE_REALPART (expr), ref_p);
456
  stream_write_tree (ob, TREE_IMAGPART (expr), ref_p);
457
}
458
 
459
 
460
/* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
461
   to output block OB.  If REF_P is true, write a reference to EXPR's
462
   pointer fields.  */
463
 
464
static void
465
write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr,
466
                                     bool ref_p)
467
{
468
  stream_write_tree (ob, DECL_NAME (expr), ref_p);
469
  stream_write_tree (ob, DECL_CONTEXT (expr), ref_p);
470
  lto_output_location (ob, DECL_SOURCE_LOCATION (expr));
471
}
472
 
473
 
474
/* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
475
   output block OB.  If REF_P is true, write a reference to EXPR's
476
   pointer fields.  */
477
 
478
static void
479
write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr,
480
                                    bool ref_p)
481
{
482
  stream_write_tree (ob, DECL_SIZE (expr), ref_p);
483
  stream_write_tree (ob, DECL_SIZE_UNIT (expr), ref_p);
484
 
485
  /* Note, DECL_INITIAL is not handled here.  Since DECL_INITIAL needs
486
     special handling in LTO, it must be handled by streamer hooks.  */
487
 
488
  stream_write_tree (ob, DECL_ATTRIBUTES (expr), ref_p);
489
 
490
  /* Do not stream DECL_ABSTRACT_ORIGIN.  We cannot handle debug information
491
     for early inlining so drop it on the floor instead of ICEing in
492
     dwarf2out.c.  */
493
 
494
  if (TREE_CODE (expr) == PARM_DECL)
495
    streamer_write_chain (ob, TREE_CHAIN (expr), ref_p);
496
 
497
  if ((TREE_CODE (expr) == VAR_DECL
498
       || TREE_CODE (expr) == PARM_DECL)
499
      && DECL_HAS_VALUE_EXPR_P (expr))
500
    stream_write_tree (ob, DECL_VALUE_EXPR (expr), ref_p);
501
 
502
  if (TREE_CODE (expr) == VAR_DECL)
503
    stream_write_tree (ob, DECL_DEBUG_EXPR (expr), ref_p);
504
}
505
 
506
 
507
/* Write all pointer fields in the TS_DECL_NON_COMMON structure of
508
   EXPR to output block OB.  If REF_P is true, write a reference to EXPR's
509
   pointer fields.  */
510
 
511
static void
512
write_ts_decl_non_common_tree_pointers (struct output_block *ob, tree expr,
513
                                        bool ref_p)
514
{
515
  if (TREE_CODE (expr) == FUNCTION_DECL)
516
    {
517
      stream_write_tree (ob, DECL_ARGUMENTS (expr), ref_p);
518
      stream_write_tree (ob, DECL_RESULT (expr), ref_p);
519
    }
520
  else if (TREE_CODE (expr) == TYPE_DECL)
521
    stream_write_tree (ob, DECL_ORIGINAL_TYPE (expr), ref_p);
522
  stream_write_tree (ob, DECL_VINDEX (expr), ref_p);
523
}
524
 
525
 
526
/* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
527
   to output block OB.  If REF_P is true, write a reference to EXPR's
528
   pointer fields.  */
529
 
530
static void
531
write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
532
                                      bool ref_p)
533
{
534
  /* Make sure we don't inadvertently set the assembler name.  */
535
  if (DECL_ASSEMBLER_NAME_SET_P (expr))
536
    stream_write_tree (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
537
  else
538
    stream_write_tree (ob, NULL_TREE, false);
539
 
540
  stream_write_tree (ob, DECL_SECTION_NAME (expr), ref_p);
541
  stream_write_tree (ob, DECL_COMDAT_GROUP (expr), ref_p);
542
}
543
 
544
 
545
/* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
546
   output block OB.  If REF_P is true, write a reference to EXPR's
547
   pointer fields.  */
548
 
549
static void
550
write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr,
551
                                   bool ref_p)
552
{
553
  stream_write_tree (ob, DECL_FIELD_OFFSET (expr), ref_p);
554
  stream_write_tree (ob, DECL_BIT_FIELD_TYPE (expr), ref_p);
555
  /* Do not stream DECL_QUALIFIER, it is useless after gimplification.  */
556
  stream_write_tree (ob, DECL_FIELD_BIT_OFFSET (expr), ref_p);
557
  stream_write_tree (ob, DECL_FCONTEXT (expr), ref_p);
558
}
559
 
560
 
561
/* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
562
   to output block OB.  If REF_P is true, write a reference to EXPR's
563
   pointer fields.  */
564
 
565
static void
566
write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
567
                                      bool ref_p)
568
{
569
  /* DECL_STRUCT_FUNCTION is handled by lto_output_function.  FIXME lto,
570
     maybe it should be handled here?  */
571
  stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
572
  stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
573
  stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p);
574
}
575
 
576
 
577
/* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
578
   output block OB.  If REF_P is true, write a reference to EXPR's
579
   pointer fields.  */
580
 
581
static void
582
write_ts_type_common_tree_pointers (struct output_block *ob, tree expr,
583
                                    bool ref_p)
584
{
585
  stream_write_tree (ob, TYPE_SIZE (expr), ref_p);
586
  stream_write_tree (ob, TYPE_SIZE_UNIT (expr), ref_p);
587
  stream_write_tree (ob, TYPE_ATTRIBUTES (expr), ref_p);
588
  stream_write_tree (ob, TYPE_NAME (expr), ref_p);
589
  /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO.  They will be
590
     reconstructed during fixup.  */
591
  /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
592
     during fixup.  */
593
  stream_write_tree (ob, TYPE_MAIN_VARIANT (expr), ref_p);
594
  stream_write_tree (ob, TYPE_CONTEXT (expr), ref_p);
595
  /* TYPE_CANONICAL is re-computed during type merging, so no need
596
     to stream it here.  */
597
  stream_write_tree (ob, TYPE_STUB_DECL (expr), ref_p);
598
}
599
 
600
/* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
601
   to output block OB.  If REF_P is true, write a reference to EXPR's
602
   pointer fields.  */
603
 
604
static void
605
write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr,
606
                                        bool ref_p)
607
{
608
  if (TREE_CODE (expr) == ENUMERAL_TYPE)
609
    stream_write_tree (ob, TYPE_VALUES (expr), ref_p);
610
  else if (TREE_CODE (expr) == ARRAY_TYPE)
611
    stream_write_tree (ob, TYPE_DOMAIN (expr), ref_p);
612
  else if (RECORD_OR_UNION_TYPE_P (expr))
613
    streamer_write_chain (ob, TYPE_FIELDS (expr), ref_p);
614
  else if (TREE_CODE (expr) == FUNCTION_TYPE
615
           || TREE_CODE (expr) == METHOD_TYPE)
616
    stream_write_tree (ob, TYPE_ARG_TYPES (expr), ref_p);
617
 
618
  if (!POINTER_TYPE_P (expr))
619
    stream_write_tree (ob, TYPE_MINVAL (expr), ref_p);
620
  stream_write_tree (ob, TYPE_MAXVAL (expr), ref_p);
621
  if (RECORD_OR_UNION_TYPE_P (expr))
622
    stream_write_tree (ob, TYPE_BINFO (expr), ref_p);
623
}
624
 
625
 
626
/* Write all pointer fields in the TS_LIST structure of EXPR to output
627
   block OB.  If REF_P is true, write a reference to EXPR's pointer
628
   fields.  */
629
 
630
static void
631
write_ts_list_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
632
{
633
  stream_write_tree (ob, TREE_PURPOSE (expr), ref_p);
634
  stream_write_tree (ob, TREE_VALUE (expr), ref_p);
635
  streamer_write_chain (ob, TREE_CHAIN (expr), ref_p);
636
}
637
 
638
 
639
/* Write all pointer fields in the TS_VEC structure of EXPR to output
640
   block OB.  If REF_P is true, write a reference to EXPR's pointer
641
   fields.  */
642
 
643
static void
644
write_ts_vec_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
645
{
646
  int i;
647
 
648
  /* Note that the number of slots for EXPR has already been emitted
649
     in EXPR's header (see streamer_write_tree_header).  */
650
  for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
651
    stream_write_tree (ob, TREE_VEC_ELT (expr, i), ref_p);
652
}
653
 
654
 
655
/* Write all pointer fields in the TS_EXP structure of EXPR to output
656
   block OB.  If REF_P is true, write a reference to EXPR's pointer
657
   fields.  */
658
 
659
static void
660
write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
661
{
662
  int i;
663
 
664
  streamer_write_hwi (ob, TREE_OPERAND_LENGTH (expr));
665
  for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
666
    stream_write_tree (ob, TREE_OPERAND (expr, i), ref_p);
667
  lto_output_location (ob, EXPR_LOCATION (expr));
668
  stream_write_tree (ob, TREE_BLOCK (expr), ref_p);
669
}
670
 
671
 
672
/* Write all pointer fields in the TS_BLOCK structure of EXPR to output
673
   block OB.  If REF_P is true, write a reference to EXPR's pointer
674
   fields.  */
675
 
676
static void
677
write_ts_block_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
678
{
679
  /* Do not stream BLOCK_SOURCE_LOCATION.  We cannot handle debug information
680
     for early inlining so drop it on the floor instead of ICEing in
681
     dwarf2out.c.  */
682
  streamer_write_chain (ob, BLOCK_VARS (expr), ref_p);
683
 
684
  /* Do not stream BLOCK_NONLOCALIZED_VARS.  We cannot handle debug information
685
     for early inlining so drop it on the floor instead of ICEing in
686
     dwarf2out.c.  */
687
 
688
  stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
689
  /* Do not stream BLOCK_ABSTRACT_ORIGIN.  We cannot handle debug information
690
     for early inlining so drop it on the floor instead of ICEing in
691
     dwarf2out.c.  */
692
  stream_write_tree (ob, BLOCK_FRAGMENT_ORIGIN (expr), ref_p);
693
  stream_write_tree (ob, BLOCK_FRAGMENT_CHAIN (expr), ref_p);
694
  /* Do not output BLOCK_SUBBLOCKS.  Instead on streaming-in this
695
     list is re-constructed from BLOCK_SUPERCONTEXT.  */
696
}
697
 
698
 
699
/* Write all pointer fields in the TS_BINFO structure of EXPR to output
700
   block OB.  If REF_P is true, write a reference to EXPR's pointer
701
   fields.  */
702
 
703
static void
704
write_ts_binfo_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
705
{
706
  unsigned i;
707
  tree t;
708
 
709
  /* Note that the number of BINFO slots has already been emitted in
710
     EXPR's header (see streamer_write_tree_header) because this length
711
     is needed to build the empty BINFO node on the reader side.  */
712
  FOR_EACH_VEC_ELT (tree, BINFO_BASE_BINFOS (expr), i, t)
713
    stream_write_tree (ob, t, ref_p);
714
  stream_write_tree (ob, NULL_TREE, false);
715
 
716
  stream_write_tree (ob, BINFO_OFFSET (expr), ref_p);
717
  stream_write_tree (ob, BINFO_VTABLE (expr), ref_p);
718
  stream_write_tree (ob, BINFO_VPTR_FIELD (expr), ref_p);
719
 
720
  streamer_write_uhwi (ob, VEC_length (tree, BINFO_BASE_ACCESSES (expr)));
721
  FOR_EACH_VEC_ELT (tree, BINFO_BASE_ACCESSES (expr), i, t)
722
    stream_write_tree (ob, t, ref_p);
723
 
724
  stream_write_tree (ob, BINFO_INHERITANCE_CHAIN (expr), ref_p);
725
  stream_write_tree (ob, BINFO_SUBVTT_INDEX (expr), ref_p);
726
  stream_write_tree (ob, BINFO_VPTR_INDEX (expr), ref_p);
727
}
728
 
729
 
730
/* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
731
   output block OB.  If REF_P is true, write a reference to EXPR's
732
   pointer fields.  */
733
 
734
static void
735
write_ts_constructor_tree_pointers (struct output_block *ob, tree expr,
736
                                    bool ref_p)
737
{
738
  unsigned i;
739
  tree index, value;
740
 
741
  streamer_write_uhwi (ob, CONSTRUCTOR_NELTS (expr));
742
  FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
743
    {
744
      stream_write_tree (ob, index, ref_p);
745
      stream_write_tree (ob, value, ref_p);
746
    }
747
}
748
 
749
/* Write a TS_TARGET_OPTION tree in EXPR to OB.  */
750
 
751
static void
752
write_ts_target_option (struct output_block *ob, tree expr)
753
{
754
  struct cl_target_option *t = TREE_TARGET_OPTION (expr);
755
  struct bitpack_d bp;
756
  unsigned i, len;
757
 
758
  /* The cl_target_option is target specific and generated by the options
759
     awk script, so we just recreate a byte-by-byte copy here. */
760
 
761
  bp = bitpack_create (ob->main_stream);
762
  len = sizeof (struct cl_target_option);
763
  for (i = 0; i < len; i++)
764
    bp_pack_value (&bp, ((unsigned char *)t)[i], 8);
765
  /* Catch struct size mismatches between reader and writer. */
766
  bp_pack_value (&bp, 0x12345678, 32);
767
  streamer_write_bitpack (&bp);
768
}
769
 
770
/* Write a TS_OPTIMIZATION tree in EXPR to OB.  */
771
 
772
static void
773
write_ts_optimization (struct output_block *ob, tree expr)
774
{
775
  struct cl_optimization *t = TREE_OPTIMIZATION (expr);
776
  struct bitpack_d bp;
777
  unsigned i, len;
778
 
779
  /* The cl_optimization is generated by the options
780
     awk script, so we just recreate a byte-by-byte copy here. */
781
 
782
  bp = bitpack_create (ob->main_stream);
783
  len = sizeof (struct cl_optimization);
784
  for (i = 0; i < len; i++)
785
    bp_pack_value (&bp, ((unsigned char *)t)[i], 8);
786
  /* Catch struct size mismatches between reader and writer. */
787
  bp_pack_value (&bp, 0x12345678, 32);
788
  streamer_write_bitpack (&bp);
789
}
790
 
791
/* Write a TS_TRANSLATION_UNIT_DECL tree in EXPR to OB.  */
792
 
793
static void
794
write_ts_translation_unit_decl_tree_pointers (struct output_block *ob,
795
                                              tree expr)
796
{
797
  streamer_write_string (ob, ob->main_stream,
798
                         TRANSLATION_UNIT_LANGUAGE (expr), true);
799
}
800
 
801
/* Write all pointer fields in EXPR to output block OB.  If REF_P is true,
802
   the leaves of EXPR are emitted as references.  */
803
 
804
void
805
streamer_write_tree_body (struct output_block *ob, tree expr, bool ref_p)
806
{
807
  enum tree_code code;
808
 
809
  code = TREE_CODE (expr);
810
 
811
  if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
812
    write_ts_common_tree_pointers (ob, expr, ref_p);
813
 
814
  if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
815
    write_ts_vector_tree_pointers (ob, expr, ref_p);
816
 
817
  if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
818
    write_ts_complex_tree_pointers (ob, expr, ref_p);
819
 
820
  if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
821
    write_ts_decl_minimal_tree_pointers (ob, expr, ref_p);
822
 
823
  if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
824
    write_ts_decl_common_tree_pointers (ob, expr, ref_p);
825
 
826
  if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
827
    write_ts_decl_non_common_tree_pointers (ob, expr, ref_p);
828
 
829
  if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
830
    write_ts_decl_with_vis_tree_pointers (ob, expr, ref_p);
831
 
832
  if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
833
    write_ts_field_decl_tree_pointers (ob, expr, ref_p);
834
 
835
  if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
836
    write_ts_function_decl_tree_pointers (ob, expr, ref_p);
837
 
838
  if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
839
    write_ts_type_common_tree_pointers (ob, expr, ref_p);
840
 
841
  if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
842
    write_ts_type_non_common_tree_pointers (ob, expr, ref_p);
843
 
844
  if (CODE_CONTAINS_STRUCT (code, TS_LIST))
845
    write_ts_list_tree_pointers (ob, expr, ref_p);
846
 
847
  if (CODE_CONTAINS_STRUCT (code, TS_VEC))
848
    write_ts_vec_tree_pointers (ob, expr, ref_p);
849
 
850
  if (CODE_CONTAINS_STRUCT (code, TS_EXP))
851
    write_ts_exp_tree_pointers (ob, expr, ref_p);
852
 
853
  if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
854
    write_ts_block_tree_pointers (ob, expr, ref_p);
855
 
856
  if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
857
    write_ts_binfo_tree_pointers (ob, expr, ref_p);
858
 
859
  if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
860
    write_ts_constructor_tree_pointers (ob, expr, ref_p);
861
 
862
  if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
863
    write_ts_target_option (ob, expr);
864
 
865
  if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
866
    write_ts_optimization (ob, expr);
867
 
868
  if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
869
    write_ts_translation_unit_decl_tree_pointers (ob, expr);
870
}
871
 
872
 
873
/* Emit header information for tree EXPR to output block OB.  The header
874
   contains everything needed to instantiate an empty skeleton for
875
   EXPR on the reading side.  IX is the index into the streamer cache
876
   where EXPR is stored.  */
877
 
878
void
879
streamer_write_tree_header (struct output_block *ob, tree expr)
880
{
881
  enum LTO_tags tag;
882
  enum tree_code code;
883
 
884
  /* We should not see any tree nodes not handled by the streamer.  */
885
  code = TREE_CODE (expr);
886
 
887
  /* The header of a tree node consists of its tag, the size of
888
     the node, and any other information needed to instantiate
889
     EXPR on the reading side (such as the number of slots in
890
     variable sized nodes).  */
891
  tag = lto_tree_code_to_tag (code);
892
  streamer_write_record_start (ob, tag);
893
 
894
  /* The following will cause bootstrap miscomparisons.  Enable with care.  */
895
#ifdef LTO_STREAMER_DEBUG
896
  /* This is used mainly for debugging purposes.  When the reader
897
     and the writer do not agree on a streamed node, the pointer
898
     value for EXPR can be used to track down the differences in
899
     the debugger.  */
900
  gcc_assert ((HOST_WIDEST_INT) (intptr_t) expr == (intptr_t) expr);
901
  streamer_write_hwi (ob, (HOST_WIDEST_INT) (intptr_t) expr);
902
#endif
903
 
904
  /* The text in strings and identifiers are completely emitted in
905
     the header.  */
906
  if (CODE_CONTAINS_STRUCT (code, TS_STRING))
907
    streamer_write_string_cst (ob, ob->main_stream, expr);
908
  else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
909
    write_identifier (ob, ob->main_stream, expr);
910
  else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
911
    streamer_write_hwi (ob, TREE_VEC_LENGTH (expr));
912
  else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
913
    streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr));
914
  else if (TREE_CODE (expr) == CALL_EXPR)
915
    streamer_write_uhwi (ob, call_expr_nargs (expr));
916
}
917
 
918
 
919
/* Emit the integer constant CST to output block OB.  If REF_P is true,
920
   CST's type will be emitted as a reference.  */
921
 
922
void
923
streamer_write_integer_cst (struct output_block *ob, tree cst, bool ref_p)
924
{
925
  streamer_write_record_start (ob, lto_tree_code_to_tag (INTEGER_CST));
926
  stream_write_tree (ob, TREE_TYPE (cst), ref_p);
927
  streamer_write_char_stream (ob->main_stream, TREE_OVERFLOW_P (cst));
928
  streamer_write_uhwi (ob, TREE_INT_CST_LOW (cst));
929
  streamer_write_uhwi (ob, TREE_INT_CST_HIGH (cst));
930
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.