Mercurial > hg > CbC > CbC_gcc
annotate gcc/lto/lto.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 /* Top-level LTO routines. |
145 | 2 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
|
3 Contributed by CodeSourcery, Inc. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 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
|
6 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 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
|
8 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
|
9 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
|
10 version. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 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
|
13 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
|
14 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
|
15 for more details. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 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
|
18 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
|
19 <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
|
20 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 #include "config.h" |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 #include "system.h" |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 #include "coretypes.h" |
111 | 24 #include "tm.h" |
25 #include "function.h" | |
26 #include "bitmap.h" | |
27 #include "basic-block.h" | |
28 #include "tree.h" | |
29 #include "gimple.h" | |
30 #include "cfghooks.h" | |
31 #include "alloc-pool.h" | |
32 #include "tree-pass.h" | |
33 #include "tree-streamer.h" | |
34 #include "cgraph.h" | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 #include "opts.h" |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 #include "toplev.h" |
111 | 37 #include "stor-layout.h" |
38 #include "symbol-summary.h" | |
39 #include "tree-vrp.h" | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 #include "ipa-prop.h" |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
41 #include "debug.h" |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 #include "lto.h" |
111 | 43 #include "lto-section-names.h" |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
44 #include "splay-tree.h" |
111 | 45 #include "lto-partition.h" |
46 #include "context.h" | |
47 #include "pass_manager.h" | |
48 #include "ipa-fnsummary.h" | |
49 #include "ipa-utils.h" | |
50 #include "gomp-constants.h" | |
51 #include "lto-symtab.h" | |
52 #include "stringpool.h" | |
53 #include "fold-const.h" | |
54 #include "attribs.h" | |
131 | 55 #include "builtins.h" |
145 | 56 #include "lto-common.h" |
111 | 57 |
58 | |
59 /* Number of parallel tasks to run, -1 if we want to use GNU Make jobserver. */ | |
60 static int lto_parallelism; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 |
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
|
62 /* Return true when NODE has a clone that is analyzed (i.e. we need |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
63 to load its body even if the node itself is not needed). */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
64 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
65 static bool |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
66 has_analyzed_clone_p (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
|
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
|
68 struct cgraph_node *orig = 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
|
69 node = node->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
|
70 if (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
|
71 while (node != orig) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
72 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
73 if (node->analyzed) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
74 return true; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
75 if (node->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
|
76 node = node->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
|
77 else if (node->next_sibling_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
|
78 node = node->next_sibling_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
|
79 else |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
80 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
81 while (node != orig && !node->next_sibling_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
|
82 node = 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
|
83 if (node != orig) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
84 node = node->next_sibling_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
|
85 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
86 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
87 return false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
88 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
89 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
90 /* Read the function body for the function associated with NODE. */ |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
91 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
92 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93 lto_materialize_function (struct cgraph_node *node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
94 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
95 tree decl; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
96 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
97 decl = 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
|
98 /* Read in functions with body (analyzed nodes) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
99 and also functions that are needed to produce virtual clones. */ |
111 | 100 if ((node->has_gimple_body_p () && node->analyzed) |
101 || node->used_as_abstract_origin | |
102 || has_analyzed_clone_p (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
|
103 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
104 /* Clones don't need to be read. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
105 if (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
|
106 return; |
111 | 107 if (DECL_FUNCTION_PERSONALITY (decl) && !first_personality_decl) |
108 first_personality_decl = DECL_FUNCTION_PERSONALITY (decl); | |
145 | 109 /* If the file contains a function with a language specific EH |
110 personality set or with EH enabled initialize the backend EH | |
111 machinery. */ | |
112 if (DECL_FUNCTION_PERSONALITY (decl) | |
113 || opt_for_fn (decl, flag_exceptions)) | |
114 lto_init_eh (); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
115 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
116 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
117 /* Let the middle end know about the function. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
118 rest_of_decl_compilation (decl, 1, 0); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
119 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
120 |
145 | 121 /* Materialize all the bodies for all the nodes in the callgraph. */ |
111 | 122 |
123 static void | |
145 | 124 materialize_cgraph (void) |
111 | 125 { |
145 | 126 struct cgraph_node *node; |
127 timevar_id_t lto_timer; | |
111 | 128 |
145 | 129 if (!quiet_flag) |
130 fprintf (stderr, | |
131 flag_wpa ? "Materializing decls:" : "Reading function bodies:"); | |
111 | 132 |
133 | |
145 | 134 FOR_EACH_FUNCTION (node) |
111 | 135 { |
145 | 136 if (node->lto_file_data) |
111 | 137 { |
145 | 138 lto_materialize_function (node); |
139 lto_stats.num_input_cgraph_nodes++; | |
111 | 140 } |
141 } | |
142 | |
143 | |
145 | 144 /* Start the appropriate timer depending on the mode that we are |
145 operating in. */ | |
146 lto_timer = (flag_wpa) ? TV_WHOPR_WPA | |
147 : (flag_ltrans) ? TV_WHOPR_LTRANS | |
148 : TV_LTO; | |
149 timevar_push (lto_timer); | |
111 | 150 |
145 | 151 current_function_decl = NULL; |
152 set_cfun (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
|
153 |
145 | 154 if (!quiet_flag) |
155 fprintf (stderr, "\n"); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
156 |
145 | 157 timevar_pop (lto_timer); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
158 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
159 |
111 | 160 /* Actually stream out ENCODER into TEMP_FILENAME. */ |
161 | |
162 static void | |
145 | 163 stream_out (char *temp_filename, lto_symtab_encoder_t encoder, int part) |
111 | 164 { |
165 lto_file *file = lto_obj_file_open (temp_filename, true); | |
166 if (!file) | |
145 | 167 fatal_error (input_location, "%<lto_obj_file_open()%> failed"); |
111 | 168 lto_set_current_out_file (file); |
169 | |
131 | 170 gcc_assert (!dump_file); |
171 streamer_dump_file = dump_begin (TDI_lto_stream_out, NULL, part); | |
111 | 172 ipa_write_optimization_summaries (encoder); |
173 | |
174 free (CONST_CAST (char *, file->filename)); | |
175 | |
176 lto_set_current_out_file (NULL); | |
177 lto_obj_file_close (file); | |
178 free (file); | |
131 | 179 if (streamer_dump_file) |
180 { | |
181 dump_end (TDI_lto_stream_out, streamer_dump_file); | |
182 streamer_dump_file = NULL; | |
183 } | |
111 | 184 } |
185 | |
186 /* Wait for forked process and signal errors. */ | |
187 #ifdef HAVE_WORKING_FORK | |
188 static void | |
189 wait_for_child () | |
190 { | |
191 int status; | |
192 do | |
193 { | |
194 #ifndef WCONTINUED | |
195 #define WCONTINUED 0 | |
196 #endif | |
197 int w = waitpid (0, &status, WUNTRACED | WCONTINUED); | |
198 if (w == -1) | |
199 fatal_error (input_location, "waitpid failed"); | |
200 | |
201 if (WIFEXITED (status) && WEXITSTATUS (status)) | |
202 fatal_error (input_location, "streaming subprocess failed"); | |
203 else if (WIFSIGNALED (status)) | |
204 fatal_error (input_location, | |
205 "streaming subprocess was killed by signal"); | |
206 } | |
207 while (!WIFEXITED (status) && !WIFSIGNALED (status)); | |
208 } | |
209 #endif | |
210 | |
145 | 211 static void |
212 stream_out_partitions_1 (char *temp_filename, int blen, int min, int max) | |
213 { | |
214 /* Write all the nodes in SET. */ | |
215 for (int p = min; p < max; p ++) | |
216 { | |
217 sprintf (temp_filename + blen, "%u.o", p); | |
218 stream_out (temp_filename, ltrans_partitions[p]->encoder, p); | |
219 ltrans_partitions[p]->encoder = NULL; | |
220 } | |
221 } | |
222 | |
111 | 223 /* Stream out ENCODER into TEMP_FILENAME |
224 Fork if that seems to help. */ | |
225 | |
226 static void | |
145 | 227 stream_out_partitions (char *temp_filename, int blen, int min, int max, |
228 bool ARG_UNUSED (last)) | |
111 | 229 { |
230 #ifdef HAVE_WORKING_FORK | |
231 static int nruns; | |
232 | |
233 if (lto_parallelism <= 1) | |
234 { | |
145 | 235 stream_out_partitions_1 (temp_filename, blen, min, max); |
111 | 236 return; |
237 } | |
238 | |
239 /* Do not run more than LTO_PARALLELISM streamings | |
240 FIXME: we ignore limits on jobserver. */ | |
241 if (lto_parallelism > 0 && nruns >= lto_parallelism) | |
242 { | |
243 wait_for_child (); | |
244 nruns --; | |
245 } | |
246 /* If this is not the last parallel partition, execute new | |
247 streaming process. */ | |
248 if (!last) | |
249 { | |
250 pid_t cpid = fork (); | |
251 | |
252 if (!cpid) | |
253 { | |
254 setproctitle ("lto1-wpa-streaming"); | |
145 | 255 stream_out_partitions_1 (temp_filename, blen, min, max); |
111 | 256 exit (0); |
257 } | |
258 /* Fork failed; lets do the job ourseleves. */ | |
259 else if (cpid == -1) | |
145 | 260 stream_out_partitions_1 (temp_filename, blen, min, max); |
111 | 261 else |
262 nruns++; | |
263 } | |
264 /* Last partition; stream it and wait for all children to die. */ | |
265 else | |
266 { | |
267 int i; | |
145 | 268 stream_out_partitions_1 (temp_filename, blen, min, max); |
111 | 269 for (i = 0; i < nruns; i++) |
270 wait_for_child (); | |
271 } | |
272 asm_nodes_output = true; | |
273 #else | |
145 | 274 stream_out_partitions_1 (temp_filename, blen, min, max); |
111 | 275 #endif |
276 } | |
277 | |
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
|
278 /* Write all output files in WPA mode and the file with the list 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
|
279 LTRANS units. */ |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
280 |
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
|
281 static void |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
282 lto_wpa_write_files (void) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
283 { |
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
|
284 unsigned i, n_sets; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
285 ltrans_partition part; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
286 FILE *ltrans_output_list_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
|
287 char *temp_filename; |
131 | 288 auto_vec <char *>temp_filenames; |
289 auto_vec <int>temp_priority; | |
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
|
290 size_t blen; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
291 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
292 /* Open the LTRANS output list. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
293 if (!ltrans_output_list) |
111 | 294 fatal_error (input_location, "no LTRANS output list filename provided"); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
295 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
296 timevar_push (TV_WHOPR_WPA); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
297 |
111 | 298 FOR_EACH_VEC_ELT (ltrans_partitions, i, part) |
145 | 299 lto_stats.num_output_symtab_nodes |
300 += lto_symtab_encoder_size (part->encoder); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
301 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
302 timevar_pop (TV_WHOPR_WPA); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
303 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
304 timevar_push (TV_WHOPR_WPA_IO); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
305 |
145 | 306 cgraph_node *node; |
307 /* Do body modifications needed for streaming before we fork out | |
308 worker processes. */ | |
309 FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node) | |
310 if (!node->clone_of && gimple_has_body_p (node->decl)) | |
311 lto_prepare_function_for_streaming (node); | |
312 | |
313 ggc_trim (); | |
314 report_heap_memory_use (); | |
315 | |
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
|
316 /* Generate a prefix for the LTRANS unit files. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
317 blen = strlen (ltrans_output_list); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
318 temp_filename = (char *) xmalloc (blen + sizeof ("2147483648.o")); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
319 strcpy (temp_filename, ltrans_output_list); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
320 if (blen > sizeof (".out") |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
321 && strcmp (temp_filename + blen - sizeof (".out") + 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
|
322 ".out") == 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
|
323 temp_filename[blen - sizeof (".out") + 1] = '\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
|
324 blen = strlen (temp_filename); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
325 |
111 | 326 n_sets = ltrans_partitions.length (); |
145 | 327 unsigned sets_per_worker = n_sets; |
328 if (lto_parallelism > 1) | |
329 { | |
330 if (lto_parallelism > (int)n_sets) | |
331 lto_parallelism = n_sets; | |
332 sets_per_worker = (n_sets + lto_parallelism - 1) / lto_parallelism; | |
333 } | |
111 | 334 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
335 for (i = 0; i < n_sets; i++) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
336 { |
111 | 337 ltrans_partition part = ltrans_partitions[i]; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
338 |
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
|
339 /* Write all the nodes in SET. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
340 sprintf (temp_filename + blen, "%u.o", 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
|
341 |
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
|
342 if (!quiet_flag) |
145 | 343 fprintf (stderr, " %s (%s %i insns)", temp_filename, part->name, |
344 part->insns); | |
111 | 345 if (symtab->dump_file) |
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
|
346 { |
145 | 347 lto_symtab_encoder_iterator lsei; |
348 | |
349 fprintf (symtab->dump_file, | |
350 "Writing partition %s to file %s, %i insns\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
|
351 part->name, temp_filename, part->insns); |
111 | 352 fprintf (symtab->dump_file, " Symbols in partition: "); |
145 | 353 for (lsei = lsei_start_in_partition (part->encoder); |
354 !lsei_end_p (lsei); | |
111 | 355 lsei_next_in_partition (&lsei)) |
356 { | |
357 symtab_node *node = lsei_node (lsei); | |
145 | 358 fprintf (symtab->dump_file, "%s ", node->dump_asm_name ()); |
111 | 359 } |
360 fprintf (symtab->dump_file, "\n Symbols in boundary: "); | |
361 for (lsei = lsei_start (part->encoder); !lsei_end_p (lsei); | |
362 lsei_next (&lsei)) | |
363 { | |
364 symtab_node *node = lsei_node (lsei); | |
365 if (!lto_symtab_encoder_in_partition_p (part->encoder, node)) | |
366 { | |
145 | 367 fprintf (symtab->dump_file, "%s ", node->dump_asm_name ()); |
111 | 368 cgraph_node *cnode = dyn_cast <cgraph_node *> (node); |
369 if (cnode | |
145 | 370 && lto_symtab_encoder_encode_body_p (part->encoder, |
371 cnode)) | |
111 | 372 fprintf (symtab->dump_file, "(body included)"); |
373 else | |
374 { | |
375 varpool_node *vnode = dyn_cast <varpool_node *> (node); | |
376 if (vnode | |
145 | 377 && lto_symtab_encoder_encode_initializer_p (part->encoder, |
378 vnode)) | |
111 | 379 fprintf (symtab->dump_file, "(initializer included)"); |
380 } | |
381 } | |
382 } | |
383 fprintf (symtab->dump_file, "\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
|
384 } |
111 | 385 gcc_checking_assert (lto_symtab_encoder_size (part->encoder) || !i); |
386 | |
131 | 387 temp_priority.safe_push (part->insns); |
111 | 388 temp_filenames.safe_push (xstrdup (temp_filename)); |
389 } | |
145 | 390 memory_block_pool::trim (0); |
391 | |
392 for (int set = 0; set < MAX (lto_parallelism, 1); set++) | |
393 { | |
394 stream_out_partitions (temp_filename, blen, set * sets_per_worker, | |
395 MIN ((set + 1) * sets_per_worker, n_sets), | |
396 set == MAX (lto_parallelism, 1) - 1); | |
397 } | |
398 | |
111 | 399 ltrans_output_list_stream = fopen (ltrans_output_list, "w"); |
400 if (ltrans_output_list_stream == NULL) | |
401 fatal_error (input_location, | |
402 "opening LTRANS output list %s: %m", ltrans_output_list); | |
403 for (i = 0; i < n_sets; i++) | |
404 { | |
405 unsigned int len = strlen (temp_filenames[i]); | |
131 | 406 if (fprintf (ltrans_output_list_stream, "%i\n", temp_priority[i]) < 0 |
407 || fwrite (temp_filenames[i], 1, len, ltrans_output_list_stream) < 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
|
408 || fwrite ("\n", 1, 1, ltrans_output_list_stream) < 1) |
111 | 409 fatal_error (input_location, "writing to LTRANS output list %s: %m", |
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
|
410 ltrans_output_list); |
111 | 411 free (temp_filenames[i]); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
412 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
413 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
414 lto_stats.num_output_files += n_sets; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
415 |
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
|
416 /* Close the LTRANS output list. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
417 if (fclose (ltrans_output_list_stream)) |
111 | 418 fatal_error (input_location, |
419 "closing LTRANS output list %s: %m", ltrans_output_list); | |
420 | |
145 | 421 free_ltrans_partitions (); |
111 | 422 free (temp_filename); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
423 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
424 timevar_pop (TV_WHOPR_WPA_IO); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
425 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
426 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
427 /* Perform whole program analysis (WPA) on the callgraph and write out the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
428 optimization plan. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
429 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
430 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
431 do_whole_program_analysis (void) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
432 { |
111 | 433 symtab_node *node; |
434 | |
435 lto_parallelism = 1; | |
436 | |
145 | 437 /* TODO: jobserver communication is not supported, yet. */ |
111 | 438 if (!strcmp (flag_wpa, "jobserver")) |
145 | 439 lto_parallelism = param_max_lto_streaming_parallelism; |
111 | 440 else |
441 { | |
442 lto_parallelism = atoi (flag_wpa); | |
443 if (lto_parallelism <= 0) | |
444 lto_parallelism = 0; | |
145 | 445 if (lto_parallelism >= param_max_lto_streaming_parallelism) |
446 lto_parallelism = param_max_lto_streaming_parallelism; | |
111 | 447 } |
448 | |
449 timevar_start (TV_PHASE_OPT_GEN); | |
450 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
451 /* Note that since we are in WPA mode, materialize_cgraph will not |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
452 actually read in all the function bodies. It only materializes |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
453 the decls and cgraph nodes so that analysis can be performed. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
454 materialize_cgraph (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
455 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
456 /* Reading in the cgraph uses different timers, start timing WPA now. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
457 timevar_push (TV_WHOPR_WPA); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
458 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
459 if (pre_ipa_mem_report) |
145 | 460 dump_memory_report ("Memory consumption before IPA"); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
461 |
111 | 462 symtab->function_flags_ready = true; |
463 | |
464 if (symtab->dump_file) | |
465 symtab->dump (symtab->dump_file); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
466 bitmap_obstack_initialize (NULL); |
111 | 467 symtab->state = IPA_SSA; |
468 | |
469 execute_ipa_pass_list (g->get_passes ()->all_regular_ipa_passes); | |
470 | |
471 /* When WPA analysis raises errors, do not bother to output anything. */ | |
472 if (seen_error ()) | |
473 return; | |
474 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
475 /* We are about to launch the final LTRANS phase, stop the WPA timer. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
476 timevar_pop (TV_WHOPR_WPA); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
477 |
145 | 478 /* We are no longer going to stream in anything. Free some memory. */ |
479 lto_free_file_name_hash (); | |
480 | |
481 | |
111 | 482 timevar_push (TV_WHOPR_PARTITIONING); |
131 | 483 |
484 gcc_assert (!dump_file); | |
485 dump_file = dump_begin (partition_dump_id, NULL); | |
486 | |
487 if (dump_file) | |
488 symtab->dump (dump_file); | |
489 | |
490 symtab_node::checking_verify_symtab_nodes (); | |
491 bitmap_obstack_release (NULL); | |
111 | 492 if (flag_lto_partition == LTO_PARTITION_1TO1) |
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
|
493 lto_1_to_1_map (); |
111 | 494 else if (flag_lto_partition == LTO_PARTITION_MAX) |
495 lto_max_map (); | |
496 else if (flag_lto_partition == LTO_PARTITION_ONE) | |
497 lto_balanced_map (1, INT_MAX); | |
498 else if (flag_lto_partition == LTO_PARTITION_BALANCED) | |
145 | 499 lto_balanced_map (param_lto_partitions, |
500 param_max_partition_size); | |
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
|
501 else |
111 | 502 gcc_unreachable (); |
503 | |
145 | 504 /* Size summaries are needed for balanced partitioning. Free them now so |
111 | 505 the memory can be used for streamer caches. */ |
145 | 506 ipa_free_size_summary (); |
111 | 507 |
508 /* AUX pointers are used by partitioning code to bookkeep number of | |
509 partitions symbol is in. This is no longer needed. */ | |
510 FOR_EACH_SYMBOL (node) | |
511 node->aux = NULL; | |
512 | |
513 lto_stats.num_cgraph_partitions += ltrans_partitions.length (); | |
514 | |
515 /* Find out statics that need to be promoted | |
516 to globals with hidden visibility because they are accessed from multiple | |
517 partitions. */ | |
518 lto_promote_cross_file_statics (); | |
131 | 519 if (dump_file) |
520 dump_end (partition_dump_id, dump_file); | |
521 dump_file = NULL; | |
111 | 522 timevar_pop (TV_WHOPR_PARTITIONING); |
523 | |
524 timevar_stop (TV_PHASE_OPT_GEN); | |
525 | |
526 /* Collect a last time - in lto_wpa_write_files we may end up forking | |
527 with the idea that this doesn't increase memory usage. So we | |
528 absoultely do not want to collect after that. */ | |
529 ggc_collect (); | |
530 | |
531 timevar_start (TV_PHASE_STREAM_OUT); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
532 if (!quiet_flag) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
533 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
534 fprintf (stderr, "\nStreaming out"); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
535 fflush (stderr); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
536 } |
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
|
537 lto_wpa_write_files (); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
538 if (!quiet_flag) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
539 fprintf (stderr, "\n"); |
111 | 540 timevar_stop (TV_PHASE_STREAM_OUT); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
541 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
542 if (post_ipa_mem_report) |
145 | 543 dump_memory_report ("Memory consumption after IPA"); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
544 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
545 /* Show the LTO report before launching LTRANS. */ |
111 | 546 if (flag_lto_report || (flag_wpa && flag_lto_report_wpa)) |
547 print_lto_report_1 (); | |
548 if (mem_report_wpa) | |
145 | 549 dump_memory_report ("Final"); |
111 | 550 } |
551 | |
552 /* Create artificial pointers for "omp declare target link" vars. */ | |
553 | |
554 static void | |
555 offload_handle_link_vars (void) | |
556 { | |
557 #ifdef ACCEL_COMPILER | |
558 varpool_node *var; | |
559 FOR_EACH_VARIABLE (var) | |
560 if (lookup_attribute ("omp declare target link", | |
561 DECL_ATTRIBUTES (var->decl))) | |
562 { | |
563 tree type = build_pointer_type (TREE_TYPE (var->decl)); | |
564 tree link_ptr_var = make_node (VAR_DECL); | |
565 TREE_TYPE (link_ptr_var) = type; | |
566 TREE_USED (link_ptr_var) = 1; | |
567 TREE_STATIC (link_ptr_var) = 1; | |
568 SET_DECL_MODE (link_ptr_var, TYPE_MODE (type)); | |
569 DECL_SIZE (link_ptr_var) = TYPE_SIZE (type); | |
570 DECL_SIZE_UNIT (link_ptr_var) = TYPE_SIZE_UNIT (type); | |
571 DECL_ARTIFICIAL (link_ptr_var) = 1; | |
572 tree var_name = DECL_ASSEMBLER_NAME (var->decl); | |
573 char *new_name | |
574 = ACONCAT ((IDENTIFIER_POINTER (var_name), "_linkptr", NULL)); | |
575 DECL_NAME (link_ptr_var) = get_identifier (new_name); | |
576 SET_DECL_ASSEMBLER_NAME (link_ptr_var, DECL_NAME (link_ptr_var)); | |
577 SET_DECL_VALUE_EXPR (var->decl, build_simple_mem_ref (link_ptr_var)); | |
578 DECL_HAS_VALUE_EXPR_P (var->decl) = 1; | |
579 } | |
580 #endif | |
581 } | |
582 | |
145 | 583 unsigned int |
584 lto_option_lang_mask (void) | |
585 { | |
586 return CL_LTO; | |
587 } | |
111 | 588 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
589 /* Main entry point for the GIMPLE front end. This front end has |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
590 three main personalities: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
591 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
592 - LTO (-flto). All the object files on the command line are |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
593 loaded in memory and processed as a single translation unit. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
594 This is the traditional link-time optimization behavior. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
595 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
596 - WPA (-fwpa). Only the callgraph and summary information for |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
597 files in the command file are loaded. A single callgraph |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
598 (without function bodies) is instantiated for the whole set of |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
599 files. IPA passes are only allowed to analyze the call graph |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
600 and make transformation decisions. The callgraph is |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
601 partitioned, each partition is written to a new object file |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
602 together with the transformation decisions. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
603 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
604 - LTRANS (-fltrans). Similar to -flto but it prevents the IPA |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
605 summary files from running again. Since WPA computed summary |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
606 information and decided what transformations to apply, LTRANS |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
607 simply applies them. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
608 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
609 void |
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
|
610 lto_main (void) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
611 { |
111 | 612 /* LTO is called as a front end, even though it is not a front end. |
613 Because it is called as a front end, TV_PHASE_PARSING and | |
614 TV_PARSE_GLOBAL are active, and we need to turn them off while | |
615 doing LTO. Later we turn them back on so they are active up in | |
616 toplev.c. */ | |
617 timevar_pop (TV_PARSE_GLOBAL); | |
618 timevar_stop (TV_PHASE_PARSING); | |
619 | |
620 timevar_start (TV_PHASE_SETUP); | |
621 | |
622 /* Initialize the LTO front end. */ | |
145 | 623 lto_fe_init (); |
111 | 624 |
625 timevar_stop (TV_PHASE_SETUP); | |
626 timevar_start (TV_PHASE_STREAM_IN); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
627 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
628 /* Read all the symbols and call graph from all the files in the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
629 command line. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
630 read_cgraph_and_symbols (num_in_fnames, in_fnames); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
631 |
111 | 632 timevar_stop (TV_PHASE_STREAM_IN); |
633 | |
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
|
634 if (!seen_error ()) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
635 { |
111 | 636 offload_handle_link_vars (); |
637 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
638 /* If WPA is enabled analyze the whole call graph and create an |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
639 optimization plan. Otherwise, read in all the function |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
640 bodies and continue with optimization. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
641 if (flag_wpa) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
642 do_whole_program_analysis (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
643 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
644 { |
111 | 645 timevar_start (TV_PHASE_OPT_GEN); |
646 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
647 materialize_cgraph (); |
111 | 648 if (!flag_ltrans) |
649 lto_promote_statics_nonwpa (); | |
650 | |
651 /* Annotate the CU DIE and mark the early debug phase as finished. */ | |
131 | 652 debuginfo_early_start (); |
111 | 653 debug_hooks->early_finish ("<artificial>"); |
131 | 654 debuginfo_early_stop (); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
655 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
656 /* Let the middle end know that we have read and merged all of |
145 | 657 the input files. */ |
111 | 658 symtab->compile (); |
659 | |
660 timevar_stop (TV_PHASE_OPT_GEN); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
661 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
662 /* FIXME lto, if the processes spawned by WPA fail, we miss |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
663 the chance to print WPA's report, so WPA will call |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
664 print_lto_report before launching LTRANS. If LTRANS was |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
665 launched directly by the driver we would not need to do |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
666 this. */ |
111 | 667 if (flag_lto_report || (flag_wpa && flag_lto_report_wpa)) |
668 print_lto_report_1 (); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
669 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
670 } |
111 | 671 |
672 /* Here we make LTO pretend to be a parser. */ | |
673 timevar_start (TV_PHASE_PARSING); | |
674 timevar_push (TV_PARSE_GLOBAL); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
675 } |