annotate gcc/lto-streamer-out.c @ 136:4627f235cf2a

fix c-next example
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 08 Nov 2018 14:11:56 +0900
parents 84e7813d76e9
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /* Write the GIMPLE representation to a file stream.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3 Copyright (C) 2009-2018 Free Software Foundation, Inc.
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 Re-implemented by Diego Novillo <dnovillo@google.com>
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 This file is part of GCC.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 GCC is free software; you can redistribute it and/or modify it under
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 the terms of the GNU General Public License as published by the Free
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 Software Foundation; either version 3, or (at your option) any later
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 version.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 for more details.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 You should have received a copy of the GNU General Public License
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 along with GCC; see the file COPYING3. If not see
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 <http://www.gnu.org/licenses/>. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 #include "config.h"
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 #include "system.h"
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 #include "coretypes.h"
111
kono
parents: 67
diff changeset
26 #include "backend.h"
kono
parents: 67
diff changeset
27 #include "target.h"
kono
parents: 67
diff changeset
28 #include "rtl.h"
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 #include "tree.h"
111
kono
parents: 67
diff changeset
30 #include "gimple.h"
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 #include "tree-pass.h"
111
kono
parents: 67
diff changeset
32 #include "ssa.h"
kono
parents: 67
diff changeset
33 #include "gimple-streamer.h"
kono
parents: 67
diff changeset
34 #include "alias.h"
kono
parents: 67
diff changeset
35 #include "stor-layout.h"
kono
parents: 67
diff changeset
36 #include "gimple-iterator.h"
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 #include "except.h"
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 #include "lto-symtab.h"
111
kono
parents: 67
diff changeset
39 #include "cgraph.h"
kono
parents: 67
diff changeset
40 #include "cfgloop.h"
kono
parents: 67
diff changeset
41 #include "builtins.h"
kono
parents: 67
diff changeset
42 #include "gomp-constants.h"
kono
parents: 67
diff changeset
43 #include "debug.h"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
44 #include "omp-offload.h"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
45 #include "print-tree.h"
111
kono
parents: 67
diff changeset
46
kono
parents: 67
diff changeset
47
kono
parents: 67
diff changeset
48 static void lto_write_tree (struct output_block*, tree, bool);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 /* Clear the line info stored in DATA_IN. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 static void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 clear_line_info (struct output_block *ob)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 ob->current_file = NULL;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 ob->current_line = 0;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 ob->current_col = 0;
111
kono
parents: 67
diff changeset
58 ob->current_sysp = false;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 /* Create the output block and return it. SECTION_TYPE is
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 LTO_section_function_body or LTO_static_initializer. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 struct output_block *
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 create_output_block (enum lto_section_type section_type)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 struct output_block *ob = XCNEW (struct output_block);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
69 if (streamer_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
70 fprintf (streamer_dump_file, "Creating output block for %s\n",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
71 lto_section_name [section_type]);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 ob->section_type = section_type;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 ob->decl_state = lto_get_out_decl_state ();
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 ob->main_stream = XCNEW (struct lto_output_stream);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 ob->string_stream = XCNEW (struct lto_output_stream);
111
kono
parents: 67
diff changeset
77 ob->writer_cache = streamer_tree_cache_create (!flag_wpa, true, false);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 if (section_type == LTO_section_function_body)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 ob->cfg_stream = XCNEW (struct lto_output_stream);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 clear_line_info (ob);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83
111
kono
parents: 67
diff changeset
84 ob->string_hash_table = new hash_table<string_slot_hasher> (37);
kono
parents: 67
diff changeset
85 gcc_obstack_init (&ob->obstack);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 return ob;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 /* Destroy the output block OB. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 destroy_output_block (struct output_block *ob)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 enum lto_section_type section_type = ob->section_type;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
111
kono
parents: 67
diff changeset
98 delete ob->string_hash_table;
kono
parents: 67
diff changeset
99 ob->string_hash_table = NULL;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 free (ob->main_stream);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 free (ob->string_stream);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 if (section_type == LTO_section_function_body)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 free (ob->cfg_stream);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105
111
kono
parents: 67
diff changeset
106 streamer_tree_cache_delete (ob->writer_cache);
kono
parents: 67
diff changeset
107 obstack_free (&ob->obstack, NULL);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 free (ob);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 /* Look up NODE in the type table and write the index for it to OB. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 static void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 output_type_ref (struct output_block *ob, tree node)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 {
111
kono
parents: 67
diff changeset
118 streamer_write_record_start (ob, LTO_type_ref);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 lto_output_type_ref_index (ob->decl_state, ob->main_stream, node);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 /* Return true if tree node T is written to various tables. For these
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 nodes, we sometimes want to write their phyiscal representation
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 (via lto_output_tree), and sometimes we need to emit an index
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 reference into a table (via lto_output_tree_ref). */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 static bool
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 tree_is_indexable (tree t)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 {
111
kono
parents: 67
diff changeset
131 /* Parameters and return values of functions of variably modified types
kono
parents: 67
diff changeset
132 must go to global stream, because they may be used in the type
kono
parents: 67
diff changeset
133 definition. */
kono
parents: 67
diff changeset
134 if ((TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
kono
parents: 67
diff changeset
135 && DECL_CONTEXT (t))
kono
parents: 67
diff changeset
136 return variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t)), NULL_TREE);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
137 /* IMPORTED_DECL is put into BLOCK and thus it never can be shared.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
138 We should no longer need to stream it. */
111
kono
parents: 67
diff changeset
139 else if (TREE_CODE (t) == IMPORTED_DECL)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
140 gcc_unreachable ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
141 else if (TREE_CODE (t) == LABEL_DECL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
142 return FORCED_LABEL (t) || DECL_NONLOCAL (t);
111
kono
parents: 67
diff changeset
143 else if (((VAR_P (t) && !TREE_STATIC (t))
kono
parents: 67
diff changeset
144 || TREE_CODE (t) == TYPE_DECL
kono
parents: 67
diff changeset
145 || TREE_CODE (t) == CONST_DECL
kono
parents: 67
diff changeset
146 || TREE_CODE (t) == NAMELIST_DECL)
kono
parents: 67
diff changeset
147 && decl_function_context (t))
kono
parents: 67
diff changeset
148 return false;
kono
parents: 67
diff changeset
149 else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
kono
parents: 67
diff changeset
150 return false;
kono
parents: 67
diff changeset
151 /* Variably modified types need to be streamed alongside function
kono
parents: 67
diff changeset
152 bodies because they can refer to local entities. Together with
kono
parents: 67
diff changeset
153 them we have to localize their members as well.
kono
parents: 67
diff changeset
154 ??? In theory that includes non-FIELD_DECLs as well. */
kono
parents: 67
diff changeset
155 else if (TYPE_P (t)
kono
parents: 67
diff changeset
156 && variably_modified_type_p (t, NULL_TREE))
kono
parents: 67
diff changeset
157 return false;
kono
parents: 67
diff changeset
158 else if (TREE_CODE (t) == FIELD_DECL
kono
parents: 67
diff changeset
159 && variably_modified_type_p (DECL_CONTEXT (t), NULL_TREE))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165
111
kono
parents: 67
diff changeset
166 /* Output info about new location into bitpack BP.
kono
parents: 67
diff changeset
167 After outputting bitpack, lto_output_location_data has
kono
parents: 67
diff changeset
168 to be done to output actual data. */
kono
parents: 67
diff changeset
169
kono
parents: 67
diff changeset
170 void
kono
parents: 67
diff changeset
171 lto_output_location (struct output_block *ob, struct bitpack_d *bp,
kono
parents: 67
diff changeset
172 location_t loc)
kono
parents: 67
diff changeset
173 {
kono
parents: 67
diff changeset
174 expanded_location xloc;
kono
parents: 67
diff changeset
175
kono
parents: 67
diff changeset
176 loc = LOCATION_LOCUS (loc);
kono
parents: 67
diff changeset
177 bp_pack_int_in_range (bp, 0, RESERVED_LOCATION_COUNT,
kono
parents: 67
diff changeset
178 loc < RESERVED_LOCATION_COUNT
kono
parents: 67
diff changeset
179 ? loc : RESERVED_LOCATION_COUNT);
kono
parents: 67
diff changeset
180 if (loc < RESERVED_LOCATION_COUNT)
kono
parents: 67
diff changeset
181 return;
kono
parents: 67
diff changeset
182
kono
parents: 67
diff changeset
183 xloc = expand_location (loc);
kono
parents: 67
diff changeset
184
kono
parents: 67
diff changeset
185 bp_pack_value (bp, ob->current_file != xloc.file, 1);
kono
parents: 67
diff changeset
186 bp_pack_value (bp, ob->current_line != xloc.line, 1);
kono
parents: 67
diff changeset
187 bp_pack_value (bp, ob->current_col != xloc.column, 1);
kono
parents: 67
diff changeset
188
kono
parents: 67
diff changeset
189 if (ob->current_file != xloc.file)
kono
parents: 67
diff changeset
190 {
kono
parents: 67
diff changeset
191 bp_pack_string (ob, bp, xloc.file, true);
kono
parents: 67
diff changeset
192 bp_pack_value (bp, xloc.sysp, 1);
kono
parents: 67
diff changeset
193 }
kono
parents: 67
diff changeset
194 ob->current_file = xloc.file;
kono
parents: 67
diff changeset
195 ob->current_sysp = xloc.sysp;
kono
parents: 67
diff changeset
196
kono
parents: 67
diff changeset
197 if (ob->current_line != xloc.line)
kono
parents: 67
diff changeset
198 bp_pack_var_len_unsigned (bp, xloc.line);
kono
parents: 67
diff changeset
199 ob->current_line = xloc.line;
kono
parents: 67
diff changeset
200
kono
parents: 67
diff changeset
201 if (ob->current_col != xloc.column)
kono
parents: 67
diff changeset
202 bp_pack_var_len_unsigned (bp, xloc.column);
kono
parents: 67
diff changeset
203 ob->current_col = xloc.column;
kono
parents: 67
diff changeset
204 }
kono
parents: 67
diff changeset
205
kono
parents: 67
diff changeset
206
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 /* If EXPR is an indexable tree node, output a reference to it to
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 output block OB. Otherwise, output the physical representation of
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 EXPR to OB. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 static void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 lto_output_tree_ref (struct output_block *ob, tree expr)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 enum tree_code code;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
215
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 if (TYPE_P (expr))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 output_type_ref (ob, expr);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 return;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 code = TREE_CODE (expr);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 switch (code)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 case SSA_NAME:
111
kono
parents: 67
diff changeset
226 streamer_write_record_start (ob, LTO_ssa_name_ref);
kono
parents: 67
diff changeset
227 streamer_write_uhwi (ob, SSA_NAME_VERSION (expr));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 case FIELD_DECL:
111
kono
parents: 67
diff changeset
231 streamer_write_record_start (ob, LTO_field_decl_ref);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 lto_output_field_decl_index (ob->decl_state, ob->main_stream, expr);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 case FUNCTION_DECL:
111
kono
parents: 67
diff changeset
236 streamer_write_record_start (ob, LTO_function_decl_ref);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, expr);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 case VAR_DECL:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 case DEBUG_EXPR_DECL:
111
kono
parents: 67
diff changeset
242 gcc_assert (decl_function_context (expr) == NULL || TREE_STATIC (expr));
kono
parents: 67
diff changeset
243 /* FALLTHRU */
kono
parents: 67
diff changeset
244 case PARM_DECL:
kono
parents: 67
diff changeset
245 streamer_write_record_start (ob, LTO_global_decl_ref);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 case CONST_DECL:
111
kono
parents: 67
diff changeset
250 streamer_write_record_start (ob, LTO_const_decl_ref);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 case IMPORTED_DECL:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 gcc_assert (decl_function_context (expr) == NULL);
111
kono
parents: 67
diff changeset
256 streamer_write_record_start (ob, LTO_imported_decl_ref);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
259
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 case TYPE_DECL:
111
kono
parents: 67
diff changeset
261 streamer_write_record_start (ob, LTO_type_decl_ref);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 lto_output_type_decl_index (ob->decl_state, ob->main_stream, expr);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
264
111
kono
parents: 67
diff changeset
265 case NAMELIST_DECL:
kono
parents: 67
diff changeset
266 streamer_write_record_start (ob, LTO_namelist_decl_ref);
kono
parents: 67
diff changeset
267 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
kono
parents: 67
diff changeset
268 break;
kono
parents: 67
diff changeset
269
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 case NAMESPACE_DECL:
111
kono
parents: 67
diff changeset
271 streamer_write_record_start (ob, LTO_namespace_decl_ref);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 lto_output_namespace_decl_index (ob->decl_state, ob->main_stream, expr);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
274
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 case LABEL_DECL:
111
kono
parents: 67
diff changeset
276 streamer_write_record_start (ob, LTO_label_decl_ref);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
279
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 case RESULT_DECL:
111
kono
parents: 67
diff changeset
281 streamer_write_record_start (ob, LTO_result_decl_ref);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
283 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
284
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
285 case TRANSLATION_UNIT_DECL:
111
kono
parents: 67
diff changeset
286 streamer_write_record_start (ob, LTO_translation_unit_decl_ref);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
287 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
288 break;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
289
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
290 default:
111
kono
parents: 67
diff changeset
291 /* No other node is indexable, so it should have been handled by
kono
parents: 67
diff changeset
292 lto_output_tree. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 gcc_unreachable ();
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
294 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
296
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
297
111
kono
parents: 67
diff changeset
298 /* Return true if EXPR is a tree node that can be written to disk. */
kono
parents: 67
diff changeset
299
kono
parents: 67
diff changeset
300 static inline bool
kono
parents: 67
diff changeset
301 lto_is_streamable (tree expr)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 {
111
kono
parents: 67
diff changeset
303 enum tree_code code = TREE_CODE (expr);
kono
parents: 67
diff changeset
304
kono
parents: 67
diff changeset
305 /* Notice that we reject SSA_NAMEs as well. We only emit the SSA
kono
parents: 67
diff changeset
306 name version in lto_output_tree_ref (see output_ssa_names). */
kono
parents: 67
diff changeset
307 return !is_lang_specific (expr)
kono
parents: 67
diff changeset
308 && code != SSA_NAME
kono
parents: 67
diff changeset
309 && code != CALL_EXPR
kono
parents: 67
diff changeset
310 && code != LANG_TYPE
kono
parents: 67
diff changeset
311 && code != MODIFY_EXPR
kono
parents: 67
diff changeset
312 && code != INIT_EXPR
kono
parents: 67
diff changeset
313 && code != TARGET_EXPR
kono
parents: 67
diff changeset
314 && code != BIND_EXPR
kono
parents: 67
diff changeset
315 && code != WITH_CLEANUP_EXPR
kono
parents: 67
diff changeset
316 && code != STATEMENT_LIST
kono
parents: 67
diff changeset
317 && (code == CASE_LABEL_EXPR
kono
parents: 67
diff changeset
318 || code == DECL_EXPR
kono
parents: 67
diff changeset
319 || TREE_CODE_CLASS (code) != tcc_statement);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
320 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
321
111
kono
parents: 67
diff changeset
322 /* Very rough estimate of streaming size of the initializer. If we ignored
kono
parents: 67
diff changeset
323 presence of strings, we could simply just count number of non-indexable
kono
parents: 67
diff changeset
324 tree nodes and number of references to indexable nodes. Strings however
kono
parents: 67
diff changeset
325 may be very large and we do not want to dump them int othe global stream.
kono
parents: 67
diff changeset
326
kono
parents: 67
diff changeset
327 Count the size of initializer until the size in DATA is positive. */
kono
parents: 67
diff changeset
328
kono
parents: 67
diff changeset
329 static tree
kono
parents: 67
diff changeset
330 subtract_estimated_size (tree *tp, int *ws, void *data)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
331 {
111
kono
parents: 67
diff changeset
332 long *sum = (long *)data;
kono
parents: 67
diff changeset
333 if (tree_is_indexable (*tp))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
334 {
111
kono
parents: 67
diff changeset
335 /* Indexable tree is one reference to global stream.
kono
parents: 67
diff changeset
336 Guess it may be about 4 bytes. */
kono
parents: 67
diff changeset
337 *sum -= 4;
kono
parents: 67
diff changeset
338 *ws = 0;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
339 }
111
kono
parents: 67
diff changeset
340 /* String table entry + base of tree node needs to be streamed. */
kono
parents: 67
diff changeset
341 if (TREE_CODE (*tp) == STRING_CST)
kono
parents: 67
diff changeset
342 *sum -= TREE_STRING_LENGTH (*tp) + 8;
kono
parents: 67
diff changeset
343 else
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
344 {
111
kono
parents: 67
diff changeset
345 /* Identifiers are also variable length but should not appear
kono
parents: 67
diff changeset
346 naked in constructor. */
kono
parents: 67
diff changeset
347 gcc_checking_assert (TREE_CODE (*tp) != IDENTIFIER_NODE);
kono
parents: 67
diff changeset
348 /* We do not really make attempt to work out size of pickled tree, as
kono
parents: 67
diff changeset
349 it is very variable. Make it bigger than the reference. */
kono
parents: 67
diff changeset
350 *sum -= 16;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 }
111
kono
parents: 67
diff changeset
352 if (*sum < 0)
kono
parents: 67
diff changeset
353 return *tp;
kono
parents: 67
diff changeset
354 return NULL_TREE;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
356
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
357
111
kono
parents: 67
diff changeset
358 /* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */
kono
parents: 67
diff changeset
359
kono
parents: 67
diff changeset
360 static tree
kono
parents: 67
diff changeset
361 get_symbol_initial_value (lto_symtab_encoder_t encoder, tree expr)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
362 {
111
kono
parents: 67
diff changeset
363 gcc_checking_assert (DECL_P (expr)
kono
parents: 67
diff changeset
364 && TREE_CODE (expr) != FUNCTION_DECL
kono
parents: 67
diff changeset
365 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL);
kono
parents: 67
diff changeset
366
kono
parents: 67
diff changeset
367 /* Handle DECL_INITIAL for symbols. */
kono
parents: 67
diff changeset
368 tree initial = DECL_INITIAL (expr);
kono
parents: 67
diff changeset
369 if (VAR_P (expr)
kono
parents: 67
diff changeset
370 && (TREE_STATIC (expr) || DECL_EXTERNAL (expr))
kono
parents: 67
diff changeset
371 && !DECL_IN_CONSTANT_POOL (expr)
kono
parents: 67
diff changeset
372 && initial)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
373 {
111
kono
parents: 67
diff changeset
374 varpool_node *vnode;
kono
parents: 67
diff changeset
375 /* Extra section needs about 30 bytes; do not produce it for simple
kono
parents: 67
diff changeset
376 scalar values. */
kono
parents: 67
diff changeset
377 if (!(vnode = varpool_node::get (expr))
kono
parents: 67
diff changeset
378 || !lto_symtab_encoder_encode_initializer_p (encoder, vnode))
kono
parents: 67
diff changeset
379 initial = error_mark_node;
kono
parents: 67
diff changeset
380 if (initial != error_mark_node)
kono
parents: 67
diff changeset
381 {
kono
parents: 67
diff changeset
382 long max_size = 30;
kono
parents: 67
diff changeset
383 if (walk_tree (&initial, subtract_estimated_size, (void *)&max_size,
kono
parents: 67
diff changeset
384 NULL))
kono
parents: 67
diff changeset
385 initial = error_mark_node;
kono
parents: 67
diff changeset
386 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
387 }
111
kono
parents: 67
diff changeset
388
kono
parents: 67
diff changeset
389 return initial;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
390 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
391
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
392
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
393 /* Write a physical representation of tree node EXPR to output block
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
394 OB. If REF_P is true, the leaves of EXPR are emitted as references
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
395 via lto_output_tree_ref. IX is the index into the streamer cache
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
396 where EXPR is stored. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
397
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
398 static void
111
kono
parents: 67
diff changeset
399 lto_write_tree_1 (struct output_block *ob, tree expr, bool ref_p)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
400 {
111
kono
parents: 67
diff changeset
401 /* Pack all the non-pointer fields in EXPR into a bitpack and write
kono
parents: 67
diff changeset
402 the resulting bitpack. */
kono
parents: 67
diff changeset
403 streamer_write_tree_bitfields (ob, expr);
kono
parents: 67
diff changeset
404
kono
parents: 67
diff changeset
405 /* Write all the pointer fields in EXPR. */
kono
parents: 67
diff changeset
406 streamer_write_tree_body (ob, expr, ref_p);
kono
parents: 67
diff changeset
407
kono
parents: 67
diff changeset
408 /* Write any LTO-specific data to OB. */
kono
parents: 67
diff changeset
409 if (DECL_P (expr)
kono
parents: 67
diff changeset
410 && TREE_CODE (expr) != FUNCTION_DECL
kono
parents: 67
diff changeset
411 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
kono
parents: 67
diff changeset
412 {
kono
parents: 67
diff changeset
413 /* Handle DECL_INITIAL for symbols. */
kono
parents: 67
diff changeset
414 tree initial = get_symbol_initial_value
kono
parents: 67
diff changeset
415 (ob->decl_state->symtab_node_encoder, expr);
kono
parents: 67
diff changeset
416 stream_write_tree (ob, initial, ref_p);
kono
parents: 67
diff changeset
417 }
kono
parents: 67
diff changeset
418
kono
parents: 67
diff changeset
419 /* Stream references to early generated DIEs. Keep in sync with the
kono
parents: 67
diff changeset
420 trees handled in dwarf2out_die_ref_for_decl. */
kono
parents: 67
diff changeset
421 if ((DECL_P (expr)
kono
parents: 67
diff changeset
422 && TREE_CODE (expr) != FIELD_DECL
kono
parents: 67
diff changeset
423 && TREE_CODE (expr) != DEBUG_EXPR_DECL
kono
parents: 67
diff changeset
424 && TREE_CODE (expr) != TYPE_DECL)
kono
parents: 67
diff changeset
425 || TREE_CODE (expr) == BLOCK)
kono
parents: 67
diff changeset
426 {
kono
parents: 67
diff changeset
427 const char *sym;
kono
parents: 67
diff changeset
428 unsigned HOST_WIDE_INT off;
kono
parents: 67
diff changeset
429 if (debug_info_level > DINFO_LEVEL_NONE
kono
parents: 67
diff changeset
430 && debug_hooks->die_ref_for_decl (expr, &sym, &off))
kono
parents: 67
diff changeset
431 {
kono
parents: 67
diff changeset
432 streamer_write_string (ob, ob->main_stream, sym, true);
kono
parents: 67
diff changeset
433 streamer_write_uhwi (ob, off);
kono
parents: 67
diff changeset
434 }
kono
parents: 67
diff changeset
435 else
kono
parents: 67
diff changeset
436 streamer_write_string (ob, ob->main_stream, NULL, true);
kono
parents: 67
diff changeset
437 }
kono
parents: 67
diff changeset
438 }
kono
parents: 67
diff changeset
439
kono
parents: 67
diff changeset
440 /* Write a physical representation of tree node EXPR to output block
kono
parents: 67
diff changeset
441 OB. If REF_P is true, the leaves of EXPR are emitted as references
kono
parents: 67
diff changeset
442 via lto_output_tree_ref. IX is the index into the streamer cache
kono
parents: 67
diff changeset
443 where EXPR is stored. */
kono
parents: 67
diff changeset
444
kono
parents: 67
diff changeset
445 static void
kono
parents: 67
diff changeset
446 lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
kono
parents: 67
diff changeset
447 {
kono
parents: 67
diff changeset
448 if (!lto_is_streamable (expr))
kono
parents: 67
diff changeset
449 internal_error ("tree code %qs is not supported in LTO streams",
kono
parents: 67
diff changeset
450 get_tree_code_name (TREE_CODE (expr)));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
451
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 /* Write the header, containing everything needed to materialize
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
453 EXPR on the reading side. */
111
kono
parents: 67
diff changeset
454 streamer_write_tree_header (ob, expr);
kono
parents: 67
diff changeset
455
kono
parents: 67
diff changeset
456 lto_write_tree_1 (ob, expr, ref_p);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
457
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
458 /* Mark the end of EXPR. */
111
kono
parents: 67
diff changeset
459 streamer_write_zero (ob);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
460 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
461
111
kono
parents: 67
diff changeset
462 /* Emit the physical representation of tree node EXPR to output block OB,
kono
parents: 67
diff changeset
463 If THIS_REF_P is true, the leaves of EXPR are emitted as references via
kono
parents: 67
diff changeset
464 lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
465
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 static void
111
kono
parents: 67
diff changeset
467 lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash,
kono
parents: 67
diff changeset
468 bool ref_p, bool this_ref_p)
kono
parents: 67
diff changeset
469 {
kono
parents: 67
diff changeset
470 unsigned ix;
kono
parents: 67
diff changeset
471
kono
parents: 67
diff changeset
472 gcc_checking_assert (expr != NULL_TREE
kono
parents: 67
diff changeset
473 && !(this_ref_p && tree_is_indexable (expr)));
kono
parents: 67
diff changeset
474
kono
parents: 67
diff changeset
475 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
kono
parents: 67
diff changeset
476 expr, hash, &ix);
kono
parents: 67
diff changeset
477 gcc_assert (!exists_p);
kono
parents: 67
diff changeset
478 if (TREE_CODE (expr) == INTEGER_CST
kono
parents: 67
diff changeset
479 && !TREE_OVERFLOW (expr))
kono
parents: 67
diff changeset
480 {
kono
parents: 67
diff changeset
481 /* Shared INTEGER_CST nodes are special because they need their
kono
parents: 67
diff changeset
482 original type to be materialized by the reader (to implement
kono
parents: 67
diff changeset
483 TYPE_CACHED_VALUES). */
kono
parents: 67
diff changeset
484 streamer_write_integer_cst (ob, expr, ref_p);
kono
parents: 67
diff changeset
485 }
kono
parents: 67
diff changeset
486 else
kono
parents: 67
diff changeset
487 {
kono
parents: 67
diff changeset
488 /* This is the first time we see EXPR, write its fields
kono
parents: 67
diff changeset
489 to OB. */
kono
parents: 67
diff changeset
490 lto_write_tree (ob, expr, ref_p);
kono
parents: 67
diff changeset
491 }
kono
parents: 67
diff changeset
492 }
kono
parents: 67
diff changeset
493
kono
parents: 67
diff changeset
494 class DFS
kono
parents: 67
diff changeset
495 {
kono
parents: 67
diff changeset
496 public:
kono
parents: 67
diff changeset
497 DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
kono
parents: 67
diff changeset
498 bool single_p);
kono
parents: 67
diff changeset
499 ~DFS ();
kono
parents: 67
diff changeset
500
kono
parents: 67
diff changeset
501 struct scc_entry
kono
parents: 67
diff changeset
502 {
kono
parents: 67
diff changeset
503 tree t;
kono
parents: 67
diff changeset
504 hashval_t hash;
kono
parents: 67
diff changeset
505 };
kono
parents: 67
diff changeset
506 vec<scc_entry> sccstack;
kono
parents: 67
diff changeset
507
kono
parents: 67
diff changeset
508 private:
kono
parents: 67
diff changeset
509 struct sccs
kono
parents: 67
diff changeset
510 {
kono
parents: 67
diff changeset
511 unsigned int dfsnum;
kono
parents: 67
diff changeset
512 unsigned int low;
kono
parents: 67
diff changeset
513 };
kono
parents: 67
diff changeset
514 struct worklist
kono
parents: 67
diff changeset
515 {
kono
parents: 67
diff changeset
516 tree expr;
kono
parents: 67
diff changeset
517 sccs *from_state;
kono
parents: 67
diff changeset
518 sccs *cstate;
kono
parents: 67
diff changeset
519 bool ref_p;
kono
parents: 67
diff changeset
520 bool this_ref_p;
kono
parents: 67
diff changeset
521 };
kono
parents: 67
diff changeset
522
kono
parents: 67
diff changeset
523 static int scc_entry_compare (const void *, const void *);
kono
parents: 67
diff changeset
524
kono
parents: 67
diff changeset
525 void DFS_write_tree_body (struct output_block *ob,
kono
parents: 67
diff changeset
526 tree expr, sccs *expr_state, bool ref_p);
kono
parents: 67
diff changeset
527
kono
parents: 67
diff changeset
528 void DFS_write_tree (struct output_block *ob, sccs *from_state,
kono
parents: 67
diff changeset
529 tree expr, bool ref_p, bool this_ref_p);
kono
parents: 67
diff changeset
530
kono
parents: 67
diff changeset
531 hashval_t
kono
parents: 67
diff changeset
532 hash_scc (struct output_block *ob, unsigned first, unsigned size,
kono
parents: 67
diff changeset
533 bool ref_p, bool this_ref_p);
kono
parents: 67
diff changeset
534
kono
parents: 67
diff changeset
535 hash_map<tree, sccs *> sccstate;
kono
parents: 67
diff changeset
536 vec<worklist> worklist_vec;
kono
parents: 67
diff changeset
537 struct obstack sccstate_obstack;
kono
parents: 67
diff changeset
538 };
kono
parents: 67
diff changeset
539
kono
parents: 67
diff changeset
540 /* Emit the physical representation of tree node EXPR to output block OB,
kono
parents: 67
diff changeset
541 using depth-first search on the subgraph. If THIS_REF_P is true, the
kono
parents: 67
diff changeset
542 leaves of EXPR are emitted as references via lto_output_tree_ref.
kono
parents: 67
diff changeset
543 REF_P is used for streaming siblings of EXPR. If SINGLE_P is true,
kono
parents: 67
diff changeset
544 this is for a rewalk of a single leaf SCC. */
kono
parents: 67
diff changeset
545
kono
parents: 67
diff changeset
546 DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
kono
parents: 67
diff changeset
547 bool single_p)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
548 {
111
kono
parents: 67
diff changeset
549 unsigned int next_dfs_num = 1;
kono
parents: 67
diff changeset
550 sccstack.create (0);
kono
parents: 67
diff changeset
551 gcc_obstack_init (&sccstate_obstack);
kono
parents: 67
diff changeset
552 worklist_vec = vNULL;
kono
parents: 67
diff changeset
553 DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p);
kono
parents: 67
diff changeset
554 while (!worklist_vec.is_empty ())
kono
parents: 67
diff changeset
555 {
kono
parents: 67
diff changeset
556 worklist &w = worklist_vec.last ();
kono
parents: 67
diff changeset
557 expr = w.expr;
kono
parents: 67
diff changeset
558 sccs *from_state = w.from_state;
kono
parents: 67
diff changeset
559 sccs *cstate = w.cstate;
kono
parents: 67
diff changeset
560 ref_p = w.ref_p;
kono
parents: 67
diff changeset
561 this_ref_p = w.this_ref_p;
kono
parents: 67
diff changeset
562 if (cstate == NULL)
kono
parents: 67
diff changeset
563 {
kono
parents: 67
diff changeset
564 sccs **slot = &sccstate.get_or_insert (expr);
kono
parents: 67
diff changeset
565 cstate = *slot;
kono
parents: 67
diff changeset
566 if (cstate)
kono
parents: 67
diff changeset
567 {
kono
parents: 67
diff changeset
568 gcc_checking_assert (from_state);
kono
parents: 67
diff changeset
569 if (cstate->dfsnum < from_state->dfsnum)
kono
parents: 67
diff changeset
570 from_state->low = MIN (cstate->dfsnum, from_state->low);
kono
parents: 67
diff changeset
571 worklist_vec.pop ();
kono
parents: 67
diff changeset
572 continue;
kono
parents: 67
diff changeset
573 }
kono
parents: 67
diff changeset
574
kono
parents: 67
diff changeset
575 scc_entry e = { expr, 0 };
kono
parents: 67
diff changeset
576 /* Not yet visited. DFS recurse and push it onto the stack. */
kono
parents: 67
diff changeset
577 *slot = cstate = XOBNEW (&sccstate_obstack, struct sccs);
kono
parents: 67
diff changeset
578 sccstack.safe_push (e);
kono
parents: 67
diff changeset
579 cstate->dfsnum = next_dfs_num++;
kono
parents: 67
diff changeset
580 cstate->low = cstate->dfsnum;
kono
parents: 67
diff changeset
581 w.cstate = cstate;
kono
parents: 67
diff changeset
582
kono
parents: 67
diff changeset
583 if (TREE_CODE (expr) == INTEGER_CST
kono
parents: 67
diff changeset
584 && !TREE_OVERFLOW (expr))
kono
parents: 67
diff changeset
585 DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p);
kono
parents: 67
diff changeset
586 else
kono
parents: 67
diff changeset
587 {
kono
parents: 67
diff changeset
588 DFS_write_tree_body (ob, expr, cstate, ref_p);
kono
parents: 67
diff changeset
589
kono
parents: 67
diff changeset
590 /* Walk any LTO-specific edges. */
kono
parents: 67
diff changeset
591 if (DECL_P (expr)
kono
parents: 67
diff changeset
592 && TREE_CODE (expr) != FUNCTION_DECL
kono
parents: 67
diff changeset
593 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
kono
parents: 67
diff changeset
594 {
kono
parents: 67
diff changeset
595 /* Handle DECL_INITIAL for symbols. */
kono
parents: 67
diff changeset
596 tree initial
kono
parents: 67
diff changeset
597 = get_symbol_initial_value (ob->decl_state->symtab_node_encoder,
kono
parents: 67
diff changeset
598 expr);
kono
parents: 67
diff changeset
599 DFS_write_tree (ob, cstate, initial, ref_p, ref_p);
kono
parents: 67
diff changeset
600 }
kono
parents: 67
diff changeset
601 }
kono
parents: 67
diff changeset
602 continue;
kono
parents: 67
diff changeset
603 }
kono
parents: 67
diff changeset
604
kono
parents: 67
diff changeset
605 /* See if we found an SCC. */
kono
parents: 67
diff changeset
606 if (cstate->low == cstate->dfsnum)
kono
parents: 67
diff changeset
607 {
kono
parents: 67
diff changeset
608 unsigned first, size;
kono
parents: 67
diff changeset
609 tree x;
kono
parents: 67
diff changeset
610
kono
parents: 67
diff changeset
611 /* If we are re-walking a single leaf SCC just pop it,
kono
parents: 67
diff changeset
612 let earlier worklist item access the sccstack. */
kono
parents: 67
diff changeset
613 if (single_p)
kono
parents: 67
diff changeset
614 {
kono
parents: 67
diff changeset
615 worklist_vec.pop ();
kono
parents: 67
diff changeset
616 continue;
kono
parents: 67
diff changeset
617 }
kono
parents: 67
diff changeset
618
kono
parents: 67
diff changeset
619 /* Pop the SCC and compute its size. */
kono
parents: 67
diff changeset
620 first = sccstack.length ();
kono
parents: 67
diff changeset
621 do
kono
parents: 67
diff changeset
622 {
kono
parents: 67
diff changeset
623 x = sccstack[--first].t;
kono
parents: 67
diff changeset
624 }
kono
parents: 67
diff changeset
625 while (x != expr);
kono
parents: 67
diff changeset
626 size = sccstack.length () - first;
kono
parents: 67
diff changeset
627
kono
parents: 67
diff changeset
628 /* No need to compute hashes for LTRANS units, we don't perform
kono
parents: 67
diff changeset
629 any merging there. */
kono
parents: 67
diff changeset
630 hashval_t scc_hash = 0;
kono
parents: 67
diff changeset
631 unsigned scc_entry_len = 0;
kono
parents: 67
diff changeset
632 if (!flag_wpa)
kono
parents: 67
diff changeset
633 {
kono
parents: 67
diff changeset
634 scc_hash = hash_scc (ob, first, size, ref_p, this_ref_p);
kono
parents: 67
diff changeset
635
kono
parents: 67
diff changeset
636 /* Put the entries with the least number of collisions first. */
kono
parents: 67
diff changeset
637 unsigned entry_start = 0;
kono
parents: 67
diff changeset
638 scc_entry_len = size + 1;
kono
parents: 67
diff changeset
639 for (unsigned i = 0; i < size;)
kono
parents: 67
diff changeset
640 {
kono
parents: 67
diff changeset
641 unsigned from = i;
kono
parents: 67
diff changeset
642 for (i = i + 1; i < size
kono
parents: 67
diff changeset
643 && (sccstack[first + i].hash
kono
parents: 67
diff changeset
644 == sccstack[first + from].hash); ++i)
kono
parents: 67
diff changeset
645 ;
kono
parents: 67
diff changeset
646 if (i - from < scc_entry_len)
kono
parents: 67
diff changeset
647 {
kono
parents: 67
diff changeset
648 scc_entry_len = i - from;
kono
parents: 67
diff changeset
649 entry_start = from;
kono
parents: 67
diff changeset
650 }
kono
parents: 67
diff changeset
651 }
kono
parents: 67
diff changeset
652 for (unsigned i = 0; i < scc_entry_len; ++i)
kono
parents: 67
diff changeset
653 std::swap (sccstack[first + i],
kono
parents: 67
diff changeset
654 sccstack[first + entry_start + i]);
kono
parents: 67
diff changeset
655
kono
parents: 67
diff changeset
656 /* We already sorted SCC deterministically in hash_scc. */
kono
parents: 67
diff changeset
657
kono
parents: 67
diff changeset
658 /* Check that we have only one SCC.
kono
parents: 67
diff changeset
659 Naturally we may have conflicts if hash function is not
kono
parents: 67
diff changeset
660 strong enough. Lets see how far this gets. */
kono
parents: 67
diff changeset
661 gcc_checking_assert (scc_entry_len == 1);
kono
parents: 67
diff changeset
662 }
kono
parents: 67
diff changeset
663
kono
parents: 67
diff changeset
664 /* Write LTO_tree_scc. */
kono
parents: 67
diff changeset
665 streamer_write_record_start (ob, LTO_tree_scc);
kono
parents: 67
diff changeset
666 streamer_write_uhwi (ob, size);
kono
parents: 67
diff changeset
667 streamer_write_uhwi (ob, scc_hash);
kono
parents: 67
diff changeset
668
kono
parents: 67
diff changeset
669 /* Write size-1 SCCs without wrapping them inside SCC bundles.
kono
parents: 67
diff changeset
670 All INTEGER_CSTs need to be handled this way as we need
kono
parents: 67
diff changeset
671 their type to materialize them. Also builtins are handled
kono
parents: 67
diff changeset
672 this way.
kono
parents: 67
diff changeset
673 ??? We still wrap these in LTO_tree_scc so at the
kono
parents: 67
diff changeset
674 input side we can properly identify the tree we want
kono
parents: 67
diff changeset
675 to ultimatively return. */
kono
parents: 67
diff changeset
676 if (size == 1)
kono
parents: 67
diff changeset
677 lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
kono
parents: 67
diff changeset
678 else
kono
parents: 67
diff changeset
679 {
kono
parents: 67
diff changeset
680 /* Write the size of the SCC entry candidates. */
kono
parents: 67
diff changeset
681 streamer_write_uhwi (ob, scc_entry_len);
kono
parents: 67
diff changeset
682
kono
parents: 67
diff changeset
683 /* Write all headers and populate the streamer cache. */
kono
parents: 67
diff changeset
684 for (unsigned i = 0; i < size; ++i)
kono
parents: 67
diff changeset
685 {
kono
parents: 67
diff changeset
686 hashval_t hash = sccstack[first+i].hash;
kono
parents: 67
diff changeset
687 tree t = sccstack[first+i].t;
kono
parents: 67
diff changeset
688 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
kono
parents: 67
diff changeset
689 t, hash, NULL);
kono
parents: 67
diff changeset
690 gcc_assert (!exists_p);
kono
parents: 67
diff changeset
691
kono
parents: 67
diff changeset
692 if (!lto_is_streamable (t))
kono
parents: 67
diff changeset
693 internal_error ("tree code %qs is not supported "
kono
parents: 67
diff changeset
694 "in LTO streams",
kono
parents: 67
diff changeset
695 get_tree_code_name (TREE_CODE (t)));
kono
parents: 67
diff changeset
696
kono
parents: 67
diff changeset
697 /* Write the header, containing everything needed to
kono
parents: 67
diff changeset
698 materialize EXPR on the reading side. */
kono
parents: 67
diff changeset
699 streamer_write_tree_header (ob, t);
kono
parents: 67
diff changeset
700 }
kono
parents: 67
diff changeset
701
kono
parents: 67
diff changeset
702 /* Write the bitpacks and tree references. */
kono
parents: 67
diff changeset
703 for (unsigned i = 0; i < size; ++i)
kono
parents: 67
diff changeset
704 {
kono
parents: 67
diff changeset
705 lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
kono
parents: 67
diff changeset
706
kono
parents: 67
diff changeset
707 /* Mark the end of the tree. */
kono
parents: 67
diff changeset
708 streamer_write_zero (ob);
kono
parents: 67
diff changeset
709 }
kono
parents: 67
diff changeset
710 }
kono
parents: 67
diff changeset
711
kono
parents: 67
diff changeset
712 /* Finally truncate the vector. */
kono
parents: 67
diff changeset
713 sccstack.truncate (first);
kono
parents: 67
diff changeset
714
kono
parents: 67
diff changeset
715 if (from_state)
kono
parents: 67
diff changeset
716 from_state->low = MIN (from_state->low, cstate->low);
kono
parents: 67
diff changeset
717 worklist_vec.pop ();
kono
parents: 67
diff changeset
718 continue;
kono
parents: 67
diff changeset
719 }
kono
parents: 67
diff changeset
720
kono
parents: 67
diff changeset
721 gcc_checking_assert (from_state);
kono
parents: 67
diff changeset
722 from_state->low = MIN (from_state->low, cstate->low);
kono
parents: 67
diff changeset
723 if (cstate->dfsnum < from_state->dfsnum)
kono
parents: 67
diff changeset
724 from_state->low = MIN (cstate->dfsnum, from_state->low);
kono
parents: 67
diff changeset
725 worklist_vec.pop ();
kono
parents: 67
diff changeset
726 }
kono
parents: 67
diff changeset
727 worklist_vec.release ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
728 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
729
111
kono
parents: 67
diff changeset
730 DFS::~DFS ()
kono
parents: 67
diff changeset
731 {
kono
parents: 67
diff changeset
732 sccstack.release ();
kono
parents: 67
diff changeset
733 obstack_free (&sccstate_obstack, NULL);
kono
parents: 67
diff changeset
734 }
kono
parents: 67
diff changeset
735
kono
parents: 67
diff changeset
736 /* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and
kono
parents: 67
diff changeset
737 DFS recurse for all tree edges originating from it. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
738
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
739 void
111
kono
parents: 67
diff changeset
740 DFS::DFS_write_tree_body (struct output_block *ob,
kono
parents: 67
diff changeset
741 tree expr, sccs *expr_state, bool ref_p)
kono
parents: 67
diff changeset
742 {
kono
parents: 67
diff changeset
743 #define DFS_follow_tree_edge(DEST) \
kono
parents: 67
diff changeset
744 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p)
kono
parents: 67
diff changeset
745
kono
parents: 67
diff changeset
746 enum tree_code code;
kono
parents: 67
diff changeset
747
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
748 if (streamer_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
749 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
750 print_node_brief (streamer_dump_file, " Streaming ",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
751 expr, 4);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
752 fprintf (streamer_dump_file, " to %s\n",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
753 lto_section_name [ob->section_type]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
754 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
755
111
kono
parents: 67
diff changeset
756 code = TREE_CODE (expr);
kono
parents: 67
diff changeset
757
kono
parents: 67
diff changeset
758 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
kono
parents: 67
diff changeset
759 {
kono
parents: 67
diff changeset
760 if (TREE_CODE (expr) != IDENTIFIER_NODE)
kono
parents: 67
diff changeset
761 DFS_follow_tree_edge (TREE_TYPE (expr));
kono
parents: 67
diff changeset
762 }
kono
parents: 67
diff changeset
763
kono
parents: 67
diff changeset
764 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
kono
parents: 67
diff changeset
765 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
766 unsigned int count = vector_cst_encoded_nelts (expr);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
767 for (unsigned int i = 0; i < count; ++i)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
768 DFS_follow_tree_edge (VECTOR_CST_ENCODED_ELT (expr, i));
111
kono
parents: 67
diff changeset
769 }
kono
parents: 67
diff changeset
770
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
771 if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
772 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
773 DFS_follow_tree_edge (POLY_INT_CST_COEFF (expr, i));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
774
111
kono
parents: 67
diff changeset
775 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
kono
parents: 67
diff changeset
776 {
kono
parents: 67
diff changeset
777 DFS_follow_tree_edge (TREE_REALPART (expr));
kono
parents: 67
diff changeset
778 DFS_follow_tree_edge (TREE_IMAGPART (expr));
kono
parents: 67
diff changeset
779 }
kono
parents: 67
diff changeset
780
kono
parents: 67
diff changeset
781 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
kono
parents: 67
diff changeset
782 {
kono
parents: 67
diff changeset
783 /* Drop names that were created for anonymous entities. */
kono
parents: 67
diff changeset
784 if (DECL_NAME (expr)
kono
parents: 67
diff changeset
785 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
kono
parents: 67
diff changeset
786 && anon_aggrname_p (DECL_NAME (expr)))
kono
parents: 67
diff changeset
787 ;
kono
parents: 67
diff changeset
788 else
kono
parents: 67
diff changeset
789 DFS_follow_tree_edge (DECL_NAME (expr));
kono
parents: 67
diff changeset
790 if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
kono
parents: 67
diff changeset
791 && ! DECL_CONTEXT (expr))
kono
parents: 67
diff changeset
792 DFS_follow_tree_edge ((*all_translation_units)[0]);
kono
parents: 67
diff changeset
793 else
kono
parents: 67
diff changeset
794 DFS_follow_tree_edge (DECL_CONTEXT (expr));
kono
parents: 67
diff changeset
795 }
kono
parents: 67
diff changeset
796
kono
parents: 67
diff changeset
797 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
kono
parents: 67
diff changeset
798 {
kono
parents: 67
diff changeset
799 DFS_follow_tree_edge (DECL_SIZE (expr));
kono
parents: 67
diff changeset
800 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr));
kono
parents: 67
diff changeset
801
kono
parents: 67
diff changeset
802 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
kono
parents: 67
diff changeset
803 special handling in LTO, it must be handled by streamer hooks. */
kono
parents: 67
diff changeset
804
kono
parents: 67
diff changeset
805 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr));
kono
parents: 67
diff changeset
806
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
807 /* We use DECL_ABSTRACT_ORIGIN == error_mark_node to mark
111
kono
parents: 67
diff changeset
808 declarations which should be eliminated by decl merging. Be sure none
kono
parents: 67
diff changeset
809 leaks to this point. */
kono
parents: 67
diff changeset
810 gcc_assert (DECL_ABSTRACT_ORIGIN (expr) != error_mark_node);
kono
parents: 67
diff changeset
811 DFS_follow_tree_edge (DECL_ABSTRACT_ORIGIN (expr));
kono
parents: 67
diff changeset
812
kono
parents: 67
diff changeset
813 if ((VAR_P (expr)
kono
parents: 67
diff changeset
814 || TREE_CODE (expr) == PARM_DECL)
kono
parents: 67
diff changeset
815 && DECL_HAS_VALUE_EXPR_P (expr))
kono
parents: 67
diff changeset
816 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
817 if (VAR_P (expr)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
818 && DECL_HAS_DEBUG_EXPR_P (expr))
111
kono
parents: 67
diff changeset
819 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr));
kono
parents: 67
diff changeset
820 }
kono
parents: 67
diff changeset
821
kono
parents: 67
diff changeset
822 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
kono
parents: 67
diff changeset
823 {
kono
parents: 67
diff changeset
824 /* Make sure we don't inadvertently set the assembler name. */
kono
parents: 67
diff changeset
825 if (DECL_ASSEMBLER_NAME_SET_P (expr))
kono
parents: 67
diff changeset
826 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr));
kono
parents: 67
diff changeset
827 }
kono
parents: 67
diff changeset
828
kono
parents: 67
diff changeset
829 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
kono
parents: 67
diff changeset
830 {
kono
parents: 67
diff changeset
831 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr));
kono
parents: 67
diff changeset
832 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr));
kono
parents: 67
diff changeset
833 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr));
kono
parents: 67
diff changeset
834 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
835 gcc_checking_assert (!DECL_FCONTEXT (expr));
111
kono
parents: 67
diff changeset
836 }
kono
parents: 67
diff changeset
837
kono
parents: 67
diff changeset
838 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
kono
parents: 67
diff changeset
839 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
840 gcc_checking_assert (DECL_VINDEX (expr) == NULL);
111
kono
parents: 67
diff changeset
841 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
kono
parents: 67
diff changeset
842 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_TARGET (expr));
kono
parents: 67
diff changeset
843 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
kono
parents: 67
diff changeset
844 }
kono
parents: 67
diff changeset
845
kono
parents: 67
diff changeset
846 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
kono
parents: 67
diff changeset
847 {
kono
parents: 67
diff changeset
848 DFS_follow_tree_edge (TYPE_SIZE (expr));
kono
parents: 67
diff changeset
849 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr));
kono
parents: 67
diff changeset
850 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr));
kono
parents: 67
diff changeset
851 DFS_follow_tree_edge (TYPE_NAME (expr));
kono
parents: 67
diff changeset
852 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
kono
parents: 67
diff changeset
853 reconstructed during fixup. */
kono
parents: 67
diff changeset
854 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
kono
parents: 67
diff changeset
855 during fixup. */
kono
parents: 67
diff changeset
856 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr));
kono
parents: 67
diff changeset
857 DFS_follow_tree_edge (TYPE_CONTEXT (expr));
kono
parents: 67
diff changeset
858 /* TYPE_CANONICAL is re-computed during type merging, so no need
kono
parents: 67
diff changeset
859 to follow it here. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
860 /* Do not stream TYPE_STUB_DECL; it is not needed by LTO but currently
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
861 it can not be freed by free_lang_data without triggering ICEs in
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
862 langhooks. */
111
kono
parents: 67
diff changeset
863 }
kono
parents: 67
diff changeset
864
kono
parents: 67
diff changeset
865 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
kono
parents: 67
diff changeset
866 {
kono
parents: 67
diff changeset
867 if (TREE_CODE (expr) == ENUMERAL_TYPE)
kono
parents: 67
diff changeset
868 DFS_follow_tree_edge (TYPE_VALUES (expr));
kono
parents: 67
diff changeset
869 else if (TREE_CODE (expr) == ARRAY_TYPE)
kono
parents: 67
diff changeset
870 DFS_follow_tree_edge (TYPE_DOMAIN (expr));
kono
parents: 67
diff changeset
871 else if (RECORD_OR_UNION_TYPE_P (expr))
kono
parents: 67
diff changeset
872 for (tree t = TYPE_FIELDS (expr); t; t = TREE_CHAIN (t))
kono
parents: 67
diff changeset
873 DFS_follow_tree_edge (t);
kono
parents: 67
diff changeset
874 else if (TREE_CODE (expr) == FUNCTION_TYPE
kono
parents: 67
diff changeset
875 || TREE_CODE (expr) == METHOD_TYPE)
kono
parents: 67
diff changeset
876 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr));
kono
parents: 67
diff changeset
877
kono
parents: 67
diff changeset
878 if (!POINTER_TYPE_P (expr))
kono
parents: 67
diff changeset
879 DFS_follow_tree_edge (TYPE_MIN_VALUE_RAW (expr));
kono
parents: 67
diff changeset
880 DFS_follow_tree_edge (TYPE_MAX_VALUE_RAW (expr));
kono
parents: 67
diff changeset
881 }
kono
parents: 67
diff changeset
882
kono
parents: 67
diff changeset
883 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
kono
parents: 67
diff changeset
884 {
kono
parents: 67
diff changeset
885 DFS_follow_tree_edge (TREE_PURPOSE (expr));
kono
parents: 67
diff changeset
886 DFS_follow_tree_edge (TREE_VALUE (expr));
kono
parents: 67
diff changeset
887 DFS_follow_tree_edge (TREE_CHAIN (expr));
kono
parents: 67
diff changeset
888 }
kono
parents: 67
diff changeset
889
kono
parents: 67
diff changeset
890 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
kono
parents: 67
diff changeset
891 {
kono
parents: 67
diff changeset
892 for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
kono
parents: 67
diff changeset
893 DFS_follow_tree_edge (TREE_VEC_ELT (expr, i));
kono
parents: 67
diff changeset
894 }
kono
parents: 67
diff changeset
895
kono
parents: 67
diff changeset
896 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
kono
parents: 67
diff changeset
897 {
kono
parents: 67
diff changeset
898 for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
kono
parents: 67
diff changeset
899 DFS_follow_tree_edge (TREE_OPERAND (expr, i));
kono
parents: 67
diff changeset
900 DFS_follow_tree_edge (TREE_BLOCK (expr));
kono
parents: 67
diff changeset
901 }
kono
parents: 67
diff changeset
902
kono
parents: 67
diff changeset
903 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
kono
parents: 67
diff changeset
904 {
kono
parents: 67
diff changeset
905 for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
906 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
907 /* We would have to stream externals in the block chain as
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
908 non-references but we should have dropped them in
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
909 free-lang-data. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
910 gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
111
kono
parents: 67
diff changeset
911 DFS_follow_tree_edge (t);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
912 }
111
kono
parents: 67
diff changeset
913
kono
parents: 67
diff changeset
914 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
915 DFS_follow_tree_edge (BLOCK_ABSTRACT_ORIGIN (expr));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
916
111
kono
parents: 67
diff changeset
917 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
kono
parents: 67
diff changeset
918 information for early inlined BLOCKs so drop it on the floor instead
kono
parents: 67
diff changeset
919 of ICEing in dwarf2out.c. */
kono
parents: 67
diff changeset
920
kono
parents: 67
diff changeset
921 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
kono
parents: 67
diff changeset
922 streaming time. */
kono
parents: 67
diff changeset
923
kono
parents: 67
diff changeset
924 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
kono
parents: 67
diff changeset
925 list is re-constructed from BLOCK_SUPERCONTEXT. */
kono
parents: 67
diff changeset
926 }
kono
parents: 67
diff changeset
927
kono
parents: 67
diff changeset
928 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
kono
parents: 67
diff changeset
929 {
kono
parents: 67
diff changeset
930 unsigned i;
kono
parents: 67
diff changeset
931 tree t;
kono
parents: 67
diff changeset
932
kono
parents: 67
diff changeset
933 /* Note that the number of BINFO slots has already been emitted in
kono
parents: 67
diff changeset
934 EXPR's header (see streamer_write_tree_header) because this length
kono
parents: 67
diff changeset
935 is needed to build the empty BINFO node on the reader side. */
kono
parents: 67
diff changeset
936 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
kono
parents: 67
diff changeset
937 DFS_follow_tree_edge (t);
kono
parents: 67
diff changeset
938 DFS_follow_tree_edge (BINFO_OFFSET (expr));
kono
parents: 67
diff changeset
939 DFS_follow_tree_edge (BINFO_VTABLE (expr));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
940
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
941 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
942 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
943 by C++ FE only. */
111
kono
parents: 67
diff changeset
944 }
kono
parents: 67
diff changeset
945
kono
parents: 67
diff changeset
946 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
kono
parents: 67
diff changeset
947 {
kono
parents: 67
diff changeset
948 unsigned i;
kono
parents: 67
diff changeset
949 tree index, value;
kono
parents: 67
diff changeset
950
kono
parents: 67
diff changeset
951 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
kono
parents: 67
diff changeset
952 {
kono
parents: 67
diff changeset
953 DFS_follow_tree_edge (index);
kono
parents: 67
diff changeset
954 DFS_follow_tree_edge (value);
kono
parents: 67
diff changeset
955 }
kono
parents: 67
diff changeset
956 }
kono
parents: 67
diff changeset
957
kono
parents: 67
diff changeset
958 if (code == OMP_CLAUSE)
kono
parents: 67
diff changeset
959 {
kono
parents: 67
diff changeset
960 int i;
kono
parents: 67
diff changeset
961 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
kono
parents: 67
diff changeset
962 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i));
kono
parents: 67
diff changeset
963 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr));
kono
parents: 67
diff changeset
964 }
kono
parents: 67
diff changeset
965
kono
parents: 67
diff changeset
966 #undef DFS_follow_tree_edge
kono
parents: 67
diff changeset
967 }
kono
parents: 67
diff changeset
968
kono
parents: 67
diff changeset
969 /* Return a hash value for the tree T.
kono
parents: 67
diff changeset
970 CACHE holds hash values of trees outside current SCC. MAP, if non-NULL,
kono
parents: 67
diff changeset
971 may hold hash values if trees inside current SCC. */
kono
parents: 67
diff changeset
972
kono
parents: 67
diff changeset
973 static hashval_t
kono
parents: 67
diff changeset
974 hash_tree (struct streamer_tree_cache_d *cache, hash_map<tree, hashval_t> *map, tree t)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
975 {
111
kono
parents: 67
diff changeset
976 inchash::hash hstate;
kono
parents: 67
diff changeset
977
kono
parents: 67
diff changeset
978 #define visit(SIBLING) \
kono
parents: 67
diff changeset
979 do { \
kono
parents: 67
diff changeset
980 unsigned ix; \
kono
parents: 67
diff changeset
981 if (!SIBLING) \
kono
parents: 67
diff changeset
982 hstate.add_int (0); \
kono
parents: 67
diff changeset
983 else if (streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
kono
parents: 67
diff changeset
984 hstate.add_int (streamer_tree_cache_get_hash (cache, ix)); \
kono
parents: 67
diff changeset
985 else if (map) \
kono
parents: 67
diff changeset
986 hstate.add_int (*map->get (SIBLING)); \
kono
parents: 67
diff changeset
987 else \
kono
parents: 67
diff changeset
988 hstate.add_int (1); \
kono
parents: 67
diff changeset
989 } while (0)
kono
parents: 67
diff changeset
990
kono
parents: 67
diff changeset
991 /* Hash TS_BASE. */
kono
parents: 67
diff changeset
992 enum tree_code code = TREE_CODE (t);
kono
parents: 67
diff changeset
993 hstate.add_int (code);
kono
parents: 67
diff changeset
994 if (!TYPE_P (t))
kono
parents: 67
diff changeset
995 {
kono
parents: 67
diff changeset
996 hstate.add_flag (TREE_SIDE_EFFECTS (t));
kono
parents: 67
diff changeset
997 hstate.add_flag (TREE_CONSTANT (t));
kono
parents: 67
diff changeset
998 hstate.add_flag (TREE_READONLY (t));
kono
parents: 67
diff changeset
999 hstate.add_flag (TREE_PUBLIC (t));
kono
parents: 67
diff changeset
1000 }
kono
parents: 67
diff changeset
1001 hstate.add_flag (TREE_ADDRESSABLE (t));
kono
parents: 67
diff changeset
1002 hstate.add_flag (TREE_THIS_VOLATILE (t));
kono
parents: 67
diff changeset
1003 if (DECL_P (t))
kono
parents: 67
diff changeset
1004 hstate.add_flag (DECL_UNSIGNED (t));
kono
parents: 67
diff changeset
1005 else if (TYPE_P (t))
kono
parents: 67
diff changeset
1006 hstate.add_flag (TYPE_UNSIGNED (t));
kono
parents: 67
diff changeset
1007 if (TYPE_P (t))
kono
parents: 67
diff changeset
1008 hstate.add_flag (TYPE_ARTIFICIAL (t));
kono
parents: 67
diff changeset
1009 else
kono
parents: 67
diff changeset
1010 hstate.add_flag (TREE_NO_WARNING (t));
kono
parents: 67
diff changeset
1011 hstate.add_flag (TREE_NOTHROW (t));
kono
parents: 67
diff changeset
1012 hstate.add_flag (TREE_STATIC (t));
kono
parents: 67
diff changeset
1013 hstate.add_flag (TREE_PROTECTED (t));
kono
parents: 67
diff changeset
1014 hstate.add_flag (TREE_DEPRECATED (t));
kono
parents: 67
diff changeset
1015 if (code != TREE_BINFO)
kono
parents: 67
diff changeset
1016 hstate.add_flag (TREE_PRIVATE (t));
kono
parents: 67
diff changeset
1017 if (TYPE_P (t))
kono
parents: 67
diff changeset
1018 {
kono
parents: 67
diff changeset
1019 hstate.add_flag (AGGREGATE_TYPE_P (t)
kono
parents: 67
diff changeset
1020 ? TYPE_REVERSE_STORAGE_ORDER (t) : TYPE_SATURATING (t));
kono
parents: 67
diff changeset
1021 hstate.add_flag (TYPE_ADDR_SPACE (t));
kono
parents: 67
diff changeset
1022 }
kono
parents: 67
diff changeset
1023 else if (code == SSA_NAME)
kono
parents: 67
diff changeset
1024 hstate.add_flag (SSA_NAME_IS_DEFAULT_DEF (t));
kono
parents: 67
diff changeset
1025 hstate.commit_flag ();
kono
parents: 67
diff changeset
1026
kono
parents: 67
diff changeset
1027 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
kono
parents: 67
diff changeset
1028 hstate.add_wide_int (wi::to_widest (t));
kono
parents: 67
diff changeset
1029
kono
parents: 67
diff changeset
1030 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
kono
parents: 67
diff changeset
1031 {
kono
parents: 67
diff changeset
1032 REAL_VALUE_TYPE r = TREE_REAL_CST (t);
kono
parents: 67
diff changeset
1033 hstate.add_flag (r.cl);
kono
parents: 67
diff changeset
1034 hstate.add_flag (r.sign);
kono
parents: 67
diff changeset
1035 hstate.add_flag (r.signalling);
kono
parents: 67
diff changeset
1036 hstate.add_flag (r.canonical);
kono
parents: 67
diff changeset
1037 hstate.commit_flag ();
kono
parents: 67
diff changeset
1038 hstate.add_int (r.uexp);
kono
parents: 67
diff changeset
1039 hstate.add (r.sig, sizeof (r.sig));
kono
parents: 67
diff changeset
1040 }
kono
parents: 67
diff changeset
1041
kono
parents: 67
diff changeset
1042 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
kono
parents: 67
diff changeset
1043 {
kono
parents: 67
diff changeset
1044 FIXED_VALUE_TYPE f = TREE_FIXED_CST (t);
kono
parents: 67
diff changeset
1045 hstate.add_int (f.mode);
kono
parents: 67
diff changeset
1046 hstate.add_int (f.data.low);
kono
parents: 67
diff changeset
1047 hstate.add_int (f.data.high);
kono
parents: 67
diff changeset
1048 }
kono
parents: 67
diff changeset
1049
kono
parents: 67
diff changeset
1050 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
kono
parents: 67
diff changeset
1051 {
kono
parents: 67
diff changeset
1052 hstate.add_hwi (DECL_MODE (t));
kono
parents: 67
diff changeset
1053 hstate.add_flag (DECL_NONLOCAL (t));
kono
parents: 67
diff changeset
1054 hstate.add_flag (DECL_VIRTUAL_P (t));
kono
parents: 67
diff changeset
1055 hstate.add_flag (DECL_IGNORED_P (t));
kono
parents: 67
diff changeset
1056 hstate.add_flag (DECL_ABSTRACT_P (t));
kono
parents: 67
diff changeset
1057 hstate.add_flag (DECL_ARTIFICIAL (t));
kono
parents: 67
diff changeset
1058 hstate.add_flag (DECL_USER_ALIGN (t));
kono
parents: 67
diff changeset
1059 hstate.add_flag (DECL_PRESERVE_P (t));
kono
parents: 67
diff changeset
1060 hstate.add_flag (DECL_EXTERNAL (t));
kono
parents: 67
diff changeset
1061 hstate.add_flag (DECL_GIMPLE_REG_P (t));
kono
parents: 67
diff changeset
1062 hstate.commit_flag ();
kono
parents: 67
diff changeset
1063 hstate.add_int (DECL_ALIGN (t));
kono
parents: 67
diff changeset
1064 if (code == LABEL_DECL)
kono
parents: 67
diff changeset
1065 {
kono
parents: 67
diff changeset
1066 hstate.add_int (EH_LANDING_PAD_NR (t));
kono
parents: 67
diff changeset
1067 hstate.add_int (LABEL_DECL_UID (t));
kono
parents: 67
diff changeset
1068 }
kono
parents: 67
diff changeset
1069 else if (code == FIELD_DECL)
kono
parents: 67
diff changeset
1070 {
kono
parents: 67
diff changeset
1071 hstate.add_flag (DECL_PACKED (t));
kono
parents: 67
diff changeset
1072 hstate.add_flag (DECL_NONADDRESSABLE_P (t));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1073 hstate.add_flag (DECL_PADDING_P (t));
111
kono
parents: 67
diff changeset
1074 hstate.add_int (DECL_OFFSET_ALIGN (t));
kono
parents: 67
diff changeset
1075 }
kono
parents: 67
diff changeset
1076 else if (code == VAR_DECL)
kono
parents: 67
diff changeset
1077 {
kono
parents: 67
diff changeset
1078 hstate.add_flag (DECL_HAS_DEBUG_EXPR_P (t));
kono
parents: 67
diff changeset
1079 hstate.add_flag (DECL_NONLOCAL_FRAME (t));
kono
parents: 67
diff changeset
1080 }
kono
parents: 67
diff changeset
1081 if (code == RESULT_DECL
kono
parents: 67
diff changeset
1082 || code == PARM_DECL
kono
parents: 67
diff changeset
1083 || code == VAR_DECL)
kono
parents: 67
diff changeset
1084 {
kono
parents: 67
diff changeset
1085 hstate.add_flag (DECL_BY_REFERENCE (t));
kono
parents: 67
diff changeset
1086 if (code == VAR_DECL
kono
parents: 67
diff changeset
1087 || code == PARM_DECL)
kono
parents: 67
diff changeset
1088 hstate.add_flag (DECL_HAS_VALUE_EXPR_P (t));
kono
parents: 67
diff changeset
1089 }
kono
parents: 67
diff changeset
1090 hstate.commit_flag ();
kono
parents: 67
diff changeset
1091 }
kono
parents: 67
diff changeset
1092
kono
parents: 67
diff changeset
1093 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
kono
parents: 67
diff changeset
1094 hstate.add_int (DECL_REGISTER (t));
kono
parents: 67
diff changeset
1095
kono
parents: 67
diff changeset
1096 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
kono
parents: 67
diff changeset
1097 {
kono
parents: 67
diff changeset
1098 hstate.add_flag (DECL_COMMON (t));
kono
parents: 67
diff changeset
1099 hstate.add_flag (DECL_DLLIMPORT_P (t));
kono
parents: 67
diff changeset
1100 hstate.add_flag (DECL_WEAK (t));
kono
parents: 67
diff changeset
1101 hstate.add_flag (DECL_SEEN_IN_BIND_EXPR_P (t));
kono
parents: 67
diff changeset
1102 hstate.add_flag (DECL_COMDAT (t));
kono
parents: 67
diff changeset
1103 hstate.add_flag (DECL_VISIBILITY_SPECIFIED (t));
kono
parents: 67
diff changeset
1104 hstate.add_int (DECL_VISIBILITY (t));
kono
parents: 67
diff changeset
1105 if (code == VAR_DECL)
kono
parents: 67
diff changeset
1106 {
kono
parents: 67
diff changeset
1107 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
kono
parents: 67
diff changeset
1108 hstate.add_flag (DECL_HARD_REGISTER (t));
kono
parents: 67
diff changeset
1109 hstate.add_flag (DECL_IN_CONSTANT_POOL (t));
kono
parents: 67
diff changeset
1110 }
kono
parents: 67
diff changeset
1111 if (TREE_CODE (t) == FUNCTION_DECL)
kono
parents: 67
diff changeset
1112 {
kono
parents: 67
diff changeset
1113 hstate.add_flag (DECL_FINAL_P (t));
kono
parents: 67
diff changeset
1114 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (t));
kono
parents: 67
diff changeset
1115 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (t));
kono
parents: 67
diff changeset
1116 }
kono
parents: 67
diff changeset
1117 hstate.commit_flag ();
kono
parents: 67
diff changeset
1118 }
kono
parents: 67
diff changeset
1119
kono
parents: 67
diff changeset
1120 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
kono
parents: 67
diff changeset
1121 {
kono
parents: 67
diff changeset
1122 hstate.add_int (DECL_BUILT_IN_CLASS (t));
kono
parents: 67
diff changeset
1123 hstate.add_flag (DECL_STATIC_CONSTRUCTOR (t));
kono
parents: 67
diff changeset
1124 hstate.add_flag (DECL_STATIC_DESTRUCTOR (t));
kono
parents: 67
diff changeset
1125 hstate.add_flag (DECL_UNINLINABLE (t));
kono
parents: 67
diff changeset
1126 hstate.add_flag (DECL_POSSIBLY_INLINED (t));
kono
parents: 67
diff changeset
1127 hstate.add_flag (DECL_IS_NOVOPS (t));
kono
parents: 67
diff changeset
1128 hstate.add_flag (DECL_IS_RETURNS_TWICE (t));
kono
parents: 67
diff changeset
1129 hstate.add_flag (DECL_IS_MALLOC (t));
kono
parents: 67
diff changeset
1130 hstate.add_flag (DECL_IS_OPERATOR_NEW (t));
kono
parents: 67
diff changeset
1131 hstate.add_flag (DECL_DECLARED_INLINE_P (t));
kono
parents: 67
diff changeset
1132 hstate.add_flag (DECL_STATIC_CHAIN (t));
kono
parents: 67
diff changeset
1133 hstate.add_flag (DECL_NO_INLINE_WARNING_P (t));
kono
parents: 67
diff changeset
1134 hstate.add_flag (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t));
kono
parents: 67
diff changeset
1135 hstate.add_flag (DECL_NO_LIMIT_STACK (t));
kono
parents: 67
diff changeset
1136 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (t));
kono
parents: 67
diff changeset
1137 hstate.add_flag (DECL_PURE_P (t));
kono
parents: 67
diff changeset
1138 hstate.add_flag (DECL_LOOPING_CONST_OR_PURE_P (t));
kono
parents: 67
diff changeset
1139 hstate.commit_flag ();
kono
parents: 67
diff changeset
1140 if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
kono
parents: 67
diff changeset
1141 hstate.add_int (DECL_FUNCTION_CODE (t));
kono
parents: 67
diff changeset
1142 }
kono
parents: 67
diff changeset
1143
kono
parents: 67
diff changeset
1144 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
kono
parents: 67
diff changeset
1145 {
kono
parents: 67
diff changeset
1146 hstate.add_hwi (TYPE_MODE (t));
kono
parents: 67
diff changeset
1147 hstate.add_flag (TYPE_STRING_FLAG (t));
kono
parents: 67
diff changeset
1148 /* TYPE_NO_FORCE_BLK is private to stor-layout and need
kono
parents: 67
diff changeset
1149 no streaming. */
kono
parents: 67
diff changeset
1150 hstate.add_flag (TYPE_NEEDS_CONSTRUCTING (t));
kono
parents: 67
diff changeset
1151 hstate.add_flag (TYPE_PACKED (t));
kono
parents: 67
diff changeset
1152 hstate.add_flag (TYPE_RESTRICT (t));
kono
parents: 67
diff changeset
1153 hstate.add_flag (TYPE_USER_ALIGN (t));
kono
parents: 67
diff changeset
1154 hstate.add_flag (TYPE_READONLY (t));
kono
parents: 67
diff changeset
1155 if (RECORD_OR_UNION_TYPE_P (t))
kono
parents: 67
diff changeset
1156 {
kono
parents: 67
diff changeset
1157 hstate.add_flag (TYPE_TRANSPARENT_AGGR (t));
kono
parents: 67
diff changeset
1158 hstate.add_flag (TYPE_FINAL_P (t));
kono
parents: 67
diff changeset
1159 }
kono
parents: 67
diff changeset
1160 else if (code == ARRAY_TYPE)
kono
parents: 67
diff changeset
1161 hstate.add_flag (TYPE_NONALIASED_COMPONENT (t));
kono
parents: 67
diff changeset
1162 if (AGGREGATE_TYPE_P (t))
kono
parents: 67
diff changeset
1163 hstate.add_flag (TYPE_TYPELESS_STORAGE (t));
kono
parents: 67
diff changeset
1164 hstate.commit_flag ();
kono
parents: 67
diff changeset
1165 hstate.add_int (TYPE_PRECISION (t));
kono
parents: 67
diff changeset
1166 hstate.add_int (TYPE_ALIGN (t));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1167 hstate.add_int (TYPE_EMPTY_P (t));
111
kono
parents: 67
diff changeset
1168 }
kono
parents: 67
diff changeset
1169
kono
parents: 67
diff changeset
1170 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
kono
parents: 67
diff changeset
1171 hstate.add (TRANSLATION_UNIT_LANGUAGE (t),
kono
parents: 67
diff changeset
1172 strlen (TRANSLATION_UNIT_LANGUAGE (t)));
kono
parents: 67
diff changeset
1173
kono
parents: 67
diff changeset
1174 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
kono
parents: 67
diff changeset
1175 /* We don't stream these when passing things to a different target. */
kono
parents: 67
diff changeset
1176 && !lto_stream_offload_p)
kono
parents: 67
diff changeset
1177 hstate.add_hwi (cl_target_option_hash (TREE_TARGET_OPTION (t)));
kono
parents: 67
diff changeset
1178
kono
parents: 67
diff changeset
1179 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
kono
parents: 67
diff changeset
1180 hstate.add_hwi (cl_optimization_hash (TREE_OPTIMIZATION (t)));
kono
parents: 67
diff changeset
1181
kono
parents: 67
diff changeset
1182 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
kono
parents: 67
diff changeset
1183 hstate.merge_hash (IDENTIFIER_HASH_VALUE (t));
kono
parents: 67
diff changeset
1184
kono
parents: 67
diff changeset
1185 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
kono
parents: 67
diff changeset
1186 hstate.add (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t));
kono
parents: 67
diff changeset
1187
kono
parents: 67
diff changeset
1188 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
kono
parents: 67
diff changeset
1189 {
kono
parents: 67
diff changeset
1190 if (code != IDENTIFIER_NODE)
kono
parents: 67
diff changeset
1191 visit (TREE_TYPE (t));
kono
parents: 67
diff changeset
1192 }
kono
parents: 67
diff changeset
1193
kono
parents: 67
diff changeset
1194 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1195 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1196 unsigned int count = vector_cst_encoded_nelts (t);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1197 for (unsigned int i = 0; i < count; ++i)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1198 visit (VECTOR_CST_ENCODED_ELT (t, i));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1199 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1200
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1201 if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1202 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1203 visit (POLY_INT_CST_COEFF (t, i));
111
kono
parents: 67
diff changeset
1204
kono
parents: 67
diff changeset
1205 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
kono
parents: 67
diff changeset
1206 {
kono
parents: 67
diff changeset
1207 visit (TREE_REALPART (t));
kono
parents: 67
diff changeset
1208 visit (TREE_IMAGPART (t));
kono
parents: 67
diff changeset
1209 }
kono
parents: 67
diff changeset
1210
kono
parents: 67
diff changeset
1211 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
kono
parents: 67
diff changeset
1212 {
kono
parents: 67
diff changeset
1213 /* Drop names that were created for anonymous entities. */
kono
parents: 67
diff changeset
1214 if (DECL_NAME (t)
kono
parents: 67
diff changeset
1215 && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
kono
parents: 67
diff changeset
1216 && anon_aggrname_p (DECL_NAME (t)))
kono
parents: 67
diff changeset
1217 ;
kono
parents: 67
diff changeset
1218 else
kono
parents: 67
diff changeset
1219 visit (DECL_NAME (t));
kono
parents: 67
diff changeset
1220 if (DECL_FILE_SCOPE_P (t))
kono
parents: 67
diff changeset
1221 ;
kono
parents: 67
diff changeset
1222 else
kono
parents: 67
diff changeset
1223 visit (DECL_CONTEXT (t));
kono
parents: 67
diff changeset
1224 }
kono
parents: 67
diff changeset
1225
kono
parents: 67
diff changeset
1226 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
kono
parents: 67
diff changeset
1227 {
kono
parents: 67
diff changeset
1228 visit (DECL_SIZE (t));
kono
parents: 67
diff changeset
1229 visit (DECL_SIZE_UNIT (t));
kono
parents: 67
diff changeset
1230 visit (DECL_ATTRIBUTES (t));
kono
parents: 67
diff changeset
1231 if ((code == VAR_DECL
kono
parents: 67
diff changeset
1232 || code == PARM_DECL)
kono
parents: 67
diff changeset
1233 && DECL_HAS_VALUE_EXPR_P (t))
kono
parents: 67
diff changeset
1234 visit (DECL_VALUE_EXPR (t));
kono
parents: 67
diff changeset
1235 if (code == VAR_DECL
kono
parents: 67
diff changeset
1236 && DECL_HAS_DEBUG_EXPR_P (t))
kono
parents: 67
diff changeset
1237 visit (DECL_DEBUG_EXPR (t));
kono
parents: 67
diff changeset
1238 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
kono
parents: 67
diff changeset
1239 be able to call get_symbol_initial_value. */
kono
parents: 67
diff changeset
1240 }
kono
parents: 67
diff changeset
1241
kono
parents: 67
diff changeset
1242 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
kono
parents: 67
diff changeset
1243 {
kono
parents: 67
diff changeset
1244 if (DECL_ASSEMBLER_NAME_SET_P (t))
kono
parents: 67
diff changeset
1245 visit (DECL_ASSEMBLER_NAME (t));
kono
parents: 67
diff changeset
1246 }
kono
parents: 67
diff changeset
1247
kono
parents: 67
diff changeset
1248 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
kono
parents: 67
diff changeset
1249 {
kono
parents: 67
diff changeset
1250 visit (DECL_FIELD_OFFSET (t));
kono
parents: 67
diff changeset
1251 visit (DECL_BIT_FIELD_TYPE (t));
kono
parents: 67
diff changeset
1252 visit (DECL_BIT_FIELD_REPRESENTATIVE (t));
kono
parents: 67
diff changeset
1253 visit (DECL_FIELD_BIT_OFFSET (t));
kono
parents: 67
diff changeset
1254 }
kono
parents: 67
diff changeset
1255
kono
parents: 67
diff changeset
1256 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
kono
parents: 67
diff changeset
1257 {
kono
parents: 67
diff changeset
1258 visit (DECL_FUNCTION_PERSONALITY (t));
kono
parents: 67
diff changeset
1259 visit (DECL_FUNCTION_SPECIFIC_TARGET (t));
kono
parents: 67
diff changeset
1260 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
kono
parents: 67
diff changeset
1261 }
kono
parents: 67
diff changeset
1262
kono
parents: 67
diff changeset
1263 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
kono
parents: 67
diff changeset
1264 {
kono
parents: 67
diff changeset
1265 visit (TYPE_SIZE (t));
kono
parents: 67
diff changeset
1266 visit (TYPE_SIZE_UNIT (t));
kono
parents: 67
diff changeset
1267 visit (TYPE_ATTRIBUTES (t));
kono
parents: 67
diff changeset
1268 visit (TYPE_NAME (t));
kono
parents: 67
diff changeset
1269 visit (TYPE_MAIN_VARIANT (t));
kono
parents: 67
diff changeset
1270 if (TYPE_FILE_SCOPE_P (t))
kono
parents: 67
diff changeset
1271 ;
kono
parents: 67
diff changeset
1272 else
kono
parents: 67
diff changeset
1273 visit (TYPE_CONTEXT (t));
kono
parents: 67
diff changeset
1274 }
kono
parents: 67
diff changeset
1275
kono
parents: 67
diff changeset
1276 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
kono
parents: 67
diff changeset
1277 {
kono
parents: 67
diff changeset
1278 if (code == ENUMERAL_TYPE)
kono
parents: 67
diff changeset
1279 visit (TYPE_VALUES (t));
kono
parents: 67
diff changeset
1280 else if (code == ARRAY_TYPE)
kono
parents: 67
diff changeset
1281 visit (TYPE_DOMAIN (t));
kono
parents: 67
diff changeset
1282 else if (RECORD_OR_UNION_TYPE_P (t))
kono
parents: 67
diff changeset
1283 for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
kono
parents: 67
diff changeset
1284 visit (f);
kono
parents: 67
diff changeset
1285 else if (code == FUNCTION_TYPE
kono
parents: 67
diff changeset
1286 || code == METHOD_TYPE)
kono
parents: 67
diff changeset
1287 visit (TYPE_ARG_TYPES (t));
kono
parents: 67
diff changeset
1288 if (!POINTER_TYPE_P (t))
kono
parents: 67
diff changeset
1289 visit (TYPE_MIN_VALUE_RAW (t));
kono
parents: 67
diff changeset
1290 visit (TYPE_MAX_VALUE_RAW (t));
kono
parents: 67
diff changeset
1291 }
kono
parents: 67
diff changeset
1292
kono
parents: 67
diff changeset
1293 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
kono
parents: 67
diff changeset
1294 {
kono
parents: 67
diff changeset
1295 visit (TREE_PURPOSE (t));
kono
parents: 67
diff changeset
1296 visit (TREE_VALUE (t));
kono
parents: 67
diff changeset
1297 visit (TREE_CHAIN (t));
kono
parents: 67
diff changeset
1298 }
kono
parents: 67
diff changeset
1299
kono
parents: 67
diff changeset
1300 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
kono
parents: 67
diff changeset
1301 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
kono
parents: 67
diff changeset
1302 visit (TREE_VEC_ELT (t, i));
kono
parents: 67
diff changeset
1303
kono
parents: 67
diff changeset
1304 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
kono
parents: 67
diff changeset
1305 {
kono
parents: 67
diff changeset
1306 hstate.add_hwi (TREE_OPERAND_LENGTH (t));
kono
parents: 67
diff changeset
1307 for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i)
kono
parents: 67
diff changeset
1308 visit (TREE_OPERAND (t, i));
kono
parents: 67
diff changeset
1309 }
kono
parents: 67
diff changeset
1310
kono
parents: 67
diff changeset
1311 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
kono
parents: 67
diff changeset
1312 {
kono
parents: 67
diff changeset
1313 unsigned i;
kono
parents: 67
diff changeset
1314 tree b;
kono
parents: 67
diff changeset
1315 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b)
kono
parents: 67
diff changeset
1316 visit (b);
kono
parents: 67
diff changeset
1317 visit (BINFO_OFFSET (t));
kono
parents: 67
diff changeset
1318 visit (BINFO_VTABLE (t));
kono
parents: 67
diff changeset
1319 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1320 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1321 by C++ FE only. */
111
kono
parents: 67
diff changeset
1322 }
kono
parents: 67
diff changeset
1323
kono
parents: 67
diff changeset
1324 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
kono
parents: 67
diff changeset
1325 {
kono
parents: 67
diff changeset
1326 unsigned i;
kono
parents: 67
diff changeset
1327 tree index, value;
kono
parents: 67
diff changeset
1328 hstate.add_hwi (CONSTRUCTOR_NELTS (t));
kono
parents: 67
diff changeset
1329 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
kono
parents: 67
diff changeset
1330 {
kono
parents: 67
diff changeset
1331 visit (index);
kono
parents: 67
diff changeset
1332 visit (value);
kono
parents: 67
diff changeset
1333 }
kono
parents: 67
diff changeset
1334 }
kono
parents: 67
diff changeset
1335
kono
parents: 67
diff changeset
1336 if (code == OMP_CLAUSE)
kono
parents: 67
diff changeset
1337 {
kono
parents: 67
diff changeset
1338 int i;
kono
parents: 67
diff changeset
1339 HOST_WIDE_INT val;
kono
parents: 67
diff changeset
1340
kono
parents: 67
diff changeset
1341 hstate.add_hwi (OMP_CLAUSE_CODE (t));
kono
parents: 67
diff changeset
1342 switch (OMP_CLAUSE_CODE (t))
kono
parents: 67
diff changeset
1343 {
kono
parents: 67
diff changeset
1344 case OMP_CLAUSE_DEFAULT:
kono
parents: 67
diff changeset
1345 val = OMP_CLAUSE_DEFAULT_KIND (t);
kono
parents: 67
diff changeset
1346 break;
kono
parents: 67
diff changeset
1347 case OMP_CLAUSE_SCHEDULE:
kono
parents: 67
diff changeset
1348 val = OMP_CLAUSE_SCHEDULE_KIND (t);
kono
parents: 67
diff changeset
1349 break;
kono
parents: 67
diff changeset
1350 case OMP_CLAUSE_DEPEND:
kono
parents: 67
diff changeset
1351 val = OMP_CLAUSE_DEPEND_KIND (t);
kono
parents: 67
diff changeset
1352 break;
kono
parents: 67
diff changeset
1353 case OMP_CLAUSE_MAP:
kono
parents: 67
diff changeset
1354 val = OMP_CLAUSE_MAP_KIND (t);
kono
parents: 67
diff changeset
1355 break;
kono
parents: 67
diff changeset
1356 case OMP_CLAUSE_PROC_BIND:
kono
parents: 67
diff changeset
1357 val = OMP_CLAUSE_PROC_BIND_KIND (t);
kono
parents: 67
diff changeset
1358 break;
kono
parents: 67
diff changeset
1359 case OMP_CLAUSE_REDUCTION:
kono
parents: 67
diff changeset
1360 val = OMP_CLAUSE_REDUCTION_CODE (t);
kono
parents: 67
diff changeset
1361 break;
kono
parents: 67
diff changeset
1362 default:
kono
parents: 67
diff changeset
1363 val = 0;
kono
parents: 67
diff changeset
1364 break;
kono
parents: 67
diff changeset
1365 }
kono
parents: 67
diff changeset
1366 hstate.add_hwi (val);
kono
parents: 67
diff changeset
1367 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++)
kono
parents: 67
diff changeset
1368 visit (OMP_CLAUSE_OPERAND (t, i));
kono
parents: 67
diff changeset
1369 visit (OMP_CLAUSE_CHAIN (t));
kono
parents: 67
diff changeset
1370 }
kono
parents: 67
diff changeset
1371
kono
parents: 67
diff changeset
1372 return hstate.end ();
kono
parents: 67
diff changeset
1373
kono
parents: 67
diff changeset
1374 #undef visit
kono
parents: 67
diff changeset
1375 }
kono
parents: 67
diff changeset
1376
kono
parents: 67
diff changeset
1377 /* Compare two SCC entries by their hash value for qsorting them. */
kono
parents: 67
diff changeset
1378
kono
parents: 67
diff changeset
1379 int
kono
parents: 67
diff changeset
1380 DFS::scc_entry_compare (const void *p1_, const void *p2_)
kono
parents: 67
diff changeset
1381 {
kono
parents: 67
diff changeset
1382 const scc_entry *p1 = (const scc_entry *) p1_;
kono
parents: 67
diff changeset
1383 const scc_entry *p2 = (const scc_entry *) p2_;
kono
parents: 67
diff changeset
1384 if (p1->hash < p2->hash)
kono
parents: 67
diff changeset
1385 return -1;
kono
parents: 67
diff changeset
1386 else if (p1->hash > p2->hash)
kono
parents: 67
diff changeset
1387 return 1;
kono
parents: 67
diff changeset
1388 return 0;
kono
parents: 67
diff changeset
1389 }
kono
parents: 67
diff changeset
1390
kono
parents: 67
diff changeset
1391 /* Return a hash value for the SCC on the SCC stack from FIRST with SIZE.
kono
parents: 67
diff changeset
1392 THIS_REF_P and REF_P are as passed to lto_output_tree for FIRST. */
kono
parents: 67
diff changeset
1393
kono
parents: 67
diff changeset
1394 hashval_t
kono
parents: 67
diff changeset
1395 DFS::hash_scc (struct output_block *ob, unsigned first, unsigned size,
kono
parents: 67
diff changeset
1396 bool ref_p, bool this_ref_p)
kono
parents: 67
diff changeset
1397 {
kono
parents: 67
diff changeset
1398 unsigned int last_classes = 0, iterations = 0;
kono
parents: 67
diff changeset
1399
kono
parents: 67
diff changeset
1400 /* Compute hash values for the SCC members. */
kono
parents: 67
diff changeset
1401 for (unsigned i = 0; i < size; ++i)
kono
parents: 67
diff changeset
1402 sccstack[first+i].hash
kono
parents: 67
diff changeset
1403 = hash_tree (ob->writer_cache, NULL, sccstack[first+i].t);
kono
parents: 67
diff changeset
1404
kono
parents: 67
diff changeset
1405 if (size == 1)
kono
parents: 67
diff changeset
1406 return sccstack[first].hash;
kono
parents: 67
diff changeset
1407
kono
parents: 67
diff changeset
1408 /* We aim to get unique hash for every tree within SCC and compute hash value
kono
parents: 67
diff changeset
1409 of the whole SCC by combining all values together in a stable (entry-point
kono
parents: 67
diff changeset
1410 independent) order. This guarantees that the same SCC regions within
kono
parents: 67
diff changeset
1411 different translation units will get the same hash values and therefore
kono
parents: 67
diff changeset
1412 will be merged at WPA time.
kono
parents: 67
diff changeset
1413
kono
parents: 67
diff changeset
1414 Often the hashes are already unique. In that case we compute the SCC hash
kono
parents: 67
diff changeset
1415 by combining individual hash values in an increasing order.
kono
parents: 67
diff changeset
1416
kono
parents: 67
diff changeset
1417 If there are duplicates, we seek at least one tree with unique hash (and
kono
parents: 67
diff changeset
1418 pick one with minimal hash and this property). Then we obtain a stable
kono
parents: 67
diff changeset
1419 order by DFS walk starting from this unique tree and then use the index
kono
parents: 67
diff changeset
1420 within this order to make individual hash values unique.
kono
parents: 67
diff changeset
1421
kono
parents: 67
diff changeset
1422 If there is no tree with unique hash, we iteratively propagate the hash
kono
parents: 67
diff changeset
1423 values across the internal edges of SCC. This usually quickly leads
kono
parents: 67
diff changeset
1424 to unique hashes. Consider, for example, an SCC containing two pointers
kono
parents: 67
diff changeset
1425 that are identical except for the types they point to and assume that
kono
parents: 67
diff changeset
1426 these types are also part of the SCC. The propagation will add the
kono
parents: 67
diff changeset
1427 points-to type information into their hash values. */
kono
parents: 67
diff changeset
1428 do
kono
parents: 67
diff changeset
1429 {
kono
parents: 67
diff changeset
1430 /* Sort the SCC so we can easily check for uniqueness. */
kono
parents: 67
diff changeset
1431 qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
kono
parents: 67
diff changeset
1432
kono
parents: 67
diff changeset
1433 unsigned int classes = 1;
kono
parents: 67
diff changeset
1434 int firstunique = -1;
kono
parents: 67
diff changeset
1435
kono
parents: 67
diff changeset
1436 /* Find the tree with lowest unique hash (if it exists) and compute
kono
parents: 67
diff changeset
1437 the number of equivalence classes. */
kono
parents: 67
diff changeset
1438 if (sccstack[first].hash != sccstack[first+1].hash)
kono
parents: 67
diff changeset
1439 firstunique = 0;
kono
parents: 67
diff changeset
1440 for (unsigned i = 1; i < size; ++i)
kono
parents: 67
diff changeset
1441 if (sccstack[first+i-1].hash != sccstack[first+i].hash)
kono
parents: 67
diff changeset
1442 {
kono
parents: 67
diff changeset
1443 classes++;
kono
parents: 67
diff changeset
1444 if (firstunique == -1
kono
parents: 67
diff changeset
1445 && (i == size - 1
kono
parents: 67
diff changeset
1446 || sccstack[first+i+1].hash != sccstack[first+i].hash))
kono
parents: 67
diff changeset
1447 firstunique = i;
kono
parents: 67
diff changeset
1448 }
kono
parents: 67
diff changeset
1449
kono
parents: 67
diff changeset
1450 /* If we found a tree with unique hash, stop the iteration. */
kono
parents: 67
diff changeset
1451 if (firstunique != -1
kono
parents: 67
diff changeset
1452 /* Also terminate if we run out of iterations or if the number of
kono
parents: 67
diff changeset
1453 equivalence classes is no longer increasing.
kono
parents: 67
diff changeset
1454 For example a cyclic list of trees that are all equivalent will
kono
parents: 67
diff changeset
1455 never have unique entry point; we however do not build such SCCs
kono
parents: 67
diff changeset
1456 in our IL. */
kono
parents: 67
diff changeset
1457 || classes <= last_classes || iterations > 16)
kono
parents: 67
diff changeset
1458 {
kono
parents: 67
diff changeset
1459 hashval_t scc_hash;
kono
parents: 67
diff changeset
1460
kono
parents: 67
diff changeset
1461 /* If some hashes are not unique (CLASSES != SIZE), use the DFS walk
kono
parents: 67
diff changeset
1462 starting from FIRSTUNIQUE to obtain a stable order. */
kono
parents: 67
diff changeset
1463 if (classes != size && firstunique != -1)
kono
parents: 67
diff changeset
1464 {
kono
parents: 67
diff changeset
1465 hash_map <tree, hashval_t> map(size*2);
kono
parents: 67
diff changeset
1466
kono
parents: 67
diff changeset
1467 /* Store hash values into a map, so we can associate them with
kono
parents: 67
diff changeset
1468 the reordered SCC. */
kono
parents: 67
diff changeset
1469 for (unsigned i = 0; i < size; ++i)
kono
parents: 67
diff changeset
1470 map.put (sccstack[first+i].t, sccstack[first+i].hash);
kono
parents: 67
diff changeset
1471
kono
parents: 67
diff changeset
1472 DFS again (ob, sccstack[first+firstunique].t, ref_p, this_ref_p,
kono
parents: 67
diff changeset
1473 true);
kono
parents: 67
diff changeset
1474 gcc_assert (again.sccstack.length () == size);
kono
parents: 67
diff changeset
1475
kono
parents: 67
diff changeset
1476 memcpy (sccstack.address () + first,
kono
parents: 67
diff changeset
1477 again.sccstack.address (),
kono
parents: 67
diff changeset
1478 sizeof (scc_entry) * size);
kono
parents: 67
diff changeset
1479
kono
parents: 67
diff changeset
1480 /* Update hash values of individual members by hashing in the
kono
parents: 67
diff changeset
1481 index within the stable order. This ensures uniqueness.
kono
parents: 67
diff changeset
1482 Also compute the SCC hash by mixing in all hash values in
kono
parents: 67
diff changeset
1483 the stable order we obtained. */
kono
parents: 67
diff changeset
1484 sccstack[first].hash = *map.get (sccstack[first].t);
kono
parents: 67
diff changeset
1485 scc_hash = sccstack[first].hash;
kono
parents: 67
diff changeset
1486 for (unsigned i = 1; i < size; ++i)
kono
parents: 67
diff changeset
1487 {
kono
parents: 67
diff changeset
1488 sccstack[first+i].hash
kono
parents: 67
diff changeset
1489 = iterative_hash_hashval_t (i,
kono
parents: 67
diff changeset
1490 *map.get (sccstack[first+i].t));
kono
parents: 67
diff changeset
1491 scc_hash
kono
parents: 67
diff changeset
1492 = iterative_hash_hashval_t (scc_hash,
kono
parents: 67
diff changeset
1493 sccstack[first+i].hash);
kono
parents: 67
diff changeset
1494 }
kono
parents: 67
diff changeset
1495 }
kono
parents: 67
diff changeset
1496 /* If we got a unique hash value for each tree, then sort already
kono
parents: 67
diff changeset
1497 ensured entry-point independent order. Only compute the final
kono
parents: 67
diff changeset
1498 SCC hash.
kono
parents: 67
diff changeset
1499
kono
parents: 67
diff changeset
1500 If we failed to find the unique entry point, we go by the same
kono
parents: 67
diff changeset
1501 route. We will eventually introduce unwanted hash conflicts. */
kono
parents: 67
diff changeset
1502 else
kono
parents: 67
diff changeset
1503 {
kono
parents: 67
diff changeset
1504 scc_hash = sccstack[first].hash;
kono
parents: 67
diff changeset
1505 for (unsigned i = 1; i < size; ++i)
kono
parents: 67
diff changeset
1506 scc_hash
kono
parents: 67
diff changeset
1507 = iterative_hash_hashval_t (scc_hash, sccstack[first+i].hash);
kono
parents: 67
diff changeset
1508
kono
parents: 67
diff changeset
1509 /* We cannot 100% guarantee that the hash won't conflict so as
kono
parents: 67
diff changeset
1510 to make it impossible to find a unique hash. This however
kono
parents: 67
diff changeset
1511 should be an extremely rare case. ICE for now so possible
kono
parents: 67
diff changeset
1512 issues are found and evaluated. */
kono
parents: 67
diff changeset
1513 gcc_checking_assert (classes == size);
kono
parents: 67
diff changeset
1514 }
kono
parents: 67
diff changeset
1515
kono
parents: 67
diff changeset
1516 /* To avoid conflicts across SCCs, iteratively hash the whole SCC
kono
parents: 67
diff changeset
1517 hash into the hash of each element. */
kono
parents: 67
diff changeset
1518 for (unsigned i = 0; i < size; ++i)
kono
parents: 67
diff changeset
1519 sccstack[first+i].hash
kono
parents: 67
diff changeset
1520 = iterative_hash_hashval_t (sccstack[first+i].hash, scc_hash);
kono
parents: 67
diff changeset
1521 return scc_hash;
kono
parents: 67
diff changeset
1522 }
kono
parents: 67
diff changeset
1523
kono
parents: 67
diff changeset
1524 last_classes = classes;
kono
parents: 67
diff changeset
1525 iterations++;
kono
parents: 67
diff changeset
1526
kono
parents: 67
diff changeset
1527 /* We failed to identify the entry point; propagate hash values across
kono
parents: 67
diff changeset
1528 the edges. */
kono
parents: 67
diff changeset
1529 hash_map <tree, hashval_t> map(size*2);
kono
parents: 67
diff changeset
1530
kono
parents: 67
diff changeset
1531 for (unsigned i = 0; i < size; ++i)
kono
parents: 67
diff changeset
1532 map.put (sccstack[first+i].t, sccstack[first+i].hash);
kono
parents: 67
diff changeset
1533
kono
parents: 67
diff changeset
1534 for (unsigned i = 0; i < size; i++)
kono
parents: 67
diff changeset
1535 sccstack[first+i].hash
kono
parents: 67
diff changeset
1536 = hash_tree (ob->writer_cache, &map, sccstack[first+i].t);
kono
parents: 67
diff changeset
1537 }
kono
parents: 67
diff changeset
1538 while (true);
kono
parents: 67
diff changeset
1539 }
kono
parents: 67
diff changeset
1540
kono
parents: 67
diff changeset
1541 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
kono
parents: 67
diff changeset
1542 already in the streamer cache. Main routine called for
kono
parents: 67
diff changeset
1543 each visit of EXPR. */
kono
parents: 67
diff changeset
1544
kono
parents: 67
diff changeset
1545 void
kono
parents: 67
diff changeset
1546 DFS::DFS_write_tree (struct output_block *ob, sccs *from_state,
kono
parents: 67
diff changeset
1547 tree expr, bool ref_p, bool this_ref_p)
kono
parents: 67
diff changeset
1548 {
kono
parents: 67
diff changeset
1549 /* Handle special cases. */
kono
parents: 67
diff changeset
1550 if (expr == NULL_TREE)
kono
parents: 67
diff changeset
1551 return;
kono
parents: 67
diff changeset
1552
kono
parents: 67
diff changeset
1553 /* Do not DFS walk into indexable trees. */
kono
parents: 67
diff changeset
1554 if (this_ref_p && tree_is_indexable (expr))
kono
parents: 67
diff changeset
1555 return;
kono
parents: 67
diff changeset
1556
kono
parents: 67
diff changeset
1557 /* Check if we already streamed EXPR. */
kono
parents: 67
diff changeset
1558 if (streamer_tree_cache_lookup (ob->writer_cache, expr, NULL))
kono
parents: 67
diff changeset
1559 return;
kono
parents: 67
diff changeset
1560
kono
parents: 67
diff changeset
1561 worklist w;
kono
parents: 67
diff changeset
1562 w.expr = expr;
kono
parents: 67
diff changeset
1563 w.from_state = from_state;
kono
parents: 67
diff changeset
1564 w.cstate = NULL;
kono
parents: 67
diff changeset
1565 w.ref_p = ref_p;
kono
parents: 67
diff changeset
1566 w.this_ref_p = this_ref_p;
kono
parents: 67
diff changeset
1567 worklist_vec.safe_push (w);
kono
parents: 67
diff changeset
1568 }
kono
parents: 67
diff changeset
1569
kono
parents: 67
diff changeset
1570
kono
parents: 67
diff changeset
1571 /* Emit the physical representation of tree node EXPR to output block OB.
kono
parents: 67
diff changeset
1572 If THIS_REF_P is true, the leaves of EXPR are emitted as references via
kono
parents: 67
diff changeset
1573 lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
kono
parents: 67
diff changeset
1574
kono
parents: 67
diff changeset
1575 void
kono
parents: 67
diff changeset
1576 lto_output_tree (struct output_block *ob, tree expr,
kono
parents: 67
diff changeset
1577 bool ref_p, bool this_ref_p)
kono
parents: 67
diff changeset
1578 {
kono
parents: 67
diff changeset
1579 unsigned ix;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1580 bool existed_p;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1581
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1582 if (expr == NULL_TREE)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1583 {
111
kono
parents: 67
diff changeset
1584 streamer_write_record_start (ob, LTO_null);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1585 return;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1586 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1587
111
kono
parents: 67
diff changeset
1588 if (this_ref_p && tree_is_indexable (expr))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1589 {
111
kono
parents: 67
diff changeset
1590 lto_output_tree_ref (ob, expr);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1591 return;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1592 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1593
111
kono
parents: 67
diff changeset
1594 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1595 if (existed_p)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1596 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1597 /* If a node has already been streamed out, make sure that
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1598 we don't write it more than once. Otherwise, the reader
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1599 will instantiate two different nodes for the same object. */
111
kono
parents: 67
diff changeset
1600 streamer_write_record_start (ob, LTO_tree_pickle_reference);
kono
parents: 67
diff changeset
1601 streamer_write_uhwi (ob, ix);
kono
parents: 67
diff changeset
1602 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
kono
parents: 67
diff changeset
1603 lto_tree_code_to_tag (TREE_CODE (expr)));
kono
parents: 67
diff changeset
1604 lto_stats.num_pickle_refs_output++;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1605 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1606 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1607 {
111
kono
parents: 67
diff changeset
1608 /* This is the first time we see EXPR, write all reachable
kono
parents: 67
diff changeset
1609 trees to OB. */
kono
parents: 67
diff changeset
1610 static bool in_dfs_walk;
kono
parents: 67
diff changeset
1611
kono
parents: 67
diff changeset
1612 /* Protect against recursion which means disconnect between
kono
parents: 67
diff changeset
1613 what tree edges we walk in the DFS walk and what edges
kono
parents: 67
diff changeset
1614 we stream out. */
kono
parents: 67
diff changeset
1615 gcc_assert (!in_dfs_walk);
kono
parents: 67
diff changeset
1616
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1617 if (streamer_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1618 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1619 print_node_brief (streamer_dump_file, " Streaming SCC of ",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1620 expr, 4);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1621 fprintf (streamer_dump_file, "\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1622 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1623
111
kono
parents: 67
diff changeset
1624 /* Start the DFS walk. */
kono
parents: 67
diff changeset
1625 /* Save ob state ... */
kono
parents: 67
diff changeset
1626 /* let's see ... */
kono
parents: 67
diff changeset
1627 in_dfs_walk = true;
kono
parents: 67
diff changeset
1628 DFS (ob, expr, ref_p, this_ref_p, false);
kono
parents: 67
diff changeset
1629 in_dfs_walk = false;
kono
parents: 67
diff changeset
1630
kono
parents: 67
diff changeset
1631 /* Finally append a reference to the tree we were writing.
kono
parents: 67
diff changeset
1632 ??? If expr ended up as a singleton we could have
kono
parents: 67
diff changeset
1633 inlined it here and avoid outputting a reference. */
kono
parents: 67
diff changeset
1634 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
kono
parents: 67
diff changeset
1635 gcc_assert (existed_p);
kono
parents: 67
diff changeset
1636 streamer_write_record_start (ob, LTO_tree_pickle_reference);
kono
parents: 67
diff changeset
1637 streamer_write_uhwi (ob, ix);
kono
parents: 67
diff changeset
1638 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
kono
parents: 67
diff changeset
1639 lto_tree_code_to_tag (TREE_CODE (expr)));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1640 if (streamer_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1641 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1642 print_node_brief (streamer_dump_file, " Finished SCC of ",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1643 expr, 4);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1644 fprintf (streamer_dump_file, "\n\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1645 }
111
kono
parents: 67
diff changeset
1646 lto_stats.num_pickle_refs_output++;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1647 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1648 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1649
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1650
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1651 /* Output to OB a list of try/catch handlers starting with FIRST. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1652
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1653 static void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1654 output_eh_try_list (struct output_block *ob, eh_catch first)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1655 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1656 eh_catch n;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1657
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1658 for (n = first; n; n = n->next_catch)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1659 {
111
kono
parents: 67
diff changeset
1660 streamer_write_record_start (ob, LTO_eh_catch);
kono
parents: 67
diff changeset
1661 stream_write_tree (ob, n->type_list, true);
kono
parents: 67
diff changeset
1662 stream_write_tree (ob, n->filter_list, true);
kono
parents: 67
diff changeset
1663 stream_write_tree (ob, n->label, true);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1664 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1665
111
kono
parents: 67
diff changeset
1666 streamer_write_record_start (ob, LTO_null);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1667 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1668
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1669
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1670 /* Output EH region R in function FN to OB. CURR_RN is the slot index
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1671 that is being emitted in FN->EH->REGION_ARRAY. This is used to
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1672 detect EH region sharing. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1673
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1674 static void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1675 output_eh_region (struct output_block *ob, eh_region r)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1676 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1677 enum LTO_tags tag;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1678
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1679 if (r == NULL)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1680 {
111
kono
parents: 67
diff changeset
1681 streamer_write_record_start (ob, LTO_null);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1682 return;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1683 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1684
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1685 if (r->type == ERT_CLEANUP)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1686 tag = LTO_ert_cleanup;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1687 else if (r->type == ERT_TRY)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1688 tag = LTO_ert_try;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1689 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1690 tag = LTO_ert_allowed_exceptions;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1691 else if (r->type == ERT_MUST_NOT_THROW)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1692 tag = LTO_ert_must_not_throw;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1693 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1694 gcc_unreachable ();
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1695
111
kono
parents: 67
diff changeset
1696 streamer_write_record_start (ob, tag);
kono
parents: 67
diff changeset
1697 streamer_write_hwi (ob, r->index);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1698
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1699 if (r->outer)
111
kono
parents: 67
diff changeset
1700 streamer_write_hwi (ob, r->outer->index);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1701 else
111
kono
parents: 67
diff changeset
1702 streamer_write_zero (ob);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1703
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1704 if (r->inner)
111
kono
parents: 67
diff changeset
1705 streamer_write_hwi (ob, r->inner->index);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1706 else
111
kono
parents: 67
diff changeset
1707 streamer_write_zero (ob);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1708
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1709 if (r->next_peer)
111
kono
parents: 67
diff changeset
1710 streamer_write_hwi (ob, r->next_peer->index);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1711 else
111
kono
parents: 67
diff changeset
1712 streamer_write_zero (ob);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1713
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1714 if (r->type == ERT_TRY)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1715 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1716 output_eh_try_list (ob, r->u.eh_try.first_catch);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1717 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1718 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1719 {
111
kono
parents: 67
diff changeset
1720 stream_write_tree (ob, r->u.allowed.type_list, true);
kono
parents: 67
diff changeset
1721 stream_write_tree (ob, r->u.allowed.label, true);
kono
parents: 67
diff changeset
1722 streamer_write_uhwi (ob, r->u.allowed.filter);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1723 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1724 else if (r->type == ERT_MUST_NOT_THROW)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1725 {
111
kono
parents: 67
diff changeset
1726 stream_write_tree (ob, r->u.must_not_throw.failure_decl, true);
kono
parents: 67
diff changeset
1727 bitpack_d bp = bitpack_create (ob->main_stream);
kono
parents: 67
diff changeset
1728 stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc);
kono
parents: 67
diff changeset
1729 streamer_write_bitpack (&bp);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1730 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1731
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1732 if (r->landing_pads)
111
kono
parents: 67
diff changeset
1733 streamer_write_hwi (ob, r->landing_pads->index);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1734 else
111
kono
parents: 67
diff changeset
1735 streamer_write_zero (ob);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1736 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1737
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1738
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1739 /* Output landing pad LP to OB. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1740
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1741 static void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1742 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1743 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1744 if (lp == NULL)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1745 {
111
kono
parents: 67
diff changeset
1746 streamer_write_record_start (ob, LTO_null);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1747 return;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1748 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1749
111
kono
parents: 67
diff changeset
1750 streamer_write_record_start (ob, LTO_eh_landing_pad);
kono
parents: 67
diff changeset
1751 streamer_write_hwi (ob, lp->index);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1752 if (lp->next_lp)
111
kono
parents: 67
diff changeset
1753 streamer_write_hwi (ob, lp->next_lp->index);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1754 else
111
kono
parents: 67
diff changeset
1755 streamer_write_zero (ob);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1756
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1757 if (lp->region)
111
kono
parents: 67
diff changeset
1758 streamer_write_hwi (ob, lp->region->index);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1759 else
111
kono
parents: 67
diff changeset
1760 streamer_write_zero (ob);
kono
parents: 67
diff changeset
1761
kono
parents: 67
diff changeset
1762 stream_write_tree (ob, lp->post_landing_pad, true);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1763 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1764
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1765
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1766 /* Output the existing eh_table to OB. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1767
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1768 static void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1769 output_eh_regions (struct output_block *ob, struct function *fn)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1770 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1771 if (fn->eh && fn->eh->region_tree)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1772 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1773 unsigned i;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1774 eh_region eh;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1775 eh_landing_pad lp;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1776 tree ttype;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1777
111
kono
parents: 67
diff changeset
1778 streamer_write_record_start (ob, LTO_eh_table);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1779
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1780 /* Emit the index of the root of the EH region tree. */
111
kono
parents: 67
diff changeset
1781 streamer_write_hwi (ob, fn->eh->region_tree->index);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1782
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1783 /* Emit all the EH regions in the region array. */
111
kono
parents: 67
diff changeset
1784 streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array));
kono
parents: 67
diff changeset
1785 FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1786 output_eh_region (ob, eh);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1787
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1788 /* Emit all landing pads. */
111
kono
parents: 67
diff changeset
1789 streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array));
kono
parents: 67
diff changeset
1790 FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1791 output_eh_lp (ob, lp);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1792
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1793 /* Emit all the runtime type data. */
111
kono
parents: 67
diff changeset
1794 streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data));
kono
parents: 67
diff changeset
1795 FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype)
kono
parents: 67
diff changeset
1796 stream_write_tree (ob, ttype, true);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1797
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1798 /* Emit the table of action chains. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1799 if (targetm.arm_eabi_unwinder)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1800 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1801 tree t;
111
kono
parents: 67
diff changeset
1802 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi));
kono
parents: 67
diff changeset
1803 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t)
kono
parents: 67
diff changeset
1804 stream_write_tree (ob, t, true);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1805 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1806 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1807 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1808 uchar c;
111
kono
parents: 67
diff changeset
1809 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other));
kono
parents: 67
diff changeset
1810 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c)
kono
parents: 67
diff changeset
1811 streamer_write_char_stream (ob->main_stream, c);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1812 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1813 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1814
111
kono
parents: 67
diff changeset
1815 /* The LTO_null either terminates the record or indicates that there
kono
parents: 67
diff changeset
1816 are no eh_records at all. */
kono
parents: 67
diff changeset
1817 streamer_write_record_start (ob, LTO_null);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1818 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1819
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1820
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1821 /* Output all of the active ssa names to the ssa_names stream. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1822
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1823 static void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1824 output_ssa_names (struct output_block *ob, struct function *fn)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1825 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1826 unsigned int i, len;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1827
111
kono
parents: 67
diff changeset
1828 len = vec_safe_length (SSANAMES (fn));
kono
parents: 67
diff changeset
1829 streamer_write_uhwi (ob, len);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1830
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1831 for (i = 1; i < len; i++)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1832 {
111
kono
parents: 67
diff changeset
1833 tree ptr = (*SSANAMES (fn))[i];
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1834
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1835 if (ptr == NULL_TREE
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1836 || SSA_NAME_IN_FREE_LIST (ptr)
111
kono
parents: 67
diff changeset
1837 || virtual_operand_p (ptr)
kono
parents: 67
diff changeset
1838 /* Simply skip unreleased SSA names. */
kono
parents: 67
diff changeset
1839 || (! SSA_NAME_IS_DEFAULT_DEF (ptr)
kono
parents: 67
diff changeset
1840 && (! SSA_NAME_DEF_STMT (ptr)
kono
parents: 67
diff changeset
1841 || ! gimple_bb (SSA_NAME_DEF_STMT (ptr)))))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1842 continue;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1843
111
kono
parents: 67
diff changeset
1844 streamer_write_uhwi (ob, i);
kono
parents: 67
diff changeset
1845 streamer_write_char_stream (ob->main_stream,
kono
parents: 67
diff changeset
1846 SSA_NAME_IS_DEFAULT_DEF (ptr));
kono
parents: 67
diff changeset
1847 if (SSA_NAME_VAR (ptr))
kono
parents: 67
diff changeset
1848 stream_write_tree (ob, SSA_NAME_VAR (ptr), true);
kono
parents: 67
diff changeset
1849 else
kono
parents: 67
diff changeset
1850 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
kono
parents: 67
diff changeset
1851 stream_write_tree (ob, TREE_TYPE (ptr), true);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1852 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1853
111
kono
parents: 67
diff changeset
1854 streamer_write_zero (ob);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1855 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1856
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1857
111
kono
parents: 67
diff changeset
1858
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1859 /* Output the cfg. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1860
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1861 static void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1862 output_cfg (struct output_block *ob, struct function *fn)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1863 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1864 struct lto_output_stream *tmp_stream = ob->main_stream;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1865 basic_block bb;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1866
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1867 ob->main_stream = ob->cfg_stream;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1868
111
kono
parents: 67
diff changeset
1869 streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
kono
parents: 67
diff changeset
1870 profile_status_for_fn (fn));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1871
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1872 /* Output the number of the highest basic block. */
111
kono
parents: 67
diff changeset
1873 streamer_write_uhwi (ob, last_basic_block_for_fn (fn));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1874
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1875 FOR_ALL_BB_FN (bb, fn)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1876 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1877 edge_iterator ei;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1878 edge e;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1879
111
kono
parents: 67
diff changeset
1880 streamer_write_hwi (ob, bb->index);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1881
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1882 /* Output the successors and the edge flags. */
111
kono
parents: 67
diff changeset
1883 streamer_write_uhwi (ob, EDGE_COUNT (bb->succs));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1884 FOR_EACH_EDGE (e, ei, bb->succs)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1885 {
111
kono
parents: 67
diff changeset
1886 streamer_write_uhwi (ob, e->dest->index);
kono
parents: 67
diff changeset
1887 e->probability.stream_out (ob);
kono
parents: 67
diff changeset
1888 streamer_write_uhwi (ob, e->flags);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1889 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1890 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1891
111
kono
parents: 67
diff changeset
1892 streamer_write_hwi (ob, -1);
kono
parents: 67
diff changeset
1893
kono
parents: 67
diff changeset
1894 bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1895 while (bb->next_bb)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1896 {
111
kono
parents: 67
diff changeset
1897 streamer_write_hwi (ob, bb->next_bb->index);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1898 bb = bb->next_bb;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1899 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1900
111
kono
parents: 67
diff changeset
1901 streamer_write_hwi (ob, -1);
kono
parents: 67
diff changeset
1902
kono
parents: 67
diff changeset
1903 /* ??? The cfgloop interface is tied to cfun. */
kono
parents: 67
diff changeset
1904 gcc_assert (cfun == fn);
kono
parents: 67
diff changeset
1905
kono
parents: 67
diff changeset
1906 /* Output the number of loops. */
kono
parents: 67
diff changeset
1907 streamer_write_uhwi (ob, number_of_loops (fn));
kono
parents: 67
diff changeset
1908
kono
parents: 67
diff changeset
1909 /* Output each loop, skipping the tree root which has number zero. */
kono
parents: 67
diff changeset
1910 for (unsigned i = 1; i < number_of_loops (fn); ++i)
kono
parents: 67
diff changeset
1911 {
kono
parents: 67
diff changeset
1912 struct loop *loop = get_loop (fn, i);
kono
parents: 67
diff changeset
1913
kono
parents: 67
diff changeset
1914 /* Write the index of the loop header. That's enough to rebuild
kono
parents: 67
diff changeset
1915 the loop tree on the reader side. Stream -1 for an unused
kono
parents: 67
diff changeset
1916 loop entry. */
kono
parents: 67
diff changeset
1917 if (!loop)
kono
parents: 67
diff changeset
1918 {
kono
parents: 67
diff changeset
1919 streamer_write_hwi (ob, -1);
kono
parents: 67
diff changeset
1920 continue;
kono
parents: 67
diff changeset
1921 }
kono
parents: 67
diff changeset
1922 else
kono
parents: 67
diff changeset
1923 streamer_write_hwi (ob, loop->header->index);
kono
parents: 67
diff changeset
1924
kono
parents: 67
diff changeset
1925 /* Write everything copy_loop_info copies. */
kono
parents: 67
diff changeset
1926 streamer_write_enum (ob->main_stream,
kono
parents: 67
diff changeset
1927 loop_estimation, EST_LAST, loop->estimate_state);
kono
parents: 67
diff changeset
1928 streamer_write_hwi (ob, loop->any_upper_bound);
kono
parents: 67
diff changeset
1929 if (loop->any_upper_bound)
kono
parents: 67
diff changeset
1930 streamer_write_widest_int (ob, loop->nb_iterations_upper_bound);
kono
parents: 67
diff changeset
1931 streamer_write_hwi (ob, loop->any_likely_upper_bound);
kono
parents: 67
diff changeset
1932 if (loop->any_likely_upper_bound)
kono
parents: 67
diff changeset
1933 streamer_write_widest_int (ob, loop->nb_iterations_likely_upper_bound);
kono
parents: 67
diff changeset
1934 streamer_write_hwi (ob, loop->any_estimate);
kono
parents: 67
diff changeset
1935 if (loop->any_estimate)
kono
parents: 67
diff changeset
1936 streamer_write_widest_int (ob, loop->nb_iterations_estimate);
kono
parents: 67
diff changeset
1937
kono
parents: 67
diff changeset
1938 /* Write OMP SIMD related info. */
kono
parents: 67
diff changeset
1939 streamer_write_hwi (ob, loop->safelen);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1940 streamer_write_hwi (ob, loop->unroll);
111
kono
parents: 67
diff changeset
1941 streamer_write_hwi (ob, loop->dont_vectorize);
kono
parents: 67
diff changeset
1942 streamer_write_hwi (ob, loop->force_vectorize);
kono
parents: 67
diff changeset
1943 stream_write_tree (ob, loop->simduid, true);
kono
parents: 67
diff changeset
1944 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1945
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1946 ob->main_stream = tmp_stream;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1947 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1948
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1949
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1950 /* Create the header in the file using OB. If the section type is for
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1951 a function, set FN to the decl for that function. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1952
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1953 void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1954 produce_asm (struct output_block *ob, tree fn)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1955 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1956 enum lto_section_type section_type = ob->section_type;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1957 struct lto_function_header header;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1958 char *section_name;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1959
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1960 if (section_type == LTO_section_function_body)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1961 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1962 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1963 section_name = lto_get_section_name (section_type, name, NULL);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1964 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1965 else
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1966 section_name = lto_get_section_name (section_type, NULL, NULL);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1967
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1968 lto_begin_section (section_name, !flag_wpa);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1969 free (section_name);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1970
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1971 /* The entire header is stream computed here. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1972 memset (&header, 0, sizeof (struct lto_function_header));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1973
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1974 /* Write the header. */
111
kono
parents: 67
diff changeset
1975 header.major_version = LTO_major_version;
kono
parents: 67
diff changeset
1976 header.minor_version = LTO_minor_version;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1977
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1978 if (section_type == LTO_section_function_body)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1979 header.cfg_size = ob->cfg_stream->total_size;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1980 header.main_size = ob->main_stream->total_size;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1981 header.string_size = ob->string_stream->total_size;
111
kono
parents: 67
diff changeset
1982 lto_write_data (&header, sizeof header);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1983
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1984 /* Put all of the gimple and the string table out the asm file as a
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1985 block of text. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1986 if (section_type == LTO_section_function_body)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1987 lto_write_stream (ob->cfg_stream);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1988 lto_write_stream (ob->main_stream);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1989 lto_write_stream (ob->string_stream);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1990
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1991 lto_end_section ();
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1992 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1993
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1994
111
kono
parents: 67
diff changeset
1995 /* Output the base body of struct function FN using output block OB. */
kono
parents: 67
diff changeset
1996
kono
parents: 67
diff changeset
1997 static void
kono
parents: 67
diff changeset
1998 output_struct_function_base (struct output_block *ob, struct function *fn)
kono
parents: 67
diff changeset
1999 {
kono
parents: 67
diff changeset
2000 struct bitpack_d bp;
kono
parents: 67
diff changeset
2001 unsigned i;
kono
parents: 67
diff changeset
2002 tree t;
kono
parents: 67
diff changeset
2003
kono
parents: 67
diff changeset
2004 /* Output the static chain and non-local goto save area. */
kono
parents: 67
diff changeset
2005 stream_write_tree (ob, fn->static_chain_decl, true);
kono
parents: 67
diff changeset
2006 stream_write_tree (ob, fn->nonlocal_goto_save_area, true);
kono
parents: 67
diff changeset
2007
kono
parents: 67
diff changeset
2008 /* Output all the local variables in the function. */
kono
parents: 67
diff changeset
2009 streamer_write_hwi (ob, vec_safe_length (fn->local_decls));
kono
parents: 67
diff changeset
2010 FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t)
kono
parents: 67
diff changeset
2011 stream_write_tree (ob, t, true);
kono
parents: 67
diff changeset
2012
kono
parents: 67
diff changeset
2013 /* Output current IL state of the function. */
kono
parents: 67
diff changeset
2014 streamer_write_uhwi (ob, fn->curr_properties);
kono
parents: 67
diff changeset
2015
kono
parents: 67
diff changeset
2016 /* Write all the attributes for FN. */
kono
parents: 67
diff changeset
2017 bp = bitpack_create (ob->main_stream);
kono
parents: 67
diff changeset
2018 bp_pack_value (&bp, fn->is_thunk, 1);
kono
parents: 67
diff changeset
2019 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
kono
parents: 67
diff changeset
2020 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
kono
parents: 67
diff changeset
2021 bp_pack_value (&bp, fn->returns_struct, 1);
kono
parents: 67
diff changeset
2022 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
kono
parents: 67
diff changeset
2023 bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1);
kono
parents: 67
diff changeset
2024 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
kono
parents: 67
diff changeset
2025 bp_pack_value (&bp, fn->after_inlining, 1);
kono
parents: 67
diff changeset
2026 bp_pack_value (&bp, fn->stdarg, 1);
kono
parents: 67
diff changeset
2027 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
kono
parents: 67
diff changeset
2028 bp_pack_value (&bp, fn->has_forced_label_in_static, 1);
kono
parents: 67
diff changeset
2029 bp_pack_value (&bp, fn->calls_alloca, 1);
kono
parents: 67
diff changeset
2030 bp_pack_value (&bp, fn->calls_setjmp, 1);
kono
parents: 67
diff changeset
2031 bp_pack_value (&bp, fn->has_force_vectorize_loops, 1);
kono
parents: 67
diff changeset
2032 bp_pack_value (&bp, fn->has_simduid_loops, 1);
kono
parents: 67
diff changeset
2033 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
kono
parents: 67
diff changeset
2034 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
kono
parents: 67
diff changeset
2035 bp_pack_value (&bp, fn->last_clique, sizeof (short) * 8);
kono
parents: 67
diff changeset
2036
kono
parents: 67
diff changeset
2037 /* Output the function start and end loci. */
kono
parents: 67
diff changeset
2038 stream_output_location (ob, &bp, fn->function_start_locus);
kono
parents: 67
diff changeset
2039 stream_output_location (ob, &bp, fn->function_end_locus);
kono
parents: 67
diff changeset
2040
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2041 /* Save the instance discriminator if present. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2042 int *instance_number_p = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2043 if (decl_to_instance_map)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2044 instance_number_p = decl_to_instance_map->get (fn->decl);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2045 bp_pack_value (&bp, !!instance_number_p, 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2046 if (instance_number_p)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2047 bp_pack_value (&bp, *instance_number_p, sizeof (int) * CHAR_BIT);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2048
111
kono
parents: 67
diff changeset
2049 streamer_write_bitpack (&bp);
kono
parents: 67
diff changeset
2050 }
kono
parents: 67
diff changeset
2051
kono
parents: 67
diff changeset
2052
kono
parents: 67
diff changeset
2053 /* Collect all leaf BLOCKs beyond ROOT into LEAFS. */
kono
parents: 67
diff changeset
2054
kono
parents: 67
diff changeset
2055 static void
kono
parents: 67
diff changeset
2056 collect_block_tree_leafs (tree root, vec<tree> &leafs)
kono
parents: 67
diff changeset
2057 {
kono
parents: 67
diff changeset
2058 for (root = BLOCK_SUBBLOCKS (root); root; root = BLOCK_CHAIN (root))
kono
parents: 67
diff changeset
2059 if (! BLOCK_SUBBLOCKS (root))
kono
parents: 67
diff changeset
2060 leafs.safe_push (root);
kono
parents: 67
diff changeset
2061 else
kono
parents: 67
diff changeset
2062 collect_block_tree_leafs (BLOCK_SUBBLOCKS (root), leafs);
kono
parents: 67
diff changeset
2063 }
kono
parents: 67
diff changeset
2064
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2065 /* Output the body of function NODE->DECL. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2066
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2067 static void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2068 output_function (struct cgraph_node *node)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2069 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2070 tree function;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2071 struct function *fn;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2072 basic_block bb;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2073 struct output_block *ob;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2074
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2075 if (streamer_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2076 fprintf (streamer_dump_file, "\nStreaming body of %s\n",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2077 node->name ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2078
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2079 function = node->decl;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2080 fn = DECL_STRUCT_FUNCTION (function);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2081 ob = create_output_block (LTO_section_function_body);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2082
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2083 clear_line_info (ob);
111
kono
parents: 67
diff changeset
2084 ob->symbol = node;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2085
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2086 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2087
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2088 /* Set current_function_decl and cfun. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2089 push_cfun (fn);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2090
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2091 /* Make string 0 be a NULL string. */
111
kono
parents: 67
diff changeset
2092 streamer_write_char_stream (ob->string_stream, 0);
kono
parents: 67
diff changeset
2093
kono
parents: 67
diff changeset
2094 streamer_write_record_start (ob, LTO_function);
kono
parents: 67
diff changeset
2095
kono
parents: 67
diff changeset
2096 /* Output decls for parameters and args. */
kono
parents: 67
diff changeset
2097 stream_write_tree (ob, DECL_RESULT (function), true);
kono
parents: 67
diff changeset
2098 streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
kono
parents: 67
diff changeset
2099
kono
parents: 67
diff changeset
2100 /* Output debug args if available. */
kono
parents: 67
diff changeset
2101 vec<tree, va_gc> **debugargs = decl_debug_args_lookup (function);
kono
parents: 67
diff changeset
2102 if (! debugargs)
kono
parents: 67
diff changeset
2103 streamer_write_uhwi (ob, 0);
kono
parents: 67
diff changeset
2104 else
kono
parents: 67
diff changeset
2105 {
kono
parents: 67
diff changeset
2106 streamer_write_uhwi (ob, (*debugargs)->length ());
kono
parents: 67
diff changeset
2107 for (unsigned i = 0; i < (*debugargs)->length (); ++i)
kono
parents: 67
diff changeset
2108 stream_write_tree (ob, (**debugargs)[i], true);
kono
parents: 67
diff changeset
2109 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2110
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2111 /* Output DECL_INITIAL for the function, which contains the tree of
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2112 lexical scopes. */
111
kono
parents: 67
diff changeset
2113 stream_write_tree (ob, DECL_INITIAL (function), true);
kono
parents: 67
diff changeset
2114 /* As we do not recurse into BLOCK_SUBBLOCKS but only BLOCK_SUPERCONTEXT
kono
parents: 67
diff changeset
2115 collect block tree leafs and stream those. */
kono
parents: 67
diff changeset
2116 auto_vec<tree> block_tree_leafs;
kono
parents: 67
diff changeset
2117 if (DECL_INITIAL (function))
kono
parents: 67
diff changeset
2118 collect_block_tree_leafs (DECL_INITIAL (function), block_tree_leafs);
kono
parents: 67
diff changeset
2119 streamer_write_uhwi (ob, block_tree_leafs.length ());
kono
parents: 67
diff changeset
2120 for (unsigned i = 0; i < block_tree_leafs.length (); ++i)
kono
parents: 67
diff changeset
2121 stream_write_tree (ob, block_tree_leafs[i], true);
kono
parents: 67
diff changeset
2122
kono
parents: 67
diff changeset
2123 /* We also stream abstract functions where we stream only stuff needed for
kono
parents: 67
diff changeset
2124 debug info. */
kono
parents: 67
diff changeset
2125 if (gimple_has_body_p (function))
kono
parents: 67
diff changeset
2126 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2127 /* Fixup loops if required to match discovery done in the reader. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2128 loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2129
111
kono
parents: 67
diff changeset
2130 streamer_write_uhwi (ob, 1);
kono
parents: 67
diff changeset
2131 output_struct_function_base (ob, fn);
kono
parents: 67
diff changeset
2132
kono
parents: 67
diff changeset
2133 /* Output all the SSA names used in the function. */
kono
parents: 67
diff changeset
2134 output_ssa_names (ob, fn);
kono
parents: 67
diff changeset
2135
kono
parents: 67
diff changeset
2136 /* Output any exception handling regions. */
kono
parents: 67
diff changeset
2137 output_eh_regions (ob, fn);
kono
parents: 67
diff changeset
2138
kono
parents: 67
diff changeset
2139
kono
parents: 67
diff changeset
2140 /* We will renumber the statements. The code that does this uses
kono
parents: 67
diff changeset
2141 the same ordering that we use for serializing them so we can use
kono
parents: 67
diff changeset
2142 the same code on the other end and not have to write out the
kono
parents: 67
diff changeset
2143 statement numbers. We do not assign UIDs to PHIs here because
kono
parents: 67
diff changeset
2144 virtual PHIs get re-computed on-the-fly which would make numbers
kono
parents: 67
diff changeset
2145 inconsistent. */
kono
parents: 67
diff changeset
2146 set_gimple_stmt_max_uid (cfun, 0);
kono
parents: 67
diff changeset
2147 FOR_ALL_BB_FN (bb, cfun)
kono
parents: 67
diff changeset
2148 {
kono
parents: 67
diff changeset
2149 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
kono
parents: 67
diff changeset
2150 gsi_next (&gsi))
kono
parents: 67
diff changeset
2151 {
kono
parents: 67
diff changeset
2152 gphi *stmt = gsi.phi ();
kono
parents: 67
diff changeset
2153
kono
parents: 67
diff changeset
2154 /* Virtual PHIs are not going to be streamed. */
kono
parents: 67
diff changeset
2155 if (!virtual_operand_p (gimple_phi_result (stmt)))
kono
parents: 67
diff changeset
2156 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
kono
parents: 67
diff changeset
2157 }
kono
parents: 67
diff changeset
2158 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
kono
parents: 67
diff changeset
2159 gsi_next (&gsi))
kono
parents: 67
diff changeset
2160 {
kono
parents: 67
diff changeset
2161 gimple *stmt = gsi_stmt (gsi);
kono
parents: 67
diff changeset
2162 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
kono
parents: 67
diff changeset
2163 }
kono
parents: 67
diff changeset
2164 }
kono
parents: 67
diff changeset
2165 /* To avoid keeping duplicate gimple IDs in the statements, renumber
kono
parents: 67
diff changeset
2166 virtual phis now. */
kono
parents: 67
diff changeset
2167 FOR_ALL_BB_FN (bb, cfun)
kono
parents: 67
diff changeset
2168 {
kono
parents: 67
diff changeset
2169 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
kono
parents: 67
diff changeset
2170 gsi_next (&gsi))
kono
parents: 67
diff changeset
2171 {
kono
parents: 67
diff changeset
2172 gphi *stmt = gsi.phi ();
kono
parents: 67
diff changeset
2173 if (virtual_operand_p (gimple_phi_result (stmt)))
kono
parents: 67
diff changeset
2174 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
kono
parents: 67
diff changeset
2175 }
kono
parents: 67
diff changeset
2176 }
kono
parents: 67
diff changeset
2177
kono
parents: 67
diff changeset
2178 /* Output the code for the function. */
kono
parents: 67
diff changeset
2179 FOR_ALL_BB_FN (bb, fn)
kono
parents: 67
diff changeset
2180 output_bb (ob, bb, fn);
kono
parents: 67
diff changeset
2181
kono
parents: 67
diff changeset
2182 /* The terminator for this function. */
kono
parents: 67
diff changeset
2183 streamer_write_record_start (ob, LTO_null);
kono
parents: 67
diff changeset
2184
kono
parents: 67
diff changeset
2185 output_cfg (ob, fn);
kono
parents: 67
diff changeset
2186
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2187 loop_optimizer_finalize ();
111
kono
parents: 67
diff changeset
2188 pop_cfun ();
kono
parents: 67
diff changeset
2189 }
kono
parents: 67
diff changeset
2190 else
kono
parents: 67
diff changeset
2191 streamer_write_uhwi (ob, 0);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2192
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2193 /* Create a section to hold the pickled output of this function. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2194 produce_asm (ob, function);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2195
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2196 destroy_output_block (ob);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2197 if (streamer_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2198 fprintf (streamer_dump_file, "Finished streaming %s\n",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2199 node->name ());
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2200 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2201
111
kono
parents: 67
diff changeset
2202 /* Output the body of function NODE->DECL. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2203
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2204 static void
111
kono
parents: 67
diff changeset
2205 output_constructor (struct varpool_node *node)
kono
parents: 67
diff changeset
2206 {
kono
parents: 67
diff changeset
2207 tree var = node->decl;
kono
parents: 67
diff changeset
2208 struct output_block *ob;
kono
parents: 67
diff changeset
2209
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2210 if (streamer_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2211 fprintf (streamer_dump_file, "\nStreaming constructor of %s\n",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2212 node->name ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2213
111
kono
parents: 67
diff changeset
2214 ob = create_output_block (LTO_section_function_body);
kono
parents: 67
diff changeset
2215
kono
parents: 67
diff changeset
2216 clear_line_info (ob);
kono
parents: 67
diff changeset
2217 ob->symbol = node;
kono
parents: 67
diff changeset
2218
kono
parents: 67
diff changeset
2219 /* Make string 0 be a NULL string. */
kono
parents: 67
diff changeset
2220 streamer_write_char_stream (ob->string_stream, 0);
kono
parents: 67
diff changeset
2221
kono
parents: 67
diff changeset
2222 /* Output DECL_INITIAL for the function, which contains the tree of
kono
parents: 67
diff changeset
2223 lexical scopes. */
kono
parents: 67
diff changeset
2224 stream_write_tree (ob, DECL_INITIAL (var), true);
kono
parents: 67
diff changeset
2225
kono
parents: 67
diff changeset
2226 /* Create a section to hold the pickled output of this function. */
kono
parents: 67
diff changeset
2227 produce_asm (ob, var);
kono
parents: 67
diff changeset
2228
kono
parents: 67
diff changeset
2229 destroy_output_block (ob);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2230 if (streamer_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2231 fprintf (streamer_dump_file, "Finished streaming %s\n",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2232 node->name ());
111
kono
parents: 67
diff changeset
2233 }
kono
parents: 67
diff changeset
2234
kono
parents: 67
diff changeset
2235
kono
parents: 67
diff changeset
2236 /* Emit toplevel asms. */
kono
parents: 67
diff changeset
2237
kono
parents: 67
diff changeset
2238 void
kono
parents: 67
diff changeset
2239 lto_output_toplevel_asms (void)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2240 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2241 struct output_block *ob;
111
kono
parents: 67
diff changeset
2242 struct asm_node *can;
kono
parents: 67
diff changeset
2243 char *section_name;
kono
parents: 67
diff changeset
2244 struct lto_simple_header_with_strings header;
kono
parents: 67
diff changeset
2245
kono
parents: 67
diff changeset
2246 if (!symtab->first_asm_symbol ())
kono
parents: 67
diff changeset
2247 return;
kono
parents: 67
diff changeset
2248
kono
parents: 67
diff changeset
2249 ob = create_output_block (LTO_section_asm);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2250
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2251 /* Make string 0 be a NULL string. */
111
kono
parents: 67
diff changeset
2252 streamer_write_char_stream (ob->string_stream, 0);
kono
parents: 67
diff changeset
2253
kono
parents: 67
diff changeset
2254 for (can = symtab->first_asm_symbol (); can; can = can->next)
kono
parents: 67
diff changeset
2255 {
kono
parents: 67
diff changeset
2256 streamer_write_string_cst (ob, ob->main_stream, can->asm_str);
kono
parents: 67
diff changeset
2257 streamer_write_hwi (ob, can->order);
kono
parents: 67
diff changeset
2258 }
kono
parents: 67
diff changeset
2259
kono
parents: 67
diff changeset
2260 streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
kono
parents: 67
diff changeset
2261
kono
parents: 67
diff changeset
2262 section_name = lto_get_section_name (LTO_section_asm, NULL, NULL);
kono
parents: 67
diff changeset
2263 lto_begin_section (section_name, !flag_wpa);
kono
parents: 67
diff changeset
2264 free (section_name);
kono
parents: 67
diff changeset
2265
kono
parents: 67
diff changeset
2266 /* The entire header stream is computed here. */
kono
parents: 67
diff changeset
2267 memset (&header, 0, sizeof (header));
kono
parents: 67
diff changeset
2268
kono
parents: 67
diff changeset
2269 /* Write the header. */
kono
parents: 67
diff changeset
2270 header.major_version = LTO_major_version;
kono
parents: 67
diff changeset
2271 header.minor_version = LTO_minor_version;
kono
parents: 67
diff changeset
2272
kono
parents: 67
diff changeset
2273 header.main_size = ob->main_stream->total_size;
kono
parents: 67
diff changeset
2274 header.string_size = ob->string_stream->total_size;
kono
parents: 67
diff changeset
2275 lto_write_data (&header, sizeof header);
kono
parents: 67
diff changeset
2276
kono
parents: 67
diff changeset
2277 /* Put all of the gimple and the string table out the asm file as a
kono
parents: 67
diff changeset
2278 block of text. */
kono
parents: 67
diff changeset
2279 lto_write_stream (ob->main_stream);
kono
parents: 67
diff changeset
2280 lto_write_stream (ob->string_stream);
kono
parents: 67
diff changeset
2281
kono
parents: 67
diff changeset
2282 lto_end_section ();
kono
parents: 67
diff changeset
2283
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2284 destroy_output_block (ob);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2285 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2286
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2287
111
kono
parents: 67
diff changeset
2288 /* Copy the function body or variable constructor of NODE without deserializing. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2289
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2290 static void
111
kono
parents: 67
diff changeset
2291 copy_function_or_variable (struct symtab_node *node)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2292 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2293 tree function = node->decl;
111
kono
parents: 67
diff changeset
2294 struct lto_file_decl_data *file_data = node->lto_file_data;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2295 const char *data;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2296 size_t len;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2297 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2298 char *section_name =
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2299 lto_get_section_name (LTO_section_function_body, name, NULL);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2300 size_t i, j;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2301 struct lto_in_decl_state *in_state;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2302 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2303
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2304 if (streamer_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2305 fprintf (streamer_dump_file, "Copying section for %s\n", name);
111
kono
parents: 67
diff changeset
2306 lto_begin_section (section_name, false);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2307 free (section_name);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2308
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2309 /* We may have renamed the declaration, e.g., a static function. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2310 name = lto_get_decl_name_mapping (file_data, name);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2311
111
kono
parents: 67
diff changeset
2312 data = lto_get_raw_section_data (file_data, LTO_section_function_body,
kono
parents: 67
diff changeset
2313 name, &len);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2314 gcc_assert (data);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2315
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2316 /* Do a bit copy of the function body. */
111
kono
parents: 67
diff changeset
2317 lto_write_raw_data (data, len);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2318
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2319 /* Copy decls. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2320 in_state =
111
kono
parents: 67
diff changeset
2321 lto_get_function_in_decl_state (node->lto_file_data, function);
kono
parents: 67
diff changeset
2322 out_state->compressed = in_state->compressed;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2323 gcc_assert (in_state);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2324
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2325 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2326 {
111
kono
parents: 67
diff changeset
2327 size_t n = vec_safe_length (in_state->streams[i]);
kono
parents: 67
diff changeset
2328 vec<tree, va_gc> *trees = in_state->streams[i];
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2329 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2330
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2331 /* The out state must have the same indices and the in state.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2332 So just copy the vector. All the encoders in the in state
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2333 must be empty where we reach here. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2334 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
111
kono
parents: 67
diff changeset
2335 encoder->trees.reserve_exact (n);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2336 for (j = 0; j < n; j++)
111
kono
parents: 67
diff changeset
2337 encoder->trees.safe_push ((*trees)[j]);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2338 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2339
111
kono
parents: 67
diff changeset
2340 lto_free_raw_section_data (file_data, LTO_section_function_body, name,
kono
parents: 67
diff changeset
2341 data, len);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2342 lto_end_section ();
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2343 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2344
111
kono
parents: 67
diff changeset
2345 /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
kono
parents: 67
diff changeset
2346
kono
parents: 67
diff changeset
2347 static tree
kono
parents: 67
diff changeset
2348 wrap_refs (tree *tp, int *ws, void *)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2349 {
111
kono
parents: 67
diff changeset
2350 tree t = *tp;
kono
parents: 67
diff changeset
2351 if (handled_component_p (t)
kono
parents: 67
diff changeset
2352 && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL
kono
parents: 67
diff changeset
2353 && TREE_PUBLIC (TREE_OPERAND (t, 0)))
kono
parents: 67
diff changeset
2354 {
kono
parents: 67
diff changeset
2355 tree decl = TREE_OPERAND (t, 0);
kono
parents: 67
diff changeset
2356 tree ptrtype = build_pointer_type (TREE_TYPE (decl));
kono
parents: 67
diff changeset
2357 TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl),
kono
parents: 67
diff changeset
2358 build1 (ADDR_EXPR, ptrtype, decl),
kono
parents: 67
diff changeset
2359 build_int_cst (ptrtype, 0));
kono
parents: 67
diff changeset
2360 TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl);
kono
parents: 67
diff changeset
2361 *ws = 0;
kono
parents: 67
diff changeset
2362 }
kono
parents: 67
diff changeset
2363 else if (TREE_CODE (t) == CONSTRUCTOR)
kono
parents: 67
diff changeset
2364 ;
kono
parents: 67
diff changeset
2365 else if (!EXPR_P (t))
kono
parents: 67
diff changeset
2366 *ws = 0;
kono
parents: 67
diff changeset
2367 return NULL_TREE;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2368 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2369
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2370 /* Remove functions that are no longer used from offload_funcs, and mark the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2371 remaining ones with DECL_PRESERVE_P. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2372
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2373 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2374 prune_offload_funcs (void)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2375 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2376 if (!offload_funcs)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2377 return;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2378
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2379 unsigned ix, ix2;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2380 tree *elem_ptr;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2381 VEC_ORDERED_REMOVE_IF (*offload_funcs, ix, ix2, elem_ptr,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2382 cgraph_node::get (*elem_ptr) == NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2383
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2384 tree fn_decl;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2385 FOR_EACH_VEC_ELT (*offload_funcs, ix, fn_decl)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2386 DECL_PRESERVE_P (fn_decl) = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2387 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2388
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2389 /* Main entry point from the pass manager. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2390
111
kono
parents: 67
diff changeset
2391 void
kono
parents: 67
diff changeset
2392 lto_output (void)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2393 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2394 struct lto_out_decl_state *decl_state;
111
kono
parents: 67
diff changeset
2395 bitmap output = NULL;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2396 int i, n_nodes;
111
kono
parents: 67
diff changeset
2397 lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder;
kono
parents: 67
diff changeset
2398
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2399 prune_offload_funcs ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2400
111
kono
parents: 67
diff changeset
2401 if (flag_checking)
kono
parents: 67
diff changeset
2402 output = lto_bitmap_alloc ();
kono
parents: 67
diff changeset
2403
kono
parents: 67
diff changeset
2404 /* Initialize the streamer. */
kono
parents: 67
diff changeset
2405 lto_streamer_init ();
kono
parents: 67
diff changeset
2406
kono
parents: 67
diff changeset
2407 n_nodes = lto_symtab_encoder_size (encoder);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2408 /* Process only the functions with bodies. */
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2409 for (i = 0; i < n_nodes; i++)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2410 {
111
kono
parents: 67
diff changeset
2411 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
kono
parents: 67
diff changeset
2412 if (cgraph_node *node = dyn_cast <cgraph_node *> (snode))
kono
parents: 67
diff changeset
2413 {
kono
parents: 67
diff changeset
2414 if (lto_symtab_encoder_encode_body_p (encoder, node)
kono
parents: 67
diff changeset
2415 && !node->alias
kono
parents: 67
diff changeset
2416 && (!node->thunk.thunk_p || !node->thunk.add_pointer_bounds_args))
kono
parents: 67
diff changeset
2417 {
kono
parents: 67
diff changeset
2418 if (flag_checking)
kono
parents: 67
diff changeset
2419 {
kono
parents: 67
diff changeset
2420 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
kono
parents: 67
diff changeset
2421 bitmap_set_bit (output, DECL_UID (node->decl));
kono
parents: 67
diff changeset
2422 }
kono
parents: 67
diff changeset
2423 decl_state = lto_new_out_decl_state ();
kono
parents: 67
diff changeset
2424 lto_push_out_decl_state (decl_state);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2425 if (gimple_has_body_p (node->decl)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2426 || (!flag_wpa
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2427 && flag_incremental_link != INCREMENTAL_LINK_LTO)
111
kono
parents: 67
diff changeset
2428 /* Thunks have no body but they may be synthetized
kono
parents: 67
diff changeset
2429 at WPA time. */
kono
parents: 67
diff changeset
2430 || DECL_ARGUMENTS (node->decl))
kono
parents: 67
diff changeset
2431 output_function (node);
kono
parents: 67
diff changeset
2432 else
kono
parents: 67
diff changeset
2433 copy_function_or_variable (node);
kono
parents: 67
diff changeset
2434 gcc_assert (lto_get_out_decl_state () == decl_state);
kono
parents: 67
diff changeset
2435 lto_pop_out_decl_state ();
kono
parents: 67
diff changeset
2436 lto_record_function_out_decl_state (node->decl, decl_state);
kono
parents: 67
diff changeset
2437 }
kono
parents: 67
diff changeset
2438 }
kono
parents: 67
diff changeset
2439 else if (varpool_node *node = dyn_cast <varpool_node *> (snode))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2440 {
111
kono
parents: 67
diff changeset
2441 /* Wrap symbol references inside the ctor in a type
kono
parents: 67
diff changeset
2442 preserving MEM_REF. */
kono
parents: 67
diff changeset
2443 tree ctor = DECL_INITIAL (node->decl);
kono
parents: 67
diff changeset
2444 if (ctor && !in_lto_p)
kono
parents: 67
diff changeset
2445 walk_tree (&ctor, wrap_refs, NULL, NULL);
kono
parents: 67
diff changeset
2446 if (get_symbol_initial_value (encoder, node->decl) == error_mark_node
kono
parents: 67
diff changeset
2447 && lto_symtab_encoder_encode_initializer_p (encoder, node)
kono
parents: 67
diff changeset
2448 && !node->alias)
kono
parents: 67
diff changeset
2449 {
kono
parents: 67
diff changeset
2450 timevar_push (TV_IPA_LTO_CTORS_OUT);
kono
parents: 67
diff changeset
2451 if (flag_checking)
kono
parents: 67
diff changeset
2452 {
kono
parents: 67
diff changeset
2453 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
kono
parents: 67
diff changeset
2454 bitmap_set_bit (output, DECL_UID (node->decl));
kono
parents: 67
diff changeset
2455 }
kono
parents: 67
diff changeset
2456 decl_state = lto_new_out_decl_state ();
kono
parents: 67
diff changeset
2457 lto_push_out_decl_state (decl_state);
kono
parents: 67
diff changeset
2458 if (DECL_INITIAL (node->decl) != error_mark_node
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2459 || (!flag_wpa
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2460 && flag_incremental_link != INCREMENTAL_LINK_LTO))
111
kono
parents: 67
diff changeset
2461 output_constructor (node);
kono
parents: 67
diff changeset
2462 else
kono
parents: 67
diff changeset
2463 copy_function_or_variable (node);
kono
parents: 67
diff changeset
2464 gcc_assert (lto_get_out_decl_state () == decl_state);
kono
parents: 67
diff changeset
2465 lto_pop_out_decl_state ();
kono
parents: 67
diff changeset
2466 lto_record_function_out_decl_state (node->decl, decl_state);
kono
parents: 67
diff changeset
2467 timevar_pop (TV_IPA_LTO_CTORS_OUT);
kono
parents: 67
diff changeset
2468 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2469 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2470 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2471
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2472 /* Emit the callgraph after emitting function bodies. This needs to
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2473 be done now to make sure that all the statements in every function
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2474 have been renumbered so that edges can be associated with call
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2475 statements using the statement UIDs. */
111
kono
parents: 67
diff changeset
2476 output_symtab ();
kono
parents: 67
diff changeset
2477
kono
parents: 67
diff changeset
2478 output_offload_tables ();
kono
parents: 67
diff changeset
2479
kono
parents: 67
diff changeset
2480 #if CHECKING_P
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2481 lto_bitmap_free (output);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2482 #endif
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2483 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2484
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2485 /* Write each node in encoded by ENCODER to OB, as well as those reachable
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2486 from it and required for correct representation of its semantics.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2487 Each node in ENCODER must be a global declaration or a type. A node
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2488 is written only once, even if it appears multiple times in the
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2489 vector. Certain transitively-reachable nodes, such as those
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2490 representing expressions, may be duplicated, but such nodes
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2491 must not appear in ENCODER itself. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2492
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2493 static void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2494 write_global_stream (struct output_block *ob,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2495 struct lto_tree_ref_encoder *encoder)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2496 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2497 tree t;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2498 size_t index;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2499 const size_t size = lto_tree_ref_encoder_size (encoder);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2500
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2501 for (index = 0; index < size; index++)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2502 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2503 t = lto_tree_ref_encoder_get_tree (encoder, index);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2504 if (streamer_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2505 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2506 fprintf (streamer_dump_file, " %i:", (int)index);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2507 print_node_brief (streamer_dump_file, "", t, 4);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2508 fprintf (streamer_dump_file, "\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2509 }
111
kono
parents: 67
diff changeset
2510 if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL))
kono
parents: 67
diff changeset
2511 stream_write_tree (ob, t, false);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2512 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2513 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2514
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2515
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2516 /* Write a sequence of indices into the globals vector corresponding
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2517 to the trees in ENCODER. These are used by the reader to map the
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2518 indices used to refer to global entities within function bodies to
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2519 their referents. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2520
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2521 static void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2522 write_global_references (struct output_block *ob,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2523 struct lto_tree_ref_encoder *encoder)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2524 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2525 tree t;
111
kono
parents: 67
diff changeset
2526 uint32_t index;
kono
parents: 67
diff changeset
2527 const uint32_t size = lto_tree_ref_encoder_size (encoder);
kono
parents: 67
diff changeset
2528
kono
parents: 67
diff changeset
2529 /* Write size and slot indexes as 32-bit unsigned numbers. */
kono
parents: 67
diff changeset
2530 uint32_t *data = XNEWVEC (uint32_t, size + 1);
kono
parents: 67
diff changeset
2531 data[0] = size;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2532
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2533 for (index = 0; index < size; index++)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2534 {
111
kono
parents: 67
diff changeset
2535 unsigned slot_num;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2536
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2537 t = lto_tree_ref_encoder_get_tree (encoder, index);
111
kono
parents: 67
diff changeset
2538 streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num);
kono
parents: 67
diff changeset
2539 gcc_assert (slot_num != (unsigned)-1);
kono
parents: 67
diff changeset
2540 data[index + 1] = slot_num;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2541 }
111
kono
parents: 67
diff changeset
2542
kono
parents: 67
diff changeset
2543 lto_write_data (data, sizeof (int32_t) * (size + 1));
kono
parents: 67
diff changeset
2544 free (data);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2545 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2546
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2547
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2548 /* Write all the streams in an lto_out_decl_state STATE using
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2549 output block OB and output stream OUT_STREAM. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2550
111
kono
parents: 67
diff changeset
2551 void
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2552 lto_output_decl_state_streams (struct output_block *ob,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2553 struct lto_out_decl_state *state)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2554 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2555 int i;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2556
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2557 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2558 write_global_stream (ob, &state->streams[i]);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2559 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2560
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2561
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2562 /* Write all the references in an lto_out_decl_state STATE using
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2563 output block OB and output stream OUT_STREAM. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2564
111
kono
parents: 67
diff changeset
2565 void
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2566 lto_output_decl_state_refs (struct output_block *ob,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2567 struct lto_out_decl_state *state)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2568 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2569 unsigned i;
111
kono
parents: 67
diff changeset
2570 unsigned ref;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2571 tree decl;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2572
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2573 /* Write reference to FUNCTION_DECL. If there is not function,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2574 write reference to void_type_node. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2575 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
111
kono
parents: 67
diff changeset
2576 streamer_tree_cache_lookup (ob->writer_cache, decl, &ref);
kono
parents: 67
diff changeset
2577 gcc_assert (ref != (unsigned)-1);
kono
parents: 67
diff changeset
2578 ref = ref * 2 + (state->compressed ? 1 : 0);
kono
parents: 67
diff changeset
2579 lto_write_data (&ref, sizeof (uint32_t));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2580
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2581 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
111
kono
parents: 67
diff changeset
2582 write_global_references (ob, &state->streams[i]);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2583 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2584
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2585
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2586 /* Return the written size of STATE. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2587
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2588 static size_t
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2589 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2590 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2591 int i;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2592 size_t size;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2593
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2594 size = sizeof (int32_t); /* fn_ref. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2595 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2596 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2597 size += sizeof (int32_t); /* vector size. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2598 size += (lto_tree_ref_encoder_size (&state->streams[i])
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2599 * sizeof (int32_t));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2600 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2601 return size;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2602 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2603
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2604
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2605 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2606 so far. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2607
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2608 static void
111
kono
parents: 67
diff changeset
2609 write_symbol (struct streamer_tree_cache_d *cache,
kono
parents: 67
diff changeset
2610 tree t, hash_set<const char *> *seen, bool alias)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2611 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2612 const char *name;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2613 enum gcc_plugin_symbol_kind kind;
111
kono
parents: 67
diff changeset
2614 enum gcc_plugin_symbol_visibility visibility = GCCPV_DEFAULT;
kono
parents: 67
diff changeset
2615 unsigned slot_num;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2616 uint64_t size;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2617 const char *comdat;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2618 unsigned char c;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2619
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2620 gcc_checking_assert (TREE_PUBLIC (t)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2621 && (TREE_CODE (t) != FUNCTION_DECL
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2622 || !fndecl_built_in_p (t))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2623 && !DECL_ABSTRACT_P (t)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2624 && (!VAR_P (t) || !DECL_HARD_REGISTER (t)));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2625
111
kono
parents: 67
diff changeset
2626 gcc_assert (VAR_OR_FUNCTION_DECL_P (t));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2627
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2628 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2629
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2630 /* This behaves like assemble_name_raw in varasm.c, performing the
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2631 same name manipulations that ASM_OUTPUT_LABELREF does. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2632 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2633
111
kono
parents: 67
diff changeset
2634 if (seen->add (name))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2635 return;
111
kono
parents: 67
diff changeset
2636
kono
parents: 67
diff changeset
2637 streamer_tree_cache_lookup (cache, t, &slot_num);
kono
parents: 67
diff changeset
2638 gcc_assert (slot_num != (unsigned)-1);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2639
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2640 if (DECL_EXTERNAL (t))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2641 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2642 if (DECL_WEAK (t))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2643 kind = GCCPK_WEAKUNDEF;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2644 else
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2645 kind = GCCPK_UNDEF;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2646 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2647 else
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2648 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2649 if (DECL_WEAK (t))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2650 kind = GCCPK_WEAKDEF;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2651 else if (DECL_COMMON (t))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2652 kind = GCCPK_COMMON;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2653 else
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2654 kind = GCCPK_DEF;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2655
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2656 /* When something is defined, it should have node attached. */
111
kono
parents: 67
diff changeset
2657 gcc_assert (alias || !VAR_P (t) || varpool_node::get (t)->definition);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2658 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
111
kono
parents: 67
diff changeset
2659 || (cgraph_node::get (t)
kono
parents: 67
diff changeset
2660 && cgraph_node::get (t)->definition));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2661 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2662
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2663 /* Imitate what default_elf_asm_output_external do.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2664 When symbol is external, we need to output it with DEFAULT visibility
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2665 when compiling with -fvisibility=default, while with HIDDEN visibility
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2666 when symbol has attribute (visibility("hidden")) specified.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2667 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2668 right. */
111
kono
parents: 67
diff changeset
2669
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2670 if (DECL_EXTERNAL (t)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2671 && !targetm.binds_local_p (t))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2672 visibility = GCCPV_DEFAULT;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2673 else
111
kono
parents: 67
diff changeset
2674 switch (DECL_VISIBILITY (t))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2675 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2676 case VISIBILITY_DEFAULT:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2677 visibility = GCCPV_DEFAULT;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2678 break;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2679 case VISIBILITY_PROTECTED:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2680 visibility = GCCPV_PROTECTED;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2681 break;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2682 case VISIBILITY_HIDDEN:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2683 visibility = GCCPV_HIDDEN;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2684 break;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2685 case VISIBILITY_INTERNAL:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2686 visibility = GCCPV_INTERNAL;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2687 break;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2688 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2689
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2690 if (kind == GCCPK_COMMON
111
kono
parents: 67
diff changeset
2691 && DECL_SIZE_UNIT (t)
kono
parents: 67
diff changeset
2692 && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST)
kono
parents: 67
diff changeset
2693 size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2694 else
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2695 size = 0;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2696
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2697 if (DECL_ONE_ONLY (t))
111
kono
parents: 67
diff changeset
2698 comdat = IDENTIFIER_POINTER (decl_comdat_group_id (t));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2699 else
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2700 comdat = "";
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2701
111
kono
parents: 67
diff changeset
2702 lto_write_data (name, strlen (name) + 1);
kono
parents: 67
diff changeset
2703 lto_write_data (comdat, strlen (comdat) + 1);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2704 c = (unsigned char) kind;
111
kono
parents: 67
diff changeset
2705 lto_write_data (&c, 1);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2706 c = (unsigned char) visibility;
111
kono
parents: 67
diff changeset
2707 lto_write_data (&c, 1);
kono
parents: 67
diff changeset
2708 lto_write_data (&size, 8);
kono
parents: 67
diff changeset
2709 lto_write_data (&slot_num, 4);
kono
parents: 67
diff changeset
2710 }
kono
parents: 67
diff changeset
2711
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2712 /* Write an IL symbol table to OB.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2713 SET and VSET are cgraph/varpool node sets we are outputting. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2714
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2715 static void
111
kono
parents: 67
diff changeset
2716 produce_symtab (struct output_block *ob)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2717 {
111
kono
parents: 67
diff changeset
2718 struct streamer_tree_cache_d *cache = ob->writer_cache;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2719 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, NULL);
111
kono
parents: 67
diff changeset
2720 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
kono
parents: 67
diff changeset
2721 lto_symtab_encoder_iterator lsei;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2722
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2723 lto_begin_section (section_name, false);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2724 free (section_name);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2725
111
kono
parents: 67
diff changeset
2726 hash_set<const char *> seen;
kono
parents: 67
diff changeset
2727
kono
parents: 67
diff changeset
2728 /* Write the symbol table.
kono
parents: 67
diff changeset
2729 First write everything defined and then all declarations.
kono
parents: 67
diff changeset
2730 This is necessary to handle cases where we have duplicated symbols. */
kono
parents: 67
diff changeset
2731 for (lsei = lsei_start (encoder);
kono
parents: 67
diff changeset
2732 !lsei_end_p (lsei); lsei_next (&lsei))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2733 {
111
kono
parents: 67
diff changeset
2734 symtab_node *node = lsei_node (lsei);
kono
parents: 67
diff changeset
2735
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2736 if (DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2737 continue;
111
kono
parents: 67
diff changeset
2738 write_symbol (cache, node->decl, &seen, false);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2739 }
111
kono
parents: 67
diff changeset
2740 for (lsei = lsei_start (encoder);
kono
parents: 67
diff changeset
2741 !lsei_end_p (lsei); lsei_next (&lsei))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2742 {
111
kono
parents: 67
diff changeset
2743 symtab_node *node = lsei_node (lsei);
kono
parents: 67
diff changeset
2744
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2745 if (!DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2746 continue;
111
kono
parents: 67
diff changeset
2747 write_symbol (cache, node->decl, &seen, false);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2748 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2749
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2750 lto_end_section ();
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2751 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2752
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2753
111
kono
parents: 67
diff changeset
2754 /* Init the streamer_mode_table for output, where we collect info on what
kono
parents: 67
diff changeset
2755 machine_mode values have been streamed. */
kono
parents: 67
diff changeset
2756 void
kono
parents: 67
diff changeset
2757 lto_output_init_mode_table (void)
kono
parents: 67
diff changeset
2758 {
kono
parents: 67
diff changeset
2759 memset (streamer_mode_table, '\0', MAX_MACHINE_MODE);
kono
parents: 67
diff changeset
2760 }
kono
parents: 67
diff changeset
2761
kono
parents: 67
diff changeset
2762
kono
parents: 67
diff changeset
2763 /* Write the mode table. */
kono
parents: 67
diff changeset
2764 static void
kono
parents: 67
diff changeset
2765 lto_write_mode_table (void)
kono
parents: 67
diff changeset
2766 {
kono
parents: 67
diff changeset
2767 struct output_block *ob;
kono
parents: 67
diff changeset
2768 ob = create_output_block (LTO_section_mode_table);
kono
parents: 67
diff changeset
2769 bitpack_d bp = bitpack_create (ob->main_stream);
kono
parents: 67
diff changeset
2770
kono
parents: 67
diff changeset
2771 /* Ensure that for GET_MODE_INNER (m) != m we have
kono
parents: 67
diff changeset
2772 also the inner mode marked. */
kono
parents: 67
diff changeset
2773 for (int i = 0; i < (int) MAX_MACHINE_MODE; i++)
kono
parents: 67
diff changeset
2774 if (streamer_mode_table[i])
kono
parents: 67
diff changeset
2775 {
kono
parents: 67
diff changeset
2776 machine_mode m = (machine_mode) i;
kono
parents: 67
diff changeset
2777 machine_mode inner_m = GET_MODE_INNER (m);
kono
parents: 67
diff changeset
2778 if (inner_m != m)
kono
parents: 67
diff changeset
2779 streamer_mode_table[(int) inner_m] = 1;
kono
parents: 67
diff changeset
2780 }
kono
parents: 67
diff changeset
2781 /* First stream modes that have GET_MODE_INNER (m) == m,
kono
parents: 67
diff changeset
2782 so that we can refer to them afterwards. */
kono
parents: 67
diff changeset
2783 for (int pass = 0; pass < 2; pass++)
kono
parents: 67
diff changeset
2784 for (int i = 0; i < (int) MAX_MACHINE_MODE; i++)
kono
parents: 67
diff changeset
2785 if (streamer_mode_table[i] && i != (int) VOIDmode && i != (int) BLKmode)
kono
parents: 67
diff changeset
2786 {
kono
parents: 67
diff changeset
2787 machine_mode m = (machine_mode) i;
kono
parents: 67
diff changeset
2788 if ((GET_MODE_INNER (m) == m) ^ (pass == 0))
kono
parents: 67
diff changeset
2789 continue;
kono
parents: 67
diff changeset
2790 bp_pack_value (&bp, m, 8);
kono
parents: 67
diff changeset
2791 bp_pack_enum (&bp, mode_class, MAX_MODE_CLASS, GET_MODE_CLASS (m));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2792 bp_pack_poly_value (&bp, GET_MODE_SIZE (m), 16);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2793 bp_pack_poly_value (&bp, GET_MODE_PRECISION (m), 16);
111
kono
parents: 67
diff changeset
2794 bp_pack_value (&bp, GET_MODE_INNER (m), 8);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2795 bp_pack_poly_value (&bp, GET_MODE_NUNITS (m), 16);
111
kono
parents: 67
diff changeset
2796 switch (GET_MODE_CLASS (m))
kono
parents: 67
diff changeset
2797 {
kono
parents: 67
diff changeset
2798 case MODE_FRACT:
kono
parents: 67
diff changeset
2799 case MODE_UFRACT:
kono
parents: 67
diff changeset
2800 case MODE_ACCUM:
kono
parents: 67
diff changeset
2801 case MODE_UACCUM:
kono
parents: 67
diff changeset
2802 bp_pack_value (&bp, GET_MODE_IBIT (m), 8);
kono
parents: 67
diff changeset
2803 bp_pack_value (&bp, GET_MODE_FBIT (m), 8);
kono
parents: 67
diff changeset
2804 break;
kono
parents: 67
diff changeset
2805 case MODE_FLOAT:
kono
parents: 67
diff changeset
2806 case MODE_DECIMAL_FLOAT:
kono
parents: 67
diff changeset
2807 bp_pack_string (ob, &bp, REAL_MODE_FORMAT (m)->name, true);
kono
parents: 67
diff changeset
2808 break;
kono
parents: 67
diff changeset
2809 default:
kono
parents: 67
diff changeset
2810 break;
kono
parents: 67
diff changeset
2811 }
kono
parents: 67
diff changeset
2812 bp_pack_string (ob, &bp, GET_MODE_NAME (m), true);
kono
parents: 67
diff changeset
2813 }
kono
parents: 67
diff changeset
2814 bp_pack_value (&bp, VOIDmode, 8);
kono
parents: 67
diff changeset
2815
kono
parents: 67
diff changeset
2816 streamer_write_bitpack (&bp);
kono
parents: 67
diff changeset
2817
kono
parents: 67
diff changeset
2818 char *section_name
kono
parents: 67
diff changeset
2819 = lto_get_section_name (LTO_section_mode_table, NULL, NULL);
kono
parents: 67
diff changeset
2820 lto_begin_section (section_name, !flag_wpa);
kono
parents: 67
diff changeset
2821 free (section_name);
kono
parents: 67
diff changeset
2822
kono
parents: 67
diff changeset
2823 /* The entire header stream is computed here. */
kono
parents: 67
diff changeset
2824 struct lto_simple_header_with_strings header;
kono
parents: 67
diff changeset
2825 memset (&header, 0, sizeof (header));
kono
parents: 67
diff changeset
2826
kono
parents: 67
diff changeset
2827 /* Write the header. */
kono
parents: 67
diff changeset
2828 header.major_version = LTO_major_version;
kono
parents: 67
diff changeset
2829 header.minor_version = LTO_minor_version;
kono
parents: 67
diff changeset
2830
kono
parents: 67
diff changeset
2831 header.main_size = ob->main_stream->total_size;
kono
parents: 67
diff changeset
2832 header.string_size = ob->string_stream->total_size;
kono
parents: 67
diff changeset
2833 lto_write_data (&header, sizeof header);
kono
parents: 67
diff changeset
2834
kono
parents: 67
diff changeset
2835 /* Put all of the gimple and the string table out the asm file as a
kono
parents: 67
diff changeset
2836 block of text. */
kono
parents: 67
diff changeset
2837 lto_write_stream (ob->main_stream);
kono
parents: 67
diff changeset
2838 lto_write_stream (ob->string_stream);
kono
parents: 67
diff changeset
2839
kono
parents: 67
diff changeset
2840 lto_end_section ();
kono
parents: 67
diff changeset
2841 destroy_output_block (ob);
kono
parents: 67
diff changeset
2842 }
kono
parents: 67
diff changeset
2843
kono
parents: 67
diff changeset
2844
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2845 /* This pass is run after all of the functions are serialized and all
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2846 of the IPA passes have written their serialized forms. This pass
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2847 causes the vector of all of the global decls and types used from
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2848 this file to be written in to a section that can then be read in to
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2849 recover these on other side. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2850
111
kono
parents: 67
diff changeset
2851 void
kono
parents: 67
diff changeset
2852 produce_asm_for_decls (void)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2853 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2854 struct lto_out_decl_state *out_state;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2855 struct lto_out_decl_state *fn_out_state;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2856 struct lto_decl_header header;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2857 char *section_name;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2858 struct output_block *ob;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2859 unsigned idx, num_fns;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2860 size_t decl_state_size;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2861 int32_t num_decl_states;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2862
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2863 ob = create_output_block (LTO_section_decls);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2864
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2865 memset (&header, 0, sizeof (struct lto_decl_header));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2866
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2867 section_name = lto_get_section_name (LTO_section_decls, NULL, NULL);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2868 lto_begin_section (section_name, !flag_wpa);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2869 free (section_name);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2870
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2871 /* Make string 0 be a NULL string. */
111
kono
parents: 67
diff changeset
2872 streamer_write_char_stream (ob->string_stream, 0);
kono
parents: 67
diff changeset
2873
kono
parents: 67
diff changeset
2874 gcc_assert (!alias_pairs);
kono
parents: 67
diff changeset
2875
kono
parents: 67
diff changeset
2876 /* Get rid of the global decl state hash tables to save some memory. */
kono
parents: 67
diff changeset
2877 out_state = lto_get_out_decl_state ();
kono
parents: 67
diff changeset
2878 for (int i = 0; i < LTO_N_DECL_STREAMS; i++)
kono
parents: 67
diff changeset
2879 if (out_state->streams[i].tree_hash_table)
kono
parents: 67
diff changeset
2880 {
kono
parents: 67
diff changeset
2881 delete out_state->streams[i].tree_hash_table;
kono
parents: 67
diff changeset
2882 out_state->streams[i].tree_hash_table = NULL;
kono
parents: 67
diff changeset
2883 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2884
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2885 /* Write the global symbols. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2886 if (streamer_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2887 fprintf (streamer_dump_file, "Outputting global stream\n");
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2888 lto_output_decl_state_streams (ob, out_state);
111
kono
parents: 67
diff changeset
2889 num_fns = lto_function_decl_states.length ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2890 for (idx = 0; idx < num_fns; idx++)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2891 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2892 fn_out_state =
111
kono
parents: 67
diff changeset
2893 lto_function_decl_states[idx];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2894 if (streamer_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2895 fprintf (streamer_dump_file, "Outputting stream for %s\n",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2896 IDENTIFIER_POINTER
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2897 (DECL_ASSEMBLER_NAME (fn_out_state->fn_decl)));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2898 lto_output_decl_state_streams (ob, fn_out_state);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2899 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2900
111
kono
parents: 67
diff changeset
2901 header.major_version = LTO_major_version;
kono
parents: 67
diff changeset
2902 header.minor_version = LTO_minor_version;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2903
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2904 /* Currently not used. This field would allow us to preallocate
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2905 the globals vector, so that it need not be resized as it is extended. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2906 header.num_nodes = -1;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2907
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2908 /* Compute the total size of all decl out states. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2909 decl_state_size = sizeof (int32_t);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2910 decl_state_size += lto_out_decl_state_written_size (out_state);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2911 for (idx = 0; idx < num_fns; idx++)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2912 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2913 fn_out_state =
111
kono
parents: 67
diff changeset
2914 lto_function_decl_states[idx];
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2915 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2916 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2917 header.decl_state_size = decl_state_size;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2918
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2919 header.main_size = ob->main_stream->total_size;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2920 header.string_size = ob->string_stream->total_size;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2921
111
kono
parents: 67
diff changeset
2922 lto_write_data (&header, sizeof header);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2923
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2924 /* Write the main out-decl state, followed by out-decl states of
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2925 functions. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2926 num_decl_states = num_fns + 1;
111
kono
parents: 67
diff changeset
2927 lto_write_data (&num_decl_states, sizeof (num_decl_states));
kono
parents: 67
diff changeset
2928 lto_output_decl_state_refs (ob, out_state);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2929 for (idx = 0; idx < num_fns; idx++)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2930 {
111
kono
parents: 67
diff changeset
2931 fn_out_state = lto_function_decl_states[idx];
kono
parents: 67
diff changeset
2932 lto_output_decl_state_refs (ob, fn_out_state);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2933 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2934
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2935 lto_write_stream (ob->main_stream);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2936 lto_write_stream (ob->string_stream);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2937
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2938 lto_end_section ();
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2939
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2940 /* Write the symbol table. It is used by linker to determine dependencies
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2941 and thus we can skip it for WPA. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2942 if (!flag_wpa)
111
kono
parents: 67
diff changeset
2943 produce_symtab (ob);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2944
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2945 /* Write command line opts. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2946 lto_write_options ();
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2947
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2948 /* Deallocate memory and clean up. */
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2949 for (idx = 0; idx < num_fns; idx++)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2950 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2951 fn_out_state =
111
kono
parents: 67
diff changeset
2952 lto_function_decl_states[idx];
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2953 lto_delete_out_decl_state (fn_out_state);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2954 }
111
kono
parents: 67
diff changeset
2955 lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder);
kono
parents: 67
diff changeset
2956 lto_function_decl_states.release ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2957 destroy_output_block (ob);
111
kono
parents: 67
diff changeset
2958 if (lto_stream_offload_p)
kono
parents: 67
diff changeset
2959 lto_write_mode_table ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2960 }