Mercurial > hg > CbC > CbC_gcc
annotate gcc/lto-cgraph.c @ 158:494b0b89df80 default tip
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 18:13:55 +0900 |
parents | 1830386684a0 |
children |
rev | line source |
---|---|
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 /* Write and read the cgraph to the memory mapped representation of a |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 .o file. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 |
145 | 4 Copyright (C) 2009-2020 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
|
5 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
|
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 | 26 #include "backend.h" |
27 #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
|
28 #include "tree.h" |
111 | 29 #include "gimple.h" |
30 #include "predict.h" | |
31 #include "stringpool.h" | |
32 #include "tree-streamer.h" | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 #include "cgraph.h" |
111 | 34 #include "tree-pass.h" |
35 #include "profile.h" | |
36 #include "context.h" | |
37 #include "pass_manager.h" | |
38 #include "ipa-utils.h" | |
39 #include "omp-offload.h" | |
40 #include "stringpool.h" | |
41 #include "attribs.h" | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 |
111 | 43 /* True when asm nodes has been output. */ |
44 bool asm_nodes_output = false; | |
45 | |
46 static void output_cgraph_opt_summary (void); | |
47 static void input_cgraph_opt_summary (vec<symtab_node *> nodes); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
48 |
111 | 49 /* Number of LDPR values known to GCC. */ |
50 #define LDPR_NUM_KNOWN (LDPR_PREVAILING_DEF_IRONLY_EXP + 1) | |
51 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
52 /* Cgraph streaming is organized as set of record whose type |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
53 is indicated by a tag. */ |
111 | 54 enum LTO_symtab_tags |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
55 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
56 /* Must leave 0 for the stopper. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
57 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
58 /* Cgraph node without body available. */ |
111 | 59 LTO_symtab_unavail_node = 1, |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
60 /* Cgraph node with function body. */ |
111 | 61 LTO_symtab_analyzed_node, |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
62 /* Cgraph edges. */ |
111 | 63 LTO_symtab_edge, |
64 LTO_symtab_indirect_edge, | |
65 LTO_symtab_variable, | |
66 LTO_symtab_last_tag | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
67 }; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
68 |
111 | 69 /* Create a new symtab encoder. |
70 if FOR_INPUT, the encoder allocate only datastructures needed | |
71 to read the symtab. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 |
111 | 73 lto_symtab_encoder_t |
74 lto_symtab_encoder_new (bool for_input) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 { |
111 | 76 lto_symtab_encoder_t encoder = XCNEW (struct lto_symtab_encoder_d); |
77 | |
78 if (!for_input) | |
79 encoder->map = new hash_map<symtab_node *, size_t>; | |
80 encoder->nodes.create (0); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
81 return encoder; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
82 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
83 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
84 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
85 /* Delete ENCODER and its components. */ |
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 void |
111 | 88 lto_symtab_encoder_delete (lto_symtab_encoder_t encoder) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89 { |
111 | 90 encoder->nodes.release (); |
91 if (encoder->map) | |
92 delete encoder->map; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93 free (encoder); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
94 } |
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 |
111 | 97 /* Return the existing reference number of NODE in the symtab encoder in |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
98 output block OB. Assign a new reference if this is the first time |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
99 NODE is encoded. */ |
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 int |
111 | 102 lto_symtab_encoder_encode (lto_symtab_encoder_t encoder, |
103 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
|
104 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
105 int ref; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
106 |
111 | 107 if (!encoder->map) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
108 { |
111 | 109 lto_encoder_entry entry = {node, false, false, false}; |
110 | |
111 ref = encoder->nodes.length (); | |
112 encoder->nodes.safe_push (entry); | |
113 return ref; | |
114 } | |
115 | |
116 size_t *slot = encoder->map->get (node); | |
117 if (!slot || !*slot) | |
118 { | |
119 lto_encoder_entry entry = {node, false, false, false}; | |
120 ref = encoder->nodes.length (); | |
121 if (!slot) | |
122 encoder->map->put (node, ref + 1); | |
123 encoder->nodes.safe_push (entry); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
124 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
125 else |
111 | 126 ref = *slot - 1; |
55
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 return ref; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
129 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130 |
111 | 131 /* Remove NODE from encoder. */ |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132 |
111 | 133 bool |
134 lto_symtab_encoder_delete_node (lto_symtab_encoder_t encoder, | |
135 symtab_node *node) | |
136 { | |
137 int index; | |
138 lto_encoder_entry last_node; | |
139 | |
140 size_t *slot = encoder->map->get (node); | |
141 if (slot == NULL || !*slot) | |
142 return false; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
143 |
111 | 144 index = *slot - 1; |
145 gcc_checking_assert (encoder->nodes[index].node == node); | |
146 | |
147 /* Remove from vector. We do this by swapping node with the last element | |
148 of the vector. */ | |
149 last_node = encoder->nodes.pop (); | |
150 if (last_node.node != node) | |
151 { | |
152 gcc_assert (encoder->map->put (last_node.node, index + 1)); | |
153 | |
154 /* Move the last element to the original spot of NODE. */ | |
155 encoder->nodes[index] = last_node; | |
156 } | |
157 | |
158 /* Remove element from hash table. */ | |
159 encoder->map->remove (node); | |
160 return true; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
161 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
162 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
163 |
111 | 164 /* Return TRUE if we should encode the body of NODE (if any). */ |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
165 |
111 | 166 bool |
167 lto_symtab_encoder_encode_body_p (lto_symtab_encoder_t encoder, | |
168 struct cgraph_node *node) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
169 { |
111 | 170 int index = lto_symtab_encoder_lookup (encoder, node); |
171 return encoder->nodes[index].body; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
172 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
173 |
111 | 174 /* Specify that we encode the body of NODE in this partition. */ |
175 | |
176 static void | |
177 lto_set_symtab_encoder_encode_body (lto_symtab_encoder_t encoder, | |
178 struct cgraph_node *node) | |
179 { | |
180 int index = lto_symtab_encoder_encode (encoder, node); | |
181 gcc_checking_assert (encoder->nodes[index].node == node); | |
182 encoder->nodes[index].body = true; | |
183 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
184 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
185 /* Return TRUE if we should encode initializer of NODE (if any). */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
186 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
187 bool |
111 | 188 lto_symtab_encoder_encode_initializer_p (lto_symtab_encoder_t encoder, |
189 varpool_node *node) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
190 { |
111 | 191 int index = lto_symtab_encoder_lookup (encoder, node); |
192 if (index == LCC_NOT_FOUND) | |
193 return false; | |
194 return encoder->nodes[index].initializer; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
195 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
196 |
111 | 197 /* Specify that we should encode initializer of NODE (if any). */ |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
198 |
111 | 199 static void |
200 lto_set_symtab_encoder_encode_initializer (lto_symtab_encoder_t encoder, | |
201 varpool_node *node) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
202 { |
111 | 203 int index = lto_symtab_encoder_lookup (encoder, node); |
204 encoder->nodes[index].initializer = true; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
205 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
206 |
111 | 207 /* Return TRUE if NODE is in this partition. */ |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
208 |
111 | 209 bool |
210 lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t encoder, | |
211 symtab_node *node) | |
212 { | |
213 int index = lto_symtab_encoder_lookup (encoder, node); | |
214 if (index == LCC_NOT_FOUND) | |
215 return false; | |
216 return encoder->nodes[index].in_partition; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
217 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
218 |
111 | 219 /* Specify that NODE is in this partition. */ |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
220 |
111 | 221 void |
222 lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t encoder, | |
223 symtab_node *node) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
224 { |
111 | 225 int index = lto_symtab_encoder_encode (encoder, node); |
226 encoder->nodes[index].in_partition = true; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
227 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
228 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
229 /* Output the cgraph EDGE to OB using ENCODER. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
230 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
231 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
232 lto_output_edge (struct lto_simple_output_block *ob, struct cgraph_edge *edge, |
111 | 233 lto_symtab_encoder_t encoder) |
55
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 unsigned int uid; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
236 intptr_t 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
|
237 struct bitpack_d bp; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
238 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
239 if (edge->indirect_unknown_callee) |
111 | 240 streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag, |
241 LTO_symtab_indirect_edge); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
242 else |
111 | 243 streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag, |
244 LTO_symtab_edge); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
245 |
111 | 246 ref = lto_symtab_encoder_lookup (encoder, edge->caller); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
247 gcc_assert (ref != LCC_NOT_FOUND); |
111 | 248 streamer_write_hwi_stream (ob->main_stream, ref); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
249 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
250 if (!edge->indirect_unknown_callee) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
251 { |
111 | 252 ref = lto_symtab_encoder_lookup (encoder, edge->callee); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
253 gcc_assert (ref != LCC_NOT_FOUND); |
111 | 254 streamer_write_hwi_stream (ob->main_stream, ref); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
255 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
256 |
111 | 257 edge->count.stream_out (ob->main_stream); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
258 |
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
|
259 bp = bitpack_create (ob->main_stream); |
145 | 260 uid = !edge->call_stmt ? edge->lto_stmt_uid |
261 : gimple_uid (edge->call_stmt) + 1; | |
111 | 262 bp_pack_enum (&bp, cgraph_inline_failed_t, |
263 CIF_N_REASONS, edge->inline_failed); | |
145 | 264 gcc_checking_assert (uid || edge->caller->thunk.thunk_p); |
111 | 265 bp_pack_var_len_unsigned (&bp, uid); |
145 | 266 bp_pack_value (&bp, edge->speculative_id, 16); |
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
|
267 bp_pack_value (&bp, edge->indirect_inlining_edge, 1); |
111 | 268 bp_pack_value (&bp, edge->speculative, 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
|
269 bp_pack_value (&bp, edge->call_stmt_cannot_inline_p, 1); |
111 | 270 gcc_assert (!edge->call_stmt_cannot_inline_p |
271 || edge->inline_failed != CIF_BODY_NOT_AVAILABLE); | |
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
|
272 bp_pack_value (&bp, edge->can_throw_external, 1); |
111 | 273 bp_pack_value (&bp, edge->in_polymorphic_cdtor, 1); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
274 if (edge->indirect_unknown_callee) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
275 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
276 int flags = edge->indirect_info->ecf_flags; |
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
|
277 bp_pack_value (&bp, (flags & ECF_CONST) != 0, 1); |
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
|
278 bp_pack_value (&bp, (flags & ECF_PURE) != 0, 1); |
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
|
279 bp_pack_value (&bp, (flags & ECF_NORETURN) != 0, 1); |
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
|
280 bp_pack_value (&bp, (flags & ECF_MALLOC) != 0, 1); |
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
|
281 bp_pack_value (&bp, (flags & ECF_NOTHROW) != 0, 1); |
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
|
282 bp_pack_value (&bp, (flags & ECF_RETURNS_TWICE) != 0, 1); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
283 /* Flags that should not appear on indirect calls. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
284 gcc_assert (!(flags & (ECF_LOOPING_CONST_OR_PURE |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
285 | ECF_MAY_BE_ALLOCA |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
286 | ECF_SIBCALL |
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 | ECF_LEAF |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
288 | ECF_NOVOPS))); |
145 | 289 |
290 bp_pack_value (&bp, edge->indirect_info->num_speculative_call_targets, | |
291 16); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
292 } |
111 | 293 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
|
294 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
295 |
111 | 296 /* Return if NODE contain references from other partitions. */ |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
297 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
298 bool |
111 | 299 referenced_from_other_partition_p (symtab_node *node, lto_symtab_encoder_t encoder) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
300 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
301 int i; |
111 | 302 struct ipa_ref *ref = NULL; |
303 | |
304 for (i = 0; node->iterate_referring (i, ref); i++) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
305 { |
111 | 306 /* Ignore references from non-offloadable nodes while streaming NODE into |
307 offload LTO section. */ | |
308 if (!ref->referring->need_lto_streaming) | |
309 continue; | |
310 | |
311 if (ref->referring->in_other_partition | |
312 || !lto_symtab_encoder_in_partition_p (encoder, ref->referring)) | |
313 return true; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
314 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
315 return false; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
316 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
317 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
318 /* Return true when node is reachable from other partition. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
319 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
320 bool |
111 | 321 reachable_from_other_partition_p (struct cgraph_node *node, lto_symtab_encoder_t encoder) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
322 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
323 struct cgraph_edge *e; |
111 | 324 if (!node->definition) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
325 return false; |
145 | 326 if (node->inlined_to) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
327 return false; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
328 for (e = node->callers; e; e = e->next_caller) |
111 | 329 { |
330 /* Ignore references from non-offloadable nodes while streaming NODE into | |
331 offload LTO section. */ | |
332 if (!e->caller->need_lto_streaming) | |
333 continue; | |
334 | |
335 if (e->caller->in_other_partition | |
336 || !lto_symtab_encoder_in_partition_p (encoder, e->caller)) | |
337 return true; | |
338 } | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
339 return false; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
340 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
341 |
111 | 342 /* Return if NODE contain references from other partitions. */ |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
343 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
344 bool |
111 | 345 referenced_from_this_partition_p (symtab_node *node, |
346 lto_symtab_encoder_t encoder) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
347 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
348 int i; |
111 | 349 struct ipa_ref *ref = NULL; |
350 | |
351 for (i = 0; node->iterate_referring (i, ref); i++) | |
352 if (lto_symtab_encoder_in_partition_p (encoder, ref->referring)) | |
353 return true; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
354 return false; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
355 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
356 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
357 /* Return true when node is reachable from other partition. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
358 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
359 bool |
111 | 360 reachable_from_this_partition_p (struct cgraph_node *node, lto_symtab_encoder_t encoder) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
361 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
362 struct cgraph_edge *e; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
363 for (e = node->callers; e; e = e->next_caller) |
111 | 364 if (lto_symtab_encoder_in_partition_p (encoder, e->caller)) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
365 return true; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
366 return false; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
367 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
368 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
369 /* Output the cgraph NODE to OB. ENCODER is used to find the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
370 reference number of NODE->inlined_to. SET is the set of nodes we |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
371 are writing to the current file. If NODE is not in SET, then NODE |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
372 is a boundary of a cgraph_node_set and we pretend NODE just has a |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
373 decl and no callees. WRITTEN_DECLS is the set of FUNCTION_DECLs |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
374 that have had their callgraph node written so far. 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
|
375 determine if NODE is a clone of a previously written node. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
376 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
377 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
378 lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node, |
111 | 379 lto_symtab_encoder_t encoder) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
380 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
381 unsigned int tag; |
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
|
382 struct bitpack_d bp; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
383 bool boundary_p; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
384 intptr_t ref; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
385 bool in_other_partition = false; |
111 | 386 struct cgraph_node *clone_of, *ultimate_clone_of; |
387 ipa_opt_pass_d *pass; | |
388 int i; | |
389 const char *comdat; | |
390 const char *section; | |
391 tree group; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
392 |
111 | 393 boundary_p = !lto_symtab_encoder_in_partition_p (encoder, node); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
394 |
111 | 395 if (node->analyzed && (!boundary_p || node->alias |
145 | 396 || (node->thunk.thunk_p && !node->inlined_to))) |
111 | 397 tag = LTO_symtab_analyzed_node; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
398 else |
111 | 399 tag = LTO_symtab_unavail_node; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
400 |
111 | 401 streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag, |
402 tag); | |
403 streamer_write_hwi_stream (ob->main_stream, node->order); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
404 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
405 /* In WPA mode, we only output part of the call-graph. Also, we |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
406 fake cgraph node attributes. There are two cases that we care. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
407 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
408 Boundary nodes: There are nodes that are not part of SET but are |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
409 called from within SET. We artificially make them look like |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
410 externally visible nodes with no function body. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
411 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
412 Cherry-picked nodes: These are nodes we pulled from other |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
413 translation units into SET during IPA-inlining. We make them as |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
414 local static nodes to prevent clashes with other local statics. */ |
111 | 415 if (boundary_p && node->analyzed |
416 && node->get_partitioning_class () == SYMBOL_PARTITION) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
417 { |
145 | 418 /* Inline clones cannot be part of boundary. |
419 gcc_assert (!node->inlined_to); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
420 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
421 FIXME: At the moment they can be, when partition contains an inline |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
422 clone that is clone of inline clone from outside partition. We can |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
423 reshape the clone tree and make other tree to be the root, but it |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
424 needs a bit extra work and will be promplty done by cgraph_remove_node |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
425 after reading back. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
426 in_other_partition = 1; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
427 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
428 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
429 clone_of = node->clone_of; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
430 while (clone_of |
111 | 431 && (ref = lto_symtab_encoder_lookup (encoder, clone_of)) == LCC_NOT_FOUND) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
432 if (clone_of->prev_sibling_clone) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
433 clone_of = clone_of->prev_sibling_clone; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
434 else |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
435 clone_of = clone_of->clone_of; |
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
|
436 |
111 | 437 /* See if body of the master function is output. If not, we are seeing only |
438 an declaration and we do not need to pass down clone tree. */ | |
439 ultimate_clone_of = clone_of; | |
440 while (ultimate_clone_of && ultimate_clone_of->clone_of) | |
441 ultimate_clone_of = ultimate_clone_of->clone_of; | |
442 | |
443 if (clone_of && !lto_symtab_encoder_encode_body_p (encoder, ultimate_clone_of)) | |
444 clone_of = NULL; | |
445 | |
446 if (tag == LTO_symtab_analyzed_node) | |
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
|
447 gcc_assert (clone_of || !node->clone_of); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
448 if (!clone_of) |
111 | 449 streamer_write_hwi_stream (ob->main_stream, LCC_NOT_FOUND); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
450 else |
111 | 451 streamer_write_hwi_stream (ob->main_stream, ref); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
452 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
453 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
454 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, node->decl); |
111 | 455 node->count.stream_out (ob->main_stream); |
456 streamer_write_hwi_stream (ob->main_stream, node->count_materialization_scale); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
457 |
111 | 458 streamer_write_hwi_stream (ob->main_stream, |
459 node->ipa_transforms_to_apply.length ()); | |
460 FOR_EACH_VEC_ELT (node->ipa_transforms_to_apply, i, pass) | |
461 streamer_write_hwi_stream (ob->main_stream, pass->static_pass_number); | |
462 | |
463 if (tag == LTO_symtab_analyzed_node) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
464 { |
145 | 465 if (node->inlined_to) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
466 { |
145 | 467 ref = lto_symtab_encoder_lookup (encoder, node->inlined_to); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
468 gcc_assert (ref != LCC_NOT_FOUND); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
469 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
470 else |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
471 ref = LCC_NOT_FOUND; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
472 |
111 | 473 streamer_write_hwi_stream (ob->main_stream, ref); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
474 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
475 |
111 | 476 group = node->get_comdat_group (); |
477 if (group) | |
478 comdat = IDENTIFIER_POINTER (group); | |
479 else | |
480 comdat = ""; | |
481 streamer_write_data_stream (ob->main_stream, comdat, strlen (comdat) + 1); | |
482 | |
483 if (group) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
484 { |
111 | 485 if (node->same_comdat_group) |
486 { | |
487 ref = LCC_NOT_FOUND; | |
488 for (struct symtab_node *n = node->same_comdat_group; | |
489 ref == LCC_NOT_FOUND && n != node; n = n->same_comdat_group) | |
490 ref = lto_symtab_encoder_lookup (encoder, n); | |
491 } | |
492 else | |
493 ref = LCC_NOT_FOUND; | |
494 streamer_write_hwi_stream (ob->main_stream, ref); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
495 } |
111 | 496 |
497 section = node->get_section (); | |
498 if (!section) | |
499 section = ""; | |
500 | |
501 streamer_write_hwi_stream (ob->main_stream, node->tp_first_run); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
502 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
503 bp = bitpack_create (ob->main_stream); |
145 | 504 bp_pack_value (&bp, node->local, 1); |
111 | 505 bp_pack_value (&bp, node->externally_visible, 1); |
506 bp_pack_value (&bp, node->no_reorder, 1); | |
507 bp_pack_value (&bp, node->definition, 1); | |
145 | 508 bp_pack_value (&bp, node->versionable, 1); |
509 bp_pack_value (&bp, node->can_change_signature, 1); | |
510 bp_pack_value (&bp, node->redefined_extern_inline, 1); | |
111 | 511 bp_pack_value (&bp, node->force_output, 1); |
512 bp_pack_value (&bp, node->forced_by_abi, 1); | |
513 bp_pack_value (&bp, node->unique_name, 1); | |
514 bp_pack_value (&bp, node->body_removed, 1); | |
515 bp_pack_value (&bp, node->implicit_section, 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
|
516 bp_pack_value (&bp, node->address_taken, 1); |
111 | 517 bp_pack_value (&bp, tag == LTO_symtab_analyzed_node |
518 && node->get_partitioning_class () == SYMBOL_PARTITION | |
519 && (reachable_from_other_partition_p (node, encoder) | |
520 || referenced_from_other_partition_p (node, encoder)), 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
|
521 bp_pack_value (&bp, node->lowered, 1); |
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
|
522 bp_pack_value (&bp, in_other_partition, 1); |
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
|
523 bp_pack_value (&bp, node->alias, 1); |
111 | 524 bp_pack_value (&bp, node->transparent_alias, 1); |
525 bp_pack_value (&bp, node->weakref, 1); | |
145 | 526 bp_pack_value (&bp, node->symver, 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
|
527 bp_pack_value (&bp, node->frequency, 2); |
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
|
528 bp_pack_value (&bp, node->only_called_at_startup, 1); |
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
|
529 bp_pack_value (&bp, node->only_called_at_exit, 1); |
111 | 530 bp_pack_value (&bp, node->tm_clone, 1); |
531 bp_pack_value (&bp, node->calls_comdat_local, 1); | |
532 bp_pack_value (&bp, node->icf_merged, 1); | |
533 bp_pack_value (&bp, node->nonfreeing_fn, 1); | |
145 | 534 bp_pack_value (&bp, node->merged_comdat, 1); |
535 bp_pack_value (&bp, node->merged_extern_inline, 1); | |
111 | 536 bp_pack_value (&bp, node->thunk.thunk_p, 1); |
537 bp_pack_value (&bp, node->parallelized_function, 1); | |
538 bp_pack_enum (&bp, ld_plugin_symbol_resolution, | |
131 | 539 LDPR_NUM_KNOWN, |
540 /* When doing incremental link, we will get new resolution | |
541 info next time we process the file. */ | |
542 flag_incremental_link ? LDPR_UNKNOWN : node->resolution); | |
111 | 543 bp_pack_value (&bp, node->split_part, 1); |
544 streamer_write_bitpack (&bp); | |
545 streamer_write_data_stream (ob->main_stream, section, strlen (section) + 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
|
546 |
145 | 547 /* Stream thunk info always because we use it in |
548 ipa_polymorphic_call_context::ipa_polymorphic_call_context | |
549 to properly interpret THIS pointers for thunks that has been converted | |
550 to Gimple. */ | |
551 if (node->definition) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
552 { |
111 | 553 streamer_write_uhwi_stream |
554 (ob->main_stream, | |
555 1 + (node->thunk.this_adjusting != 0) * 2 | |
145 | 556 + (node->thunk.virtual_offset_p != 0) * 4); |
111 | 557 streamer_write_uhwi_stream (ob->main_stream, node->thunk.fixed_offset); |
558 streamer_write_uhwi_stream (ob->main_stream, node->thunk.virtual_value); | |
131 | 559 streamer_write_uhwi_stream (ob->main_stream, node->thunk.indirect_offset); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
560 } |
111 | 561 streamer_write_hwi_stream (ob->main_stream, node->profile_id); |
145 | 562 streamer_write_hwi_stream (ob->main_stream, node->unit_id); |
111 | 563 if (DECL_STATIC_CONSTRUCTOR (node->decl)) |
564 streamer_write_hwi_stream (ob->main_stream, node->get_init_priority ()); | |
565 if (DECL_STATIC_DESTRUCTOR (node->decl)) | |
566 streamer_write_hwi_stream (ob->main_stream, node->get_fini_priority ()); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
567 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
568 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
569 /* Output the varpool NODE to OB. |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
570 If NODE is not in SET, then NODE is a boundary. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
571 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
572 static void |
111 | 573 lto_output_varpool_node (struct lto_simple_output_block *ob, varpool_node *node, |
574 lto_symtab_encoder_t encoder) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
575 { |
111 | 576 bool boundary_p = !lto_symtab_encoder_in_partition_p (encoder, node); |
577 bool encode_initializer_p | |
578 = (node->definition | |
579 && lto_symtab_encoder_encode_initializer_p (encoder, node)); | |
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
|
580 struct bitpack_d bp; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
581 int ref; |
111 | 582 const char *comdat; |
583 const char *section; | |
584 tree group; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
585 |
111 | 586 gcc_assert (!encode_initializer_p || node->definition); |
587 gcc_assert (boundary_p || encode_initializer_p); | |
588 | |
589 streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag, | |
590 LTO_symtab_variable); | |
591 streamer_write_hwi_stream (ob->main_stream, node->order); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
592 lto_output_var_decl_index (ob->decl_state, ob->main_stream, node->decl); |
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
|
593 bp = bitpack_create (ob->main_stream); |
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
|
594 bp_pack_value (&bp, node->externally_visible, 1); |
111 | 595 bp_pack_value (&bp, node->no_reorder, 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
|
596 bp_pack_value (&bp, node->force_output, 1); |
111 | 597 bp_pack_value (&bp, node->forced_by_abi, 1); |
598 bp_pack_value (&bp, node->unique_name, 1); | |
599 bp_pack_value (&bp, | |
600 node->body_removed | |
601 || (!encode_initializer_p && !node->alias && node->definition), | |
602 1); | |
603 bp_pack_value (&bp, node->implicit_section, 1); | |
604 bp_pack_value (&bp, node->writeonly, 1); | |
605 bp_pack_value (&bp, node->definition && (encode_initializer_p || node->alias), | |
606 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
|
607 bp_pack_value (&bp, node->alias, 1); |
111 | 608 bp_pack_value (&bp, node->transparent_alias, 1); |
609 bp_pack_value (&bp, node->weakref, 1); | |
145 | 610 bp_pack_value (&bp, node->symver, 1); |
111 | 611 bp_pack_value (&bp, node->analyzed && (!boundary_p || node->alias), 1); |
612 gcc_assert (node->definition || !node->analyzed); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
613 /* Constant pool initializers can be de-unified into individual ltrans units. |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
614 FIXME: Alternatively at -Os we may want to avoid generating for them the local |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
615 labels and share them across LTRANS partitions. */ |
111 | 616 if (node->get_partitioning_class () != SYMBOL_PARTITION) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
617 { |
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
|
618 bp_pack_value (&bp, 0, 1); /* used_from_other_parition. */ |
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
|
619 bp_pack_value (&bp, 0, 1); /* in_other_partition. */ |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
620 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
621 else |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
622 { |
111 | 623 bp_pack_value (&bp, node->definition |
624 && referenced_from_other_partition_p (node, encoder), 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
|
625 bp_pack_value (&bp, node->analyzed |
111 | 626 && boundary_p && !DECL_EXTERNAL (node->decl), 1); |
627 /* in_other_partition. */ | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
628 } |
111 | 629 bp_pack_value (&bp, node->tls_model, 3); |
630 bp_pack_value (&bp, node->used_by_single_function, 1); | |
631 bp_pack_value (&bp, node->dynamically_initialized, 1); | |
632 streamer_write_bitpack (&bp); | |
633 | |
634 group = node->get_comdat_group (); | |
635 if (group) | |
636 comdat = IDENTIFIER_POINTER (group); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
637 else |
111 | 638 comdat = ""; |
639 streamer_write_data_stream (ob->main_stream, comdat, strlen (comdat) + 1); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
640 |
111 | 641 if (group) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
642 { |
111 | 643 if (node->same_comdat_group) |
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
|
644 { |
111 | 645 ref = LCC_NOT_FOUND; |
646 for (struct symtab_node *n = node->same_comdat_group; | |
647 ref == LCC_NOT_FOUND && n != node; n = n->same_comdat_group) | |
648 ref = lto_symtab_encoder_lookup (encoder, n); | |
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
|
649 } |
111 | 650 else |
651 ref = LCC_NOT_FOUND; | |
652 streamer_write_hwi_stream (ob->main_stream, ref); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
653 } |
111 | 654 |
655 section = node->get_section (); | |
656 if (!section) | |
657 section = ""; | |
658 streamer_write_data_stream (ob->main_stream, section, strlen (section) + 1); | |
659 | |
660 streamer_write_enum (ob->main_stream, ld_plugin_symbol_resolution, | |
661 LDPR_NUM_KNOWN, node->resolution); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
662 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
663 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
664 /* Output the varpool NODE to OB. |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
665 If NODE is not in SET, then NODE is a boundary. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
666 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
667 static void |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
668 lto_output_ref (struct lto_simple_output_block *ob, struct ipa_ref *ref, |
111 | 669 lto_symtab_encoder_t encoder) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
670 { |
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
|
671 struct bitpack_d bp; |
111 | 672 int nref; |
145 | 673 int uid = !ref->stmt ? ref->lto_stmt_uid : gimple_uid (ref->stmt) + 1; |
111 | 674 struct cgraph_node *node; |
675 | |
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
|
676 bp = bitpack_create (ob->main_stream); |
111 | 677 bp_pack_value (&bp, ref->use, 3); |
678 bp_pack_value (&bp, ref->speculative, 1); | |
679 streamer_write_bitpack (&bp); | |
680 nref = lto_symtab_encoder_lookup (encoder, ref->referred); | |
681 gcc_assert (nref != LCC_NOT_FOUND); | |
682 streamer_write_hwi_stream (ob->main_stream, nref); | |
683 | |
684 node = dyn_cast <cgraph_node *> (ref->referring); | |
685 if (node) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
686 { |
111 | 687 if (ref->stmt) |
688 uid = gimple_uid (ref->stmt) + 1; | |
689 streamer_write_hwi_stream (ob->main_stream, uid); | |
145 | 690 bp_pack_value (&bp, ref->speculative_id, 16); |
691 streamer_write_bitpack (&bp); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
692 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
693 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
694 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
695 /* Stream out profile_summary to OB. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
696 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
697 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
698 output_profile_summary (struct lto_simple_output_block *ob) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
699 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
700 if (profile_info) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
701 { |
111 | 702 /* We do not output num and run_max, they are not used by |
703 GCC profile feedback and they are difficult to merge from multiple | |
704 units. */ | |
131 | 705 unsigned runs = (profile_info->runs); |
706 streamer_write_uhwi_stream (ob->main_stream, runs); | |
111 | 707 |
708 /* IPA-profile computes hot bb threshold based on cumulated | |
709 whole program profile. We need to stream it down to ltrans. */ | |
710 if (flag_wpa) | |
711 streamer_write_gcov_count_stream (ob->main_stream, | |
712 get_hot_bb_threshold ()); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
713 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
714 else |
111 | 715 streamer_write_uhwi_stream (ob->main_stream, 0); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
716 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
717 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
718 /* Output all callees or indirect outgoing edges. EDGE must be the first such |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
719 edge. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
720 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
721 static void |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
722 output_outgoing_cgraph_edges (struct cgraph_edge *edge, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
723 struct lto_simple_output_block *ob, |
111 | 724 lto_symtab_encoder_t encoder) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
725 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
726 if (!edge) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
727 return; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
728 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
729 /* Output edges in backward direction, so the reconstructed callgraph match |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
730 and it is easy to associate call sites in the IPA pass summaries. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
731 while (edge->next_callee) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
732 edge = edge->next_callee; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
733 for (; edge; edge = edge->prev_callee) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
734 lto_output_edge (ob, edge, encoder); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
735 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
736 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
737 /* Output the part of the cgraph in SET. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
738 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
739 static void |
111 | 740 output_refs (lto_symtab_encoder_t encoder) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
741 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
742 struct lto_simple_output_block *ob; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
743 int count; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
744 struct ipa_ref *ref; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
745 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
746 ob = lto_create_simple_output_block (LTO_section_refs); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
747 |
111 | 748 for (int i = 0; i < lto_symtab_encoder_size (encoder); i++) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
749 { |
111 | 750 symtab_node *node = lto_symtab_encoder_deref (encoder, i); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
751 |
131 | 752 /* IPA_REF_ALIAS references are always preserved |
111 | 753 in the boundary. Alias node can't have other references and |
754 can be always handled as if it's not in the boundary. */ | |
755 if (!node->alias && !lto_symtab_encoder_in_partition_p (encoder, node)) | |
131 | 756 continue; |
111 | 757 |
758 count = node->ref_list.nreferences (); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
759 if (count) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
760 { |
111 | 761 streamer_write_gcov_count_stream (ob->main_stream, count); |
762 streamer_write_uhwi_stream (ob->main_stream, | |
763 lto_symtab_encoder_lookup (encoder, node)); | |
764 for (int i = 0; node->iterate_reference (i, ref); i++) | |
765 lto_output_ref (ob, ref, encoder); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
766 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
767 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
768 |
111 | 769 streamer_write_uhwi_stream (ob->main_stream, 0); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
770 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
771 lto_destroy_simple_output_block (ob); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
772 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
773 |
111 | 774 /* Add NODE into encoder as well as nodes it is cloned from. |
775 Do it in a way so clones appear first. */ | |
776 | |
777 static void | |
778 add_node_to (lto_symtab_encoder_t encoder, struct cgraph_node *node, | |
779 bool include_body) | |
780 { | |
781 if (node->clone_of) | |
782 add_node_to (encoder, node->clone_of, include_body); | |
783 else if (include_body) | |
784 lto_set_symtab_encoder_encode_body (encoder, node); | |
785 lto_symtab_encoder_encode (encoder, node); | |
786 } | |
787 | |
788 /* Add all references in NODE to encoders. */ | |
789 | |
790 static void | |
791 create_references (lto_symtab_encoder_t encoder, symtab_node *node) | |
792 { | |
793 int i; | |
794 struct ipa_ref *ref = NULL; | |
795 for (i = 0; node->iterate_reference (i, ref); i++) | |
796 if (is_a <cgraph_node *> (ref->referred)) | |
797 add_node_to (encoder, dyn_cast <cgraph_node *> (ref->referred), false); | |
798 else | |
799 lto_symtab_encoder_encode (encoder, ref->referred); | |
800 } | |
801 | |
802 /* Select what needs to be streamed out. In regular lto mode stream everything. | |
803 In offload lto mode stream only nodes marked as offloadable. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
804 void |
111 | 805 select_what_to_stream (void) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
806 { |
111 | 807 struct symtab_node *snode; |
808 FOR_EACH_SYMBOL (snode) | |
809 snode->need_lto_streaming = !lto_stream_offload_p || snode->offloadable; | |
810 } | |
811 | |
812 /* Find all symbols we want to stream into given partition and insert them | |
813 to encoders. | |
814 | |
815 The function actually replaces IN_ENCODER by new one. The reason is that | |
816 streaming code needs clone's origin to be streamed before clone. This | |
817 means that we need to insert the nodes in specific order. This order is | |
818 ignored by the partitioning logic earlier. */ | |
819 | |
820 lto_symtab_encoder_t | |
821 compute_ltrans_boundary (lto_symtab_encoder_t in_encoder) | |
822 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
823 struct cgraph_edge *edge; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
824 int i; |
111 | 825 lto_symtab_encoder_t encoder; |
826 lto_symtab_encoder_iterator lsei; | |
827 hash_set<void *> reachable_call_targets; | |
828 | |
829 encoder = lto_symtab_encoder_new (false); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
830 |
111 | 831 /* Go over all entries in the IN_ENCODER and duplicate them to |
832 ENCODER. At the same time insert masters of clones so | |
833 every master appears before clone. */ | |
834 for (lsei = lsei_start_function_in_partition (in_encoder); | |
835 !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei)) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
836 { |
111 | 837 struct cgraph_node *node = lsei_cgraph_node (lsei); |
838 if (!node->need_lto_streaming) | |
839 continue; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
840 add_node_to (encoder, node, true); |
111 | 841 lto_set_symtab_encoder_in_partition (encoder, node); |
842 create_references (encoder, node); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
843 } |
111 | 844 for (lsei = lsei_start_variable_in_partition (in_encoder); |
845 !lsei_end_p (lsei); lsei_next_variable_in_partition (&lsei)) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
846 { |
111 | 847 varpool_node *vnode = lsei_varpool_node (lsei); |
848 | |
849 if (!vnode->need_lto_streaming) | |
850 continue; | |
851 lto_set_symtab_encoder_in_partition (encoder, vnode); | |
852 lto_set_symtab_encoder_encode_initializer (encoder, vnode); | |
853 create_references (encoder, vnode); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
854 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
855 /* Pickle in also the initializer of all referenced readonly variables |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
856 to help folding. Constant pool variables are not shared, so we must |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
857 pickle those too. */ |
111 | 858 for (i = 0; i < lto_symtab_encoder_size (encoder); i++) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
859 { |
111 | 860 symtab_node *node = lto_symtab_encoder_deref (encoder, i); |
861 if (varpool_node *vnode = dyn_cast <varpool_node *> (node)) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
862 { |
111 | 863 if (!lto_symtab_encoder_encode_initializer_p (encoder, |
864 vnode) | |
865 && (((vnode->ctor_useable_for_folding_p () | |
866 && (!DECL_VIRTUAL_P (vnode->decl) | |
867 || !flag_wpa | |
131 | 868 || flag_ltrans_devirtualize))))) |
111 | 869 { |
870 lto_set_symtab_encoder_encode_initializer (encoder, vnode); | |
871 create_references (encoder, vnode); | |
872 } | |
873 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
874 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
875 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
876 /* Go over all the nodes again to include callees that are not in |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
877 SET. */ |
111 | 878 for (lsei = lsei_start_function_in_partition (encoder); |
879 !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei)) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
880 { |
111 | 881 struct cgraph_node *node = lsei_cgraph_node (lsei); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
882 for (edge = node->callees; edge; edge = edge->next_callee) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
883 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
884 struct cgraph_node *callee = edge->callee; |
111 | 885 if (!lto_symtab_encoder_in_partition_p (encoder, callee)) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
886 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
887 /* We should have moved all the inlines. */ |
145 | 888 gcc_assert (!callee->inlined_to); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
889 add_node_to (encoder, callee, false); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
890 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
891 } |
111 | 892 /* Add all possible targets for late devirtualization. */ |
893 if (flag_ltrans_devirtualize || !flag_wpa) | |
894 for (edge = node->indirect_calls; edge; edge = edge->next_callee) | |
895 if (edge->indirect_info->polymorphic) | |
896 { | |
897 unsigned int i; | |
898 void *cache_token; | |
899 bool final; | |
900 vec <cgraph_node *>targets | |
901 = possible_polymorphic_call_targets | |
902 (edge, &final, &cache_token); | |
903 if (!reachable_call_targets.add (cache_token)) | |
904 { | |
905 for (i = 0; i < targets.length (); i++) | |
906 { | |
907 struct cgraph_node *callee = targets[i]; | |
908 | |
909 /* Adding an external declarations into the unit serves | |
910 no purpose and just increases its boundary. */ | |
911 if (callee->definition | |
912 && !lto_symtab_encoder_in_partition_p | |
913 (encoder, callee)) | |
914 { | |
145 | 915 gcc_assert (!callee->inlined_to); |
111 | 916 add_node_to (encoder, callee, false); |
917 } | |
918 } | |
919 } | |
920 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
921 } |
111 | 922 /* Be sure to also insert alias targert and thunk callees. These needs |
923 to stay to aid local calling conventions. */ | |
924 for (i = 0; i < lto_symtab_encoder_size (encoder); i++) | |
925 { | |
926 symtab_node *node = lto_symtab_encoder_deref (encoder, i); | |
927 cgraph_node *cnode = dyn_cast <cgraph_node *> (node); | |
928 | |
929 if (node->alias && node->analyzed) | |
930 create_references (encoder, node); | |
931 if (cnode | |
145 | 932 && cnode->thunk.thunk_p && !cnode->inlined_to) |
111 | 933 add_node_to (encoder, cnode->callees->callee, false); |
934 while (node->transparent_alias && node->analyzed) | |
935 { | |
936 node = node->get_alias_target (); | |
937 if (is_a <cgraph_node *> (node)) | |
938 add_node_to (encoder, dyn_cast <cgraph_node *> (node), | |
939 false); | |
940 else | |
941 lto_symtab_encoder_encode (encoder, node); | |
942 } | |
943 } | |
944 lto_symtab_encoder_delete (in_encoder); | |
945 return encoder; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
946 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
947 |
111 | 948 /* Output the part of the symtab in SET and VSET. */ |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
949 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
950 void |
111 | 951 output_symtab (void) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
952 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
953 struct cgraph_node *node; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
954 struct lto_simple_output_block *ob; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
955 int i, n_nodes; |
111 | 956 lto_symtab_encoder_t encoder; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
957 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
958 if (flag_wpa) |
111 | 959 output_cgraph_opt_summary (); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
960 |
111 | 961 ob = lto_create_simple_output_block (LTO_section_symtab_nodes); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
962 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
963 output_profile_summary (ob); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
964 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
965 /* An encoder for cgraph nodes should have been created by |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
966 ipa_write_summaries_1. */ |
111 | 967 gcc_assert (ob->decl_state->symtab_node_encoder); |
968 encoder = ob->decl_state->symtab_node_encoder; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
969 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
970 /* Write out the nodes. We must first output a node and then its clones, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
971 otherwise at a time reading back the node there would be nothing to clone |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
972 from. */ |
111 | 973 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
|
974 for (i = 0; i < n_nodes; i++) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
975 { |
111 | 976 symtab_node *node = lto_symtab_encoder_deref (encoder, i); |
977 if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node)) | |
978 lto_output_node (ob, cnode, encoder); | |
979 else | |
980 lto_output_varpool_node (ob, dyn_cast<varpool_node *> (node), encoder); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
981 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
982 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
983 /* Go over the nodes in SET again to write edges. */ |
111 | 984 for (int i = 0; i < lto_symtab_encoder_size (encoder); i++) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
985 { |
111 | 986 node = dyn_cast <cgraph_node *> (lto_symtab_encoder_deref (encoder, i)); |
987 if (node | |
145 | 988 && ((node->thunk.thunk_p && !node->inlined_to) |
111 | 989 || lto_symtab_encoder_in_partition_p (encoder, node))) |
990 { | |
991 output_outgoing_cgraph_edges (node->callees, ob, encoder); | |
992 output_outgoing_cgraph_edges (node->indirect_calls, ob, encoder); | |
993 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
994 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
995 |
111 | 996 streamer_write_uhwi_stream (ob->main_stream, 0); |
997 | |
998 lto_destroy_simple_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
|
999 |
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
|
1000 /* Emit toplevel asms. |
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
|
1001 When doing WPA we must output every asm just once. Since we do not partition asm |
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
|
1002 nodes at all, output them to first output. This is kind of hack, but should work |
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
|
1003 well. */ |
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
|
1004 if (!asm_nodes_output) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1005 { |
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
|
1006 asm_nodes_output = true; |
111 | 1007 lto_output_toplevel_asms (); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1008 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1009 |
111 | 1010 output_refs (encoder); |
1011 } | |
1012 | |
1013 /* Return identifier encoded in IB as a plain string. */ | |
1014 | |
1015 static tree | |
145 | 1016 read_identifier (class lto_input_block *ib) |
111 | 1017 { |
1018 unsigned int len = strnlen (ib->data + ib->p, ib->len - ib->p - 1); | |
1019 tree id; | |
1020 | |
1021 if (ib->data[ib->p + len]) | |
1022 lto_section_overrun (ib); | |
1023 if (!len) | |
1024 { | |
1025 ib->p++; | |
1026 return NULL; | |
1027 } | |
1028 id = get_identifier (ib->data + ib->p); | |
1029 ib->p += len + 1; | |
1030 return id; | |
1031 } | |
1032 | |
1033 /* Return string encoded in IB, NULL if string is empty. */ | |
1034 | |
1035 static const char * | |
145 | 1036 read_string (class lto_input_block *ib) |
111 | 1037 { |
1038 unsigned int len = strnlen (ib->data + ib->p, ib->len - ib->p - 1); | |
1039 const char *str; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1040 |
111 | 1041 if (ib->data[ib->p + len]) |
1042 lto_section_overrun (ib); | |
1043 if (!len) | |
1044 { | |
1045 ib->p++; | |
1046 return NULL; | |
1047 } | |
1048 str = ib->data + ib->p; | |
1049 ib->p += len + 1; | |
1050 return str; | |
1051 } | |
1052 | |
1053 /* Output function/variable tables that will allow libgomp to look up offload | |
1054 target code. | |
1055 OFFLOAD_FUNCS is filled in expand_omp_target, OFFLOAD_VARS is filled in | |
1056 varpool_node::get_create. In WHOPR (partitioned) mode during the WPA stage | |
1057 both OFFLOAD_FUNCS and OFFLOAD_VARS are filled by input_offload_tables. */ | |
1058 | |
1059 void | |
1060 output_offload_tables (void) | |
1061 { | |
1062 if (vec_safe_is_empty (offload_funcs) && vec_safe_is_empty (offload_vars)) | |
1063 return; | |
1064 | |
1065 struct lto_simple_output_block *ob | |
1066 = lto_create_simple_output_block (LTO_section_offload_table); | |
1067 | |
1068 for (unsigned i = 0; i < vec_safe_length (offload_funcs); i++) | |
1069 { | |
1070 streamer_write_enum (ob->main_stream, LTO_symtab_tags, | |
1071 LTO_symtab_last_tag, LTO_symtab_unavail_node); | |
1072 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, | |
1073 (*offload_funcs)[i]); | |
1074 } | |
1075 | |
1076 for (unsigned i = 0; i < vec_safe_length (offload_vars); i++) | |
1077 { | |
1078 streamer_write_enum (ob->main_stream, LTO_symtab_tags, | |
1079 LTO_symtab_last_tag, LTO_symtab_variable); | |
1080 lto_output_var_decl_index (ob->decl_state, ob->main_stream, | |
1081 (*offload_vars)[i]); | |
1082 } | |
1083 | |
1084 streamer_write_uhwi_stream (ob->main_stream, 0); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1085 lto_destroy_simple_output_block (ob); |
111 | 1086 |
1087 /* In WHOPR mode during the WPA stage the joint offload tables need to be | |
1088 streamed to one partition only. That's why we free offload_funcs and | |
1089 offload_vars after the first call of output_offload_tables. */ | |
1090 if (flag_wpa) | |
1091 { | |
1092 vec_free (offload_funcs); | |
1093 vec_free (offload_vars); | |
1094 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1095 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1096 |
145 | 1097 /* Verify the partitioning of NODE. */ |
1098 | |
1099 static inline void | |
1100 verify_node_partition (symtab_node *node) | |
1101 { | |
1102 if (flag_ltrans) | |
1103 return; | |
1104 | |
1105 #ifdef ACCEL_COMPILER | |
1106 if (node->in_other_partition) | |
1107 { | |
1108 if (TREE_CODE (node->decl) == FUNCTION_DECL) | |
1109 error_at (DECL_SOURCE_LOCATION (node->decl), | |
1110 "function %qs has been referenced in offloaded code but" | |
1111 " hasn%'t been marked to be included in the offloaded code", | |
1112 node->name ()); | |
1113 else if (VAR_P (node->decl)) | |
1114 error_at (DECL_SOURCE_LOCATION (node->decl), | |
1115 "variable %qs has been referenced in offloaded code but" | |
1116 " hasn%'t been marked to be included in the offloaded code", | |
1117 node->name ()); | |
1118 else | |
1119 gcc_unreachable (); | |
1120 } | |
1121 #else | |
1122 gcc_assert (!node->in_other_partition | |
1123 && !node->used_from_other_partition); | |
1124 #endif | |
1125 } | |
1126 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1127 /* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1128 STACK_SIZE, SELF_TIME and SELF_SIZE. This is called either to initialize |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1129 NODE or to replace the values in it, for instance because the first |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1130 time we saw it, the function body was not available but now it |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1131 is. BP is a bitpack with all the bitflags for NODE read from the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1132 stream. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1133 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1134 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1135 input_overwrite_node (struct lto_file_decl_data *file_data, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1136 struct cgraph_node *node, |
111 | 1137 enum LTO_symtab_tags tag, |
1138 struct bitpack_d *bp) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1139 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1140 node->aux = (void *) tag; |
111 | 1141 node->lto_file_data = file_data; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1142 |
145 | 1143 node->local = bp_unpack_value (bp, 1); |
111 | 1144 node->externally_visible = bp_unpack_value (bp, 1); |
1145 node->no_reorder = bp_unpack_value (bp, 1); | |
1146 node->definition = bp_unpack_value (bp, 1); | |
145 | 1147 node->versionable = bp_unpack_value (bp, 1); |
1148 node->can_change_signature = bp_unpack_value (bp, 1); | |
1149 node->redefined_extern_inline = bp_unpack_value (bp, 1); | |
111 | 1150 node->force_output = bp_unpack_value (bp, 1); |
1151 node->forced_by_abi = bp_unpack_value (bp, 1); | |
1152 node->unique_name = bp_unpack_value (bp, 1); | |
1153 node->body_removed = bp_unpack_value (bp, 1); | |
1154 node->implicit_section = bp_unpack_value (bp, 1); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1155 node->address_taken = bp_unpack_value (bp, 1); |
111 | 1156 node->used_from_other_partition = bp_unpack_value (bp, 1); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1157 node->lowered = bp_unpack_value (bp, 1); |
111 | 1158 node->analyzed = tag == LTO_symtab_analyzed_node; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1159 node->in_other_partition = bp_unpack_value (bp, 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
|
1160 if (node->in_other_partition |
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
|
1161 /* Avoid updating decl when we are seeing just inline clone. |
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
|
1162 When inlining function that has functions already inlined into it, |
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
|
1163 we produce clones of inline clones. |
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
|
1164 |
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
|
1165 WPA partitioning might put each clone into different unit and |
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
|
1166 we might end up streaming inline clone from other partition |
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
|
1167 to support clone we are interested in. */ |
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
|
1168 && (!node->clone_of |
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
|
1169 || node->clone_of->decl != node->decl)) |
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
|
1170 { |
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
|
1171 DECL_EXTERNAL (node->decl) = 1; |
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
|
1172 TREE_STATIC (node->decl) = 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
|
1173 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1174 node->alias = bp_unpack_value (bp, 1); |
111 | 1175 node->transparent_alias = bp_unpack_value (bp, 1); |
1176 node->weakref = bp_unpack_value (bp, 1); | |
145 | 1177 node->symver = bp_unpack_value (bp, 1); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1178 node->frequency = (enum node_frequency)bp_unpack_value (bp, 2); |
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
|
1179 node->only_called_at_startup = bp_unpack_value (bp, 1); |
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
|
1180 node->only_called_at_exit = bp_unpack_value (bp, 1); |
111 | 1181 node->tm_clone = bp_unpack_value (bp, 1); |
1182 node->calls_comdat_local = bp_unpack_value (bp, 1); | |
1183 node->icf_merged = bp_unpack_value (bp, 1); | |
1184 node->nonfreeing_fn = bp_unpack_value (bp, 1); | |
145 | 1185 node->merged_comdat = bp_unpack_value (bp, 1); |
1186 node->merged_extern_inline = bp_unpack_value (bp, 1); | |
111 | 1187 node->thunk.thunk_p = bp_unpack_value (bp, 1); |
1188 node->parallelized_function = bp_unpack_value (bp, 1); | |
1189 node->resolution = bp_unpack_enum (bp, ld_plugin_symbol_resolution, | |
1190 LDPR_NUM_KNOWN); | |
1191 node->split_part = bp_unpack_value (bp, 1); | |
145 | 1192 verify_node_partition (node); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1193 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1194 |
111 | 1195 /* Return string alias is alias of. */ |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1196 |
111 | 1197 static tree |
1198 get_alias_symbol (tree decl) | |
1199 { | |
1200 tree alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl)); | |
1201 return get_identifier (TREE_STRING_POINTER | |
1202 (TREE_VALUE (TREE_VALUE (alias)))); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1203 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1204 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1205 /* Read a node from input_block IB. TAG is the node's tag just read. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1206 Return the node read or overwriten. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1207 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1208 static struct cgraph_node * |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1209 input_node (struct lto_file_decl_data *file_data, |
145 | 1210 class lto_input_block *ib, |
111 | 1211 enum LTO_symtab_tags tag, |
1212 vec<symtab_node *> nodes) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1213 { |
111 | 1214 gcc::pass_manager *passes = g->get_passes (); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1215 tree fn_decl; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1216 struct cgraph_node *node; |
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
|
1217 struct bitpack_d bp; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1218 unsigned decl_index; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1219 int ref = LCC_NOT_FOUND, ref2 = LCC_NOT_FOUND; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1220 int clone_ref; |
111 | 1221 int order; |
1222 int i, count; | |
1223 tree group; | |
1224 const char *section; | |
145 | 1225 order = streamer_read_hwi (ib) + file_data->order_base; |
111 | 1226 clone_ref = streamer_read_hwi (ib); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1227 |
111 | 1228 decl_index = streamer_read_uhwi (ib); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1229 fn_decl = lto_file_decl_data_get_fn_decl (file_data, decl_index); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1230 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1231 if (clone_ref != LCC_NOT_FOUND) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1232 { |
111 | 1233 node = dyn_cast<cgraph_node *> (nodes[clone_ref])->create_clone (fn_decl, |
131 | 1234 profile_count::uninitialized (), false, |
111 | 1235 vNULL, false, NULL, 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
|
1236 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1237 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1238 { |
111 | 1239 /* Declaration of functions can be already merged with a declaration |
1240 from other input file. We keep cgraph unmerged until after streaming | |
1241 of ipa passes is done. Alays forcingly create a fresh node. */ | |
1242 node = symtab->create_empty (); | |
1243 node->decl = fn_decl; | |
131 | 1244 if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (fn_decl))) |
1245 node->ifunc_resolver = 1; | |
111 | 1246 node->register_symbol (); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1247 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1248 |
111 | 1249 node->order = order; |
1250 if (order >= symtab->order) | |
1251 symtab->order = order + 1; | |
1252 | |
1253 node->count = profile_count::stream_in (ib); | |
1254 node->count_materialization_scale = streamer_read_hwi (ib); | |
1255 | |
1256 count = streamer_read_hwi (ib); | |
1257 node->ipa_transforms_to_apply = vNULL; | |
1258 for (i = 0; i < count; i++) | |
1259 { | |
1260 opt_pass *pass; | |
1261 int pid = streamer_read_hwi (ib); | |
1262 | |
1263 gcc_assert (pid < passes->passes_by_id_size); | |
1264 pass = passes->passes_by_id[pid]; | |
1265 node->ipa_transforms_to_apply.safe_push ((ipa_opt_pass_d *) pass); | |
1266 } | |
1267 | |
1268 if (tag == LTO_symtab_analyzed_node) | |
1269 ref = streamer_read_hwi (ib); | |
1270 | |
1271 group = read_identifier (ib); | |
1272 if (group) | |
1273 ref2 = streamer_read_hwi (ib); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1274 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1275 /* Make sure that we have not read this node before. Nodes that |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1276 have already been read will have their tag stored in the 'aux' |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1277 field. Since built-in functions can be referenced in multiple |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1278 functions, they are expected to be read more than once. */ |
131 | 1279 if (node->aux && !fndecl_built_in_p (node->decl)) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1280 internal_error ("bytecode stream: found multiple instances of cgraph " |
131 | 1281 "node with uid %d", node->get_uid ()); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1282 |
111 | 1283 node->tp_first_run = streamer_read_uhwi (ib); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1284 |
111 | 1285 bp = streamer_read_bitpack (ib); |
1286 | |
1287 input_overwrite_node (file_data, node, tag, &bp); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1288 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1289 /* Store a reference for now, and fix up later to be a pointer. */ |
145 | 1290 node->inlined_to = (cgraph_node *) (intptr_t) ref; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1291 |
111 | 1292 if (group) |
1293 { | |
1294 node->set_comdat_group (group); | |
1295 /* Store a reference for now, and fix up later to be a pointer. */ | |
1296 node->same_comdat_group = (symtab_node *) (intptr_t) ref2; | |
1297 } | |
1298 else | |
1299 node->same_comdat_group = (symtab_node *) (intptr_t) LCC_NOT_FOUND; | |
1300 section = read_string (ib); | |
1301 if (section) | |
1302 node->set_section_for_node (section); | |
1303 | |
145 | 1304 if (node->definition) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1305 { |
111 | 1306 int type = streamer_read_uhwi (ib); |
1307 HOST_WIDE_INT fixed_offset = streamer_read_uhwi (ib); | |
1308 HOST_WIDE_INT virtual_value = streamer_read_uhwi (ib); | |
131 | 1309 HOST_WIDE_INT indirect_offset = streamer_read_uhwi (ib); |
111 | 1310 |
1311 node->thunk.fixed_offset = fixed_offset; | |
131 | 1312 node->thunk.virtual_value = virtual_value; |
1313 node->thunk.indirect_offset = indirect_offset; | |
111 | 1314 node->thunk.this_adjusting = (type & 2); |
1315 node->thunk.virtual_offset_p = (type & 4); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1316 } |
111 | 1317 if (node->alias && !node->analyzed && node->weakref) |
1318 node->alias_target = get_alias_symbol (node->decl); | |
1319 node->profile_id = streamer_read_hwi (ib); | |
145 | 1320 node->unit_id = streamer_read_hwi (ib) + file_data->unit_base; |
1321 if (symtab->max_unit < node->unit_id) | |
1322 symtab->max_unit = node->unit_id; | |
111 | 1323 if (DECL_STATIC_CONSTRUCTOR (node->decl)) |
1324 node->set_init_priority (streamer_read_hwi (ib)); | |
1325 if (DECL_STATIC_DESTRUCTOR (node->decl)) | |
1326 node->set_fini_priority (streamer_read_hwi (ib)); | |
1327 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1328 return node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1329 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1330 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1331 /* Read a node from input_block IB. TAG is the node's tag just read. |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1332 Return the node read or overwriten. */ |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1333 |
111 | 1334 static varpool_node * |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1335 input_varpool_node (struct lto_file_decl_data *file_data, |
145 | 1336 class lto_input_block *ib) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1337 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1338 int decl_index; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1339 tree var_decl; |
111 | 1340 varpool_node *node; |
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
|
1341 struct bitpack_d bp; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1342 int ref = LCC_NOT_FOUND; |
111 | 1343 int order; |
1344 tree group; | |
1345 const char *section; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1346 |
145 | 1347 order = streamer_read_hwi (ib) + file_data->order_base; |
111 | 1348 decl_index = streamer_read_uhwi (ib); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1349 var_decl = lto_file_decl_data_get_var_decl (file_data, decl_index); |
111 | 1350 |
1351 /* Declaration of functions can be already merged with a declaration | |
1352 from other input file. We keep cgraph unmerged until after streaming | |
1353 of ipa passes is done. Alays forcingly create a fresh node. */ | |
1354 node = varpool_node::create_empty (); | |
1355 node->decl = var_decl; | |
1356 node->register_symbol (); | |
1357 | |
1358 node->order = order; | |
1359 if (order >= symtab->order) | |
1360 symtab->order = order + 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
|
1361 node->lto_file_data = file_data; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1362 |
111 | 1363 bp = streamer_read_bitpack (ib); |
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
|
1364 node->externally_visible = bp_unpack_value (&bp, 1); |
111 | 1365 node->no_reorder = bp_unpack_value (&bp, 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
|
1366 node->force_output = bp_unpack_value (&bp, 1); |
111 | 1367 node->forced_by_abi = bp_unpack_value (&bp, 1); |
1368 node->unique_name = bp_unpack_value (&bp, 1); | |
1369 node->body_removed = bp_unpack_value (&bp, 1); | |
1370 node->implicit_section = bp_unpack_value (&bp, 1); | |
1371 node->writeonly = bp_unpack_value (&bp, 1); | |
1372 node->definition = bp_unpack_value (&bp, 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
|
1373 node->alias = bp_unpack_value (&bp, 1); |
111 | 1374 node->transparent_alias = bp_unpack_value (&bp, 1); |
1375 node->weakref = bp_unpack_value (&bp, 1); | |
145 | 1376 node->symver = bp_unpack_value (&bp, 1); |
111 | 1377 node->analyzed = bp_unpack_value (&bp, 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
|
1378 node->used_from_other_partition = bp_unpack_value (&bp, 1); |
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
|
1379 node->in_other_partition = bp_unpack_value (&bp, 1); |
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
|
1380 if (node->in_other_partition) |
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
|
1381 { |
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
|
1382 DECL_EXTERNAL (node->decl) = 1; |
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
|
1383 TREE_STATIC (node->decl) = 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
|
1384 } |
111 | 1385 if (node->alias && !node->analyzed && node->weakref) |
1386 node->alias_target = get_alias_symbol (node->decl); | |
1387 node->tls_model = (enum tls_model)bp_unpack_value (&bp, 3); | |
1388 node->used_by_single_function = (enum tls_model)bp_unpack_value (&bp, 1); | |
1389 node->dynamically_initialized = bp_unpack_value (&bp, 1); | |
1390 group = read_identifier (ib); | |
1391 if (group) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1392 { |
111 | 1393 node->set_comdat_group (group); |
1394 ref = streamer_read_hwi (ib); | |
1395 /* Store a reference for now, and fix up later to be a pointer. */ | |
1396 node->same_comdat_group = (symtab_node *) (intptr_t) ref; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1397 } |
111 | 1398 else |
1399 node->same_comdat_group = (symtab_node *) (intptr_t) LCC_NOT_FOUND; | |
1400 section = read_string (ib); | |
1401 if (section) | |
1402 node->set_section_for_node (section); | |
1403 node->resolution = streamer_read_enum (ib, ld_plugin_symbol_resolution, | |
1404 LDPR_NUM_KNOWN); | |
145 | 1405 verify_node_partition (node); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1406 return node; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1407 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1408 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1409 /* Read a node from input_block IB. TAG is the node's tag just read. |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1410 Return the node read or overwriten. */ |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1411 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1412 static void |
145 | 1413 input_ref (class lto_input_block *ib, |
111 | 1414 symtab_node *referring_node, |
1415 vec<symtab_node *> nodes) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1416 { |
111 | 1417 symtab_node *node = NULL; |
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
|
1418 struct bitpack_d bp; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1419 enum ipa_ref_use use; |
111 | 1420 bool speculative; |
1421 struct ipa_ref *ref; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1422 |
111 | 1423 bp = streamer_read_bitpack (ib); |
1424 use = (enum ipa_ref_use) bp_unpack_value (&bp, 3); | |
1425 speculative = (enum ipa_ref_use) bp_unpack_value (&bp, 1); | |
1426 node = nodes[streamer_read_hwi (ib)]; | |
1427 ref = referring_node->create_reference (node, use); | |
1428 ref->speculative = speculative; | |
1429 if (is_a <cgraph_node *> (referring_node)) | |
145 | 1430 { |
1431 ref->lto_stmt_uid = streamer_read_hwi (ib); | |
1432 bp = streamer_read_bitpack (ib); | |
1433 ref->speculative_id = bp_unpack_value (&bp, 16); | |
1434 } | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1435 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1436 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1437 /* Read an edge from IB. NODES points to a vector of previously read nodes for |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1438 decoding caller and callee of the edge to be read. If INDIRECT is true, the |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1439 edge being read is indirect (in the sense that it has |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1440 indirect_unknown_callee set). */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1441 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1442 static void |
145 | 1443 input_edge (class lto_input_block *ib, vec<symtab_node *> nodes, |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1444 bool indirect) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1445 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1446 struct cgraph_node *caller, *callee; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1447 struct cgraph_edge *edge; |
145 | 1448 unsigned int stmt_id, speculative_id; |
111 | 1449 profile_count count; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1450 cgraph_inline_failed_t inline_failed; |
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
|
1451 struct bitpack_d bp; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1452 int ecf_flags = 0; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1453 |
111 | 1454 caller = dyn_cast<cgraph_node *> (nodes[streamer_read_hwi (ib)]); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1455 if (caller == NULL || caller->decl == NULL_TREE) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1456 internal_error ("bytecode stream: no caller found while reading edge"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1457 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1458 if (!indirect) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1459 { |
111 | 1460 callee = dyn_cast<cgraph_node *> (nodes[streamer_read_hwi (ib)]); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1461 if (callee == NULL || callee->decl == NULL_TREE) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1462 internal_error ("bytecode stream: no callee found while reading edge"); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1463 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1464 else |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1465 callee = NULL; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1466 |
111 | 1467 count = profile_count::stream_in (ib); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1468 |
111 | 1469 bp = streamer_read_bitpack (ib); |
1470 inline_failed = bp_unpack_enum (&bp, cgraph_inline_failed_t, CIF_N_REASONS); | |
1471 stmt_id = bp_unpack_var_len_unsigned (&bp); | |
145 | 1472 speculative_id = bp_unpack_value (&bp, 16); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1473 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1474 if (indirect) |
131 | 1475 edge = caller->create_indirect_edge (NULL, 0, count); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1476 else |
131 | 1477 edge = caller->create_edge (callee, NULL, count); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1478 |
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
|
1479 edge->indirect_inlining_edge = bp_unpack_value (&bp, 1); |
111 | 1480 edge->speculative = bp_unpack_value (&bp, 1); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1481 edge->lto_stmt_uid = stmt_id; |
145 | 1482 edge->speculative_id = speculative_id; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1483 edge->inline_failed = inline_failed; |
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
|
1484 edge->call_stmt_cannot_inline_p = bp_unpack_value (&bp, 1); |
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
|
1485 edge->can_throw_external = bp_unpack_value (&bp, 1); |
111 | 1486 edge->in_polymorphic_cdtor = bp_unpack_value (&bp, 1); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1487 if (indirect) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1488 { |
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
|
1489 if (bp_unpack_value (&bp, 1)) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1490 ecf_flags |= ECF_CONST; |
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
|
1491 if (bp_unpack_value (&bp, 1)) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1492 ecf_flags |= ECF_PURE; |
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
|
1493 if (bp_unpack_value (&bp, 1)) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1494 ecf_flags |= ECF_NORETURN; |
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
|
1495 if (bp_unpack_value (&bp, 1)) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1496 ecf_flags |= ECF_MALLOC; |
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
|
1497 if (bp_unpack_value (&bp, 1)) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1498 ecf_flags |= ECF_NOTHROW; |
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
|
1499 if (bp_unpack_value (&bp, 1)) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1500 ecf_flags |= ECF_RETURNS_TWICE; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1501 edge->indirect_info->ecf_flags = ecf_flags; |
145 | 1502 |
1503 edge->indirect_info->num_speculative_call_targets | |
1504 = bp_unpack_value (&bp, 16); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1505 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1506 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1507 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1508 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1509 /* Read a cgraph from IB using the info in FILE_DATA. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1510 |
111 | 1511 static vec<symtab_node *> |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1512 input_cgraph_1 (struct lto_file_decl_data *file_data, |
145 | 1513 class lto_input_block *ib) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1514 { |
111 | 1515 enum LTO_symtab_tags tag; |
1516 vec<symtab_node *> nodes = vNULL; | |
1517 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
|
1518 unsigned i; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1519 |
111 | 1520 tag = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag); |
145 | 1521 file_data->order_base = symtab->order; |
1522 file_data->unit_base = symtab->max_unit + 1; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1523 while (tag) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1524 { |
111 | 1525 if (tag == LTO_symtab_edge) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1526 input_edge (ib, nodes, false); |
111 | 1527 else if (tag == LTO_symtab_indirect_edge) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1528 input_edge (ib, nodes, true); |
111 | 1529 else if (tag == LTO_symtab_variable) |
1530 { | |
1531 node = input_varpool_node (file_data, ib); | |
1532 nodes.safe_push (node); | |
1533 lto_symtab_encoder_encode (file_data->symtab_node_encoder, node); | |
1534 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1535 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1536 { |
111 | 1537 node = input_node (file_data, ib, tag, nodes); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1538 if (node == NULL || node->decl == NULL_TREE) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1539 internal_error ("bytecode stream: found empty cgraph node"); |
111 | 1540 nodes.safe_push (node); |
1541 lto_symtab_encoder_encode (file_data->symtab_node_encoder, node); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1542 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1543 |
111 | 1544 tag = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1545 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1546 |
145 | 1547 lto_input_toplevel_asms (file_data, file_data->order_base); |
111 | 1548 |
1549 /* AUX pointers should be all non-zero for function nodes read from the stream. */ | |
1550 if (flag_checking) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1551 { |
111 | 1552 FOR_EACH_VEC_ELT (nodes, i, node) |
1553 gcc_assert (node->aux || !is_a <cgraph_node *> (node)); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1554 } |
111 | 1555 FOR_EACH_VEC_ELT (nodes, i, node) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1556 { |
111 | 1557 int ref; |
1558 if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node)) | |
1559 { | |
145 | 1560 ref = (int) (intptr_t) cnode->inlined_to; |
111 | 1561 |
1562 /* We share declaration of builtins, so we may read same node twice. */ | |
1563 if (!node->aux) | |
1564 continue; | |
1565 node->aux = NULL; | |
1566 | |
1567 /* Fixup inlined_to from reference to pointer. */ | |
1568 if (ref != LCC_NOT_FOUND) | |
145 | 1569 dyn_cast<cgraph_node *> (node)->inlined_to |
111 | 1570 = dyn_cast<cgraph_node *> (nodes[ref]); |
1571 else | |
145 | 1572 cnode->inlined_to = NULL; |
111 | 1573 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1574 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1575 ref = (int) (intptr_t) node->same_comdat_group; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1576 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1577 /* Fixup same_comdat_group from reference to pointer. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1578 if (ref != LCC_NOT_FOUND) |
111 | 1579 node->same_comdat_group = nodes[ref]; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1580 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1581 node->same_comdat_group = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1582 } |
111 | 1583 FOR_EACH_VEC_ELT (nodes, i, node) |
1584 node->aux = is_a <cgraph_node *> (node) ? (void *)1 : 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
|
1585 return nodes; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1586 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1587 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1588 /* Input ipa_refs. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1589 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1590 static void |
145 | 1591 input_refs (class lto_input_block *ib, |
111 | 1592 vec<symtab_node *> nodes) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1593 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1594 int count; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1595 int idx; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1596 while (true) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1597 { |
111 | 1598 symtab_node *node; |
1599 count = streamer_read_uhwi (ib); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1600 if (!count) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1601 break; |
111 | 1602 idx = streamer_read_uhwi (ib); |
1603 node = nodes[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
|
1604 while (count) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1605 { |
111 | 1606 input_ref (ib, node, nodes); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1607 count--; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1608 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1609 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1610 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1611 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1612 /* Input profile_info from IB. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1613 static void |
145 | 1614 input_profile_summary (class lto_input_block *ib, |
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
|
1615 struct lto_file_decl_data *file_data) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1616 { |
111 | 1617 unsigned int runs = streamer_read_uhwi (ib); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1618 if (runs) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1619 { |
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
|
1620 file_data->profile_info.runs = runs; |
111 | 1621 |
1622 /* IPA-profile computes hot bb threshold based on cumulated | |
1623 whole program profile. We need to stream it down to ltrans. */ | |
1624 if (flag_ltrans) | |
1625 set_hot_bb_threshold (streamer_read_gcov_count (ib)); | |
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
|
1626 } |
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
|
1627 |
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
|
1628 } |
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
|
1629 |
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
|
1630 /* Rescale profile summaries to the same number of runs in the whole unit. */ |
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
|
1631 |
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
|
1632 static void |
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
|
1633 merge_profile_summaries (struct lto_file_decl_data **file_data_vec) |
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
|
1634 { |
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
|
1635 struct lto_file_decl_data *file_data; |
131 | 1636 unsigned int j; |
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
|
1637 gcov_unsigned_t max_runs = 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
|
1638 struct cgraph_node *node; |
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
|
1639 struct cgraph_edge *edge; |
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
|
1640 |
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
|
1641 /* Find unit with maximal number of runs. If we ever get serious about |
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
|
1642 roundoff errors, we might also consider computing smallest common |
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
|
1643 multiply. */ |
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
|
1644 for (j = 0; (file_data = file_data_vec[j]) != NULL; j++) |
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
|
1645 if (max_runs < file_data->profile_info.runs) |
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
|
1646 max_runs = file_data->profile_info.runs; |
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
|
1647 |
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
|
1648 if (!max_runs) |
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
|
1649 return; |
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
|
1650 |
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
|
1651 /* Simple overflow check. We probably don't need to support that many train |
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
|
1652 runs. Such a large value probably imply data corruption anyway. */ |
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
|
1653 if (max_runs > INT_MAX / REG_BR_PROB_BASE) |
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
|
1654 { |
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
|
1655 sorry ("At most %i profile runs is supported. Perhaps corrupted profile?", |
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
|
1656 INT_MAX / REG_BR_PROB_BASE); |
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
|
1657 return; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1658 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1659 |
131 | 1660 profile_info = XCNEW (gcov_summary); |
1661 profile_info->runs = max_runs; | |
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
|
1662 |
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
|
1663 /* If merging already happent at WPA time, we are done. */ |
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
|
1664 if (flag_ltrans) |
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
|
1665 return; |
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
|
1666 |
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
|
1667 /* Now compute count_materialization_scale of each node. |
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
|
1668 During LTRANS we already have values of count_materialization_scale |
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
|
1669 computed, so just update them. */ |
111 | 1670 FOR_EACH_FUNCTION (node) |
1671 if (node->lto_file_data | |
1672 && node->lto_file_data->profile_info.runs) | |
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
|
1673 { |
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
|
1674 int scale; |
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
|
1675 |
111 | 1676 scale = RDIV (node->count_materialization_scale * max_runs, |
1677 node->lto_file_data->profile_info.runs); | |
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
|
1678 node->count_materialization_scale = scale; |
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
|
1679 if (scale < 0) |
111 | 1680 fatal_error (input_location, "Profile information in %s corrupted", |
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
|
1681 file_data->file_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
|
1682 |
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
|
1683 if (scale == REG_BR_PROB_BASE) |
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
|
1684 continue; |
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
|
1685 for (edge = node->callees; edge; edge = edge->next_callee) |
131 | 1686 if (edge->count.ipa ().nonzero_p ()) |
1687 edge->count = edge->count.apply_scale (scale, REG_BR_PROB_BASE); | |
1688 for (edge = node->indirect_calls; edge; edge = edge->next_callee) | |
1689 if (edge->count.ipa ().nonzero_p ()) | |
1690 edge->count = edge->count.apply_scale (scale, REG_BR_PROB_BASE); | |
1691 if (node->count.ipa ().nonzero_p ()) | |
1692 node->count = node->count.apply_scale (scale, REG_BR_PROB_BASE); | |
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
|
1693 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1694 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1695 |
111 | 1696 /* Input and merge the symtab from each of the .o files passed to |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1697 lto1. */ |
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 void |
111 | 1700 input_symtab (void) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1701 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1702 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1703 struct lto_file_decl_data *file_data; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1704 unsigned int j = 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1705 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
|
1706 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1707 while ((file_data = file_data_vec[j++])) |
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 const char *data; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1710 size_t len; |
145 | 1711 class lto_input_block *ib; |
111 | 1712 vec<symtab_node *> nodes; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1713 |
111 | 1714 ib = lto_create_simple_input_block (file_data, LTO_section_symtab_nodes, |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1715 &data, &len); |
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
|
1716 if (!ib) |
111 | 1717 fatal_error (input_location, |
1718 "cannot find LTO cgraph in %s", file_data->file_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
|
1719 input_profile_summary (ib, file_data); |
111 | 1720 file_data->symtab_node_encoder = lto_symtab_encoder_new (true); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1721 nodes = input_cgraph_1 (file_data, ib); |
111 | 1722 lto_destroy_simple_input_block (file_data, LTO_section_symtab_nodes, |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1723 ib, data, len); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1724 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1725 ib = lto_create_simple_input_block (file_data, LTO_section_refs, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1726 &data, &len); |
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
|
1727 if (!ib) |
111 | 1728 fatal_error (input_location, "cannot find LTO section refs in %s", |
1729 file_data->file_name); | |
1730 input_refs (ib, nodes); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1731 lto_destroy_simple_input_block (file_data, LTO_section_refs, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1732 ib, data, len); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1733 if (flag_ltrans) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1734 input_cgraph_opt_summary (nodes); |
111 | 1735 nodes.release (); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1736 } |
111 | 1737 |
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
|
1738 merge_profile_summaries (file_data_vec); |
111 | 1739 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1740 /* Clear out the aux field that was used to store enough state to |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1741 tell which nodes should be overwritten. */ |
111 | 1742 FOR_EACH_FUNCTION (node) |
55
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 /* Some nodes may have been created by cgraph_node. This |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1745 happens when the callgraph contains nested functions. If the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1746 node for the parent function was never emitted to the gimple |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1747 file, cgraph_node will create a node for it when setting the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1748 context of the nested function. */ |
111 | 1749 if (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
|
1750 node->aux = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1751 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1752 } |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1753 |
111 | 1754 /* Input function/variable tables that will allow libgomp to look up offload |
1755 target code, and store them into OFFLOAD_FUNCS and OFFLOAD_VARS. */ | |
1756 | |
1757 void | |
1758 input_offload_tables (bool do_force_output) | |
1759 { | |
1760 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data (); | |
1761 struct lto_file_decl_data *file_data; | |
1762 unsigned int j = 0; | |
1763 | |
1764 while ((file_data = file_data_vec[j++])) | |
1765 { | |
1766 const char *data; | |
1767 size_t len; | |
145 | 1768 class lto_input_block *ib |
111 | 1769 = lto_create_simple_input_block (file_data, LTO_section_offload_table, |
1770 &data, &len); | |
1771 if (!ib) | |
1772 continue; | |
1773 | |
1774 enum LTO_symtab_tags tag | |
1775 = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag); | |
1776 while (tag) | |
1777 { | |
1778 if (tag == LTO_symtab_unavail_node) | |
1779 { | |
1780 int decl_index = streamer_read_uhwi (ib); | |
1781 tree fn_decl | |
1782 = lto_file_decl_data_get_fn_decl (file_data, decl_index); | |
1783 vec_safe_push (offload_funcs, fn_decl); | |
1784 | |
1785 /* Prevent IPA from removing fn_decl as unreachable, since there | |
1786 may be no refs from the parent function to child_fn in offload | |
1787 LTO mode. */ | |
1788 if (do_force_output) | |
1789 cgraph_node::get (fn_decl)->mark_force_output (); | |
1790 } | |
1791 else if (tag == LTO_symtab_variable) | |
1792 { | |
1793 int decl_index = streamer_read_uhwi (ib); | |
1794 tree var_decl | |
1795 = lto_file_decl_data_get_var_decl (file_data, decl_index); | |
1796 vec_safe_push (offload_vars, var_decl); | |
1797 | |
1798 /* Prevent IPA from removing var_decl as unused, since there | |
1799 may be no refs to var_decl in offload LTO mode. */ | |
1800 if (do_force_output) | |
1801 varpool_node::get (var_decl)->force_output = 1; | |
1802 } | |
1803 else | |
1804 fatal_error (input_location, | |
1805 "invalid offload table in %s", file_data->file_name); | |
1806 | |
1807 tag = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag); | |
1808 } | |
1809 | |
1810 lto_destroy_simple_input_block (file_data, LTO_section_offload_table, | |
1811 ib, data, len); | |
1812 } | |
1813 } | |
1814 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1815 /* True when we need optimization summary for NODE. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1816 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1817 static int |
111 | 1818 output_cgraph_opt_summary_p (struct cgraph_node *node) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1819 { |
131 | 1820 return ((node->clone_of || node->former_clone_of) |
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
|
1821 && (node->clone.tree_map |
145 | 1822 || node->clone.param_adjustments)); |
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
|
1823 } |
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
|
1824 |
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
|
1825 /* Output optimization summary for EDGE 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
|
1826 static void |
111 | 1827 output_edge_opt_summary (struct output_block *ob ATTRIBUTE_UNUSED, |
1828 struct cgraph_edge *edge ATTRIBUTE_UNUSED) | |
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
|
1829 { |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1830 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1831 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1832 /* Output optimization summary for NODE to OB. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1833 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1834 static void |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1835 output_node_opt_summary (struct output_block *ob, |
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
|
1836 struct cgraph_node *node, |
111 | 1837 lto_symtab_encoder_t encoder) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1838 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1839 struct ipa_replace_map *map; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1840 int i; |
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
|
1841 struct cgraph_edge *e; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1842 |
145 | 1843 /* TODO: Should this code be moved to ipa-param-manipulation? */ |
1844 struct bitpack_d bp; | |
1845 bp = bitpack_create (ob->main_stream); | |
1846 bp_pack_value (&bp, (node->clone.param_adjustments != NULL), 1); | |
1847 streamer_write_bitpack (&bp); | |
1848 if (ipa_param_adjustments *adjustments = node->clone.param_adjustments) | |
111 | 1849 { |
145 | 1850 streamer_write_uhwi (ob, vec_safe_length (adjustments->m_adj_params)); |
1851 ipa_adjusted_param *adj; | |
1852 FOR_EACH_VEC_SAFE_ELT (adjustments->m_adj_params, i, adj) | |
1853 { | |
1854 bp = bitpack_create (ob->main_stream); | |
1855 bp_pack_value (&bp, adj->base_index, IPA_PARAM_MAX_INDEX_BITS); | |
1856 bp_pack_value (&bp, adj->prev_clone_index, IPA_PARAM_MAX_INDEX_BITS); | |
1857 bp_pack_value (&bp, adj->op, 2); | |
1858 bp_pack_value (&bp, adj->param_prefix_index, 2); | |
1859 bp_pack_value (&bp, adj->prev_clone_adjustment, 1); | |
1860 bp_pack_value (&bp, adj->reverse, 1); | |
1861 bp_pack_value (&bp, adj->user_flag, 1); | |
1862 streamer_write_bitpack (&bp); | |
1863 if (adj->op == IPA_PARAM_OP_SPLIT | |
1864 || adj->op == IPA_PARAM_OP_NEW) | |
1865 { | |
1866 stream_write_tree (ob, adj->type, true); | |
1867 if (adj->op == IPA_PARAM_OP_SPLIT) | |
1868 { | |
1869 stream_write_tree (ob, adj->alias_ptr_type, true); | |
1870 streamer_write_uhwi (ob, adj->unit_offset); | |
1871 } | |
1872 } | |
1873 } | |
1874 streamer_write_hwi (ob, adjustments->m_always_copy_start); | |
1875 bp = bitpack_create (ob->main_stream); | |
1876 bp_pack_value (&bp, node->clone.param_adjustments->m_skip_return, 1); | |
1877 streamer_write_bitpack (&bp); | |
111 | 1878 } |
145 | 1879 |
111 | 1880 streamer_write_uhwi (ob, vec_safe_length (node->clone.tree_map)); |
1881 FOR_EACH_VEC_SAFE_ELT (node->clone.tree_map, i, map) | |
1882 { | |
1883 streamer_write_uhwi (ob, map->parm_num); | |
1884 gcc_assert (EXPR_LOCATION (map->new_tree) == UNKNOWN_LOCATION); | |
1885 stream_write_tree (ob, map->new_tree, true); | |
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
|
1886 } |
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
|
1887 |
111 | 1888 if (lto_symtab_encoder_in_partition_p (encoder, node)) |
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
|
1889 { |
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
|
1890 for (e = node->callees; e; e = e->next_callee) |
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
|
1891 output_edge_opt_summary (ob, e); |
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
|
1892 for (e = node->indirect_calls; e; e = e->next_callee) |
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
|
1893 output_edge_opt_summary (ob, e); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1894 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1895 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1896 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1897 /* Output optimization summaries stored in callgraph. |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1898 At the moment it is the clone info structure. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1899 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1900 static void |
111 | 1901 output_cgraph_opt_summary (void) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1902 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1903 int i, n_nodes; |
111 | 1904 lto_symtab_encoder_t encoder; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1905 struct output_block *ob = create_output_block (LTO_section_cgraph_opt_sum); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1906 unsigned count = 0; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1907 |
111 | 1908 ob->symbol = NULL; |
1909 encoder = ob->decl_state->symtab_node_encoder; | |
1910 n_nodes = lto_symtab_encoder_size (encoder); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1911 for (i = 0; i < n_nodes; i++) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1912 { |
111 | 1913 symtab_node *node = lto_symtab_encoder_deref (encoder, i); |
1914 cgraph_node *cnode = dyn_cast <cgraph_node *> (node); | |
1915 if (cnode && output_cgraph_opt_summary_p (cnode)) | |
1916 count++; | |
1917 } | |
1918 streamer_write_uhwi (ob, count); | |
1919 for (i = 0; i < n_nodes; i++) | |
1920 { | |
1921 symtab_node *node = lto_symtab_encoder_deref (encoder, i); | |
1922 cgraph_node *cnode = dyn_cast <cgraph_node *> (node); | |
1923 if (cnode && output_cgraph_opt_summary_p (cnode)) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1924 { |
111 | 1925 streamer_write_uhwi (ob, i); |
1926 output_node_opt_summary (ob, cnode, encoder); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1927 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1928 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1929 produce_asm (ob, NULL); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1930 destroy_output_block (ob); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1931 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1932 |
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
|
1933 /* Input optimisation summary of EDGE. */ |
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
|
1934 |
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
|
1935 static void |
111 | 1936 input_edge_opt_summary (struct cgraph_edge *edge ATTRIBUTE_UNUSED, |
145 | 1937 class lto_input_block *ib_main ATTRIBUTE_UNUSED) |
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
|
1938 { |
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
|
1939 } |
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
|
1940 |
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
|
1941 /* Input optimisation summary of NODE. */ |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1942 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1943 static void |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1944 input_node_opt_summary (struct cgraph_node *node, |
145 | 1945 class lto_input_block *ib_main, |
1946 class data_in *data_in) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1947 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1948 int i; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1949 int count; |
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
|
1950 struct cgraph_edge *e; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1951 |
145 | 1952 /* TODO: Should this code be moved to ipa-param-manipulation? */ |
1953 struct bitpack_d bp; | |
1954 bp = streamer_read_bitpack (ib_main); | |
1955 bool have_adjustments = bp_unpack_value (&bp, 1); | |
1956 if (have_adjustments) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1957 { |
145 | 1958 count = streamer_read_uhwi (ib_main); |
1959 vec<ipa_adjusted_param, va_gc> *new_params = NULL; | |
1960 for (i = 0; i < count; i++) | |
1961 { | |
1962 ipa_adjusted_param adj; | |
1963 memset (&adj, 0, sizeof (adj)); | |
1964 bp = streamer_read_bitpack (ib_main); | |
1965 adj.base_index = bp_unpack_value (&bp, IPA_PARAM_MAX_INDEX_BITS); | |
1966 adj.prev_clone_index | |
1967 = bp_unpack_value (&bp, IPA_PARAM_MAX_INDEX_BITS); | |
1968 adj.op = (enum ipa_parm_op) bp_unpack_value (&bp, 2); | |
1969 adj.param_prefix_index = bp_unpack_value (&bp, 2); | |
1970 adj.prev_clone_adjustment = bp_unpack_value (&bp, 1); | |
1971 adj.reverse = bp_unpack_value (&bp, 1); | |
1972 adj.user_flag = bp_unpack_value (&bp, 1); | |
1973 if (adj.op == IPA_PARAM_OP_SPLIT | |
1974 || adj.op == IPA_PARAM_OP_NEW) | |
1975 { | |
1976 adj.type = stream_read_tree (ib_main, data_in); | |
1977 if (adj.op == IPA_PARAM_OP_SPLIT) | |
1978 { | |
1979 adj.alias_ptr_type = stream_read_tree (ib_main, data_in); | |
1980 adj.unit_offset = streamer_read_uhwi (ib_main); | |
1981 } | |
1982 } | |
1983 vec_safe_push (new_params, adj); | |
1984 } | |
1985 int always_copy_start = streamer_read_hwi (ib_main); | |
1986 bp = streamer_read_bitpack (ib_main); | |
1987 bool skip_return = bp_unpack_value (&bp, 1); | |
1988 node->clone.param_adjustments | |
1989 = (new (ggc_alloc <ipa_param_adjustments> ()) | |
1990 ipa_param_adjustments (new_params, always_copy_start, skip_return)); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1991 } |
145 | 1992 |
111 | 1993 count = streamer_read_uhwi (ib_main); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1994 for (i = 0; i < count; i++) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1995 { |
111 | 1996 struct ipa_replace_map *map = ggc_alloc<ipa_replace_map> (); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1997 |
111 | 1998 vec_safe_push (node->clone.tree_map, map); |
1999 map->parm_num = streamer_read_uhwi (ib_main); | |
2000 map->new_tree = stream_read_tree (ib_main, data_in); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2001 } |
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
|
2002 for (e = node->callees; e; e = e->next_callee) |
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
|
2003 input_edge_opt_summary (e, ib_main); |
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
|
2004 for (e = node->indirect_calls; e; e = e->next_callee) |
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
|
2005 input_edge_opt_summary (e, ib_main); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2006 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2007 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2008 /* Read section in file FILE_DATA of length LEN with data DATA. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2009 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2010 static void |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2011 input_cgraph_opt_section (struct lto_file_decl_data *file_data, |
111 | 2012 const char *data, size_t len, |
2013 vec<symtab_node *> nodes) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2014 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2015 const struct lto_function_header *header = |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2016 (const struct lto_function_header *) data; |
111 | 2017 const int cfg_offset = sizeof (struct lto_function_header); |
2018 const int main_offset = cfg_offset + header->cfg_size; | |
2019 const int string_offset = main_offset + header->main_size; | |
145 | 2020 class data_in *data_in; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2021 unsigned int i; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2022 unsigned int count; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2023 |
111 | 2024 lto_input_block ib_main ((const char *) data + main_offset, |
2025 header->main_size, file_data->mode_table); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2026 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2027 data_in = |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2028 lto_data_in_create (file_data, (const char *) data + string_offset, |
111 | 2029 header->string_size, vNULL); |
2030 count = streamer_read_uhwi (&ib_main); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2031 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2032 for (i = 0; i < count; i++) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2033 { |
111 | 2034 int ref = streamer_read_uhwi (&ib_main); |
2035 input_node_opt_summary (dyn_cast<cgraph_node *> (nodes[ref]), | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2036 &ib_main, data_in); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2037 } |
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
|
2038 lto_free_section_data (file_data, LTO_section_cgraph_opt_sum, NULL, data, |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2039 len); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2040 lto_data_in_delete (data_in); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2041 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2042 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2043 /* Input optimization summary of cgraph. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2044 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2045 static void |
111 | 2046 input_cgraph_opt_summary (vec<symtab_node *> nodes) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2047 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2048 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data (); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2049 struct lto_file_decl_data *file_data; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2050 unsigned int j = 0; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2051 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2052 while ((file_data = file_data_vec[j++])) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2053 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2054 size_t len; |
145 | 2055 const char *data |
2056 = lto_get_summary_section_data (file_data, LTO_section_cgraph_opt_sum, | |
2057 &len); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2058 if (data) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2059 input_cgraph_opt_section (file_data, data, len, nodes); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2060 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2061 } |