annotate gcc/varpool.c @ 141:ce508c72660f

copy cbc flang in cfgexpand
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 22 Nov 2018 19:44:39 +0900
parents 84e7813d76e9
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /* Callgraph handling code.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2003-2018 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 Contributed by Jan Hubicka
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 This file is part of GCC.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it under
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 the terms of the GNU General Public License as published by the Free
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 Software Foundation; either version 3, or (at your option) any later
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 version.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 for more details.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 #include "config.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #include "system.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 #include "coretypes.h"
111
kono
parents: 67
diff changeset
24 #include "backend.h"
kono
parents: 67
diff changeset
25 #include "target.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 #include "tree.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 #include "gimple.h"
111
kono
parents: 67
diff changeset
28 #include "timevar.h"
kono
parents: 67
diff changeset
29 #include "cgraph.h"
kono
parents: 67
diff changeset
30 #include "lto-streamer.h"
kono
parents: 67
diff changeset
31 #include "varasm.h"
kono
parents: 67
diff changeset
32 #include "debug.h"
kono
parents: 67
diff changeset
33 #include "output.h"
kono
parents: 67
diff changeset
34 #include "omp-offload.h"
kono
parents: 67
diff changeset
35 #include "context.h"
kono
parents: 67
diff changeset
36 #include "stringpool.h"
kono
parents: 67
diff changeset
37 #include "attribs.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
111
kono
parents: 67
diff changeset
39 const char * const tls_model_names[]={"none", "emulated",
kono
parents: 67
diff changeset
40 "global-dynamic", "local-dynamic",
kono
parents: 67
diff changeset
41 "initial-exec", "local-exec"};
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
111
kono
parents: 67
diff changeset
43 /* List of hooks triggered on varpool_node events. */
kono
parents: 67
diff changeset
44 struct varpool_node_hook_list {
kono
parents: 67
diff changeset
45 varpool_node_hook hook;
kono
parents: 67
diff changeset
46 void *data;
kono
parents: 67
diff changeset
47 struct varpool_node_hook_list *next;
kono
parents: 67
diff changeset
48 };
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
111
kono
parents: 67
diff changeset
50 /* Register HOOK to be called with DATA on each removed node. */
kono
parents: 67
diff changeset
51 varpool_node_hook_list *
kono
parents: 67
diff changeset
52 symbol_table::add_varpool_removal_hook (varpool_node_hook hook, void *data)
kono
parents: 67
diff changeset
53 {
kono
parents: 67
diff changeset
54 varpool_node_hook_list *entry;
kono
parents: 67
diff changeset
55 varpool_node_hook_list **ptr = &m_first_varpool_removal_hook;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
111
kono
parents: 67
diff changeset
57 entry = (varpool_node_hook_list *) xmalloc (sizeof (*entry));
kono
parents: 67
diff changeset
58 entry->hook = hook;
kono
parents: 67
diff changeset
59 entry->data = data;
kono
parents: 67
diff changeset
60 entry->next = NULL;
kono
parents: 67
diff changeset
61 while (*ptr)
kono
parents: 67
diff changeset
62 ptr = &(*ptr)->next;
kono
parents: 67
diff changeset
63 *ptr = entry;
kono
parents: 67
diff changeset
64 return entry;
kono
parents: 67
diff changeset
65 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66
111
kono
parents: 67
diff changeset
67 /* Remove ENTRY from the list of hooks called on removing nodes. */
kono
parents: 67
diff changeset
68 void
kono
parents: 67
diff changeset
69 symbol_table::remove_varpool_removal_hook (varpool_node_hook_list *entry)
kono
parents: 67
diff changeset
70 {
kono
parents: 67
diff changeset
71 varpool_node_hook_list **ptr = &m_first_varpool_removal_hook;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
72
111
kono
parents: 67
diff changeset
73 while (*ptr != entry)
kono
parents: 67
diff changeset
74 ptr = &(*ptr)->next;
kono
parents: 67
diff changeset
75 *ptr = entry->next;
kono
parents: 67
diff changeset
76 free (entry);
kono
parents: 67
diff changeset
77 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
111
kono
parents: 67
diff changeset
79 /* Call all node removal hooks. */
kono
parents: 67
diff changeset
80 void
kono
parents: 67
diff changeset
81 symbol_table::call_varpool_removal_hooks (varpool_node *node)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 {
111
kono
parents: 67
diff changeset
83 varpool_node_hook_list *entry = m_first_varpool_removal_hook;
kono
parents: 67
diff changeset
84 while (entry)
kono
parents: 67
diff changeset
85 {
kono
parents: 67
diff changeset
86 entry->hook (node, entry->data);
kono
parents: 67
diff changeset
87 entry = entry->next;
kono
parents: 67
diff changeset
88 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90
111
kono
parents: 67
diff changeset
91 /* Register HOOK to be called with DATA on each inserted node. */
kono
parents: 67
diff changeset
92 varpool_node_hook_list *
kono
parents: 67
diff changeset
93 symbol_table::add_varpool_insertion_hook (varpool_node_hook hook, void *data)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 {
111
kono
parents: 67
diff changeset
95 varpool_node_hook_list *entry;
kono
parents: 67
diff changeset
96 varpool_node_hook_list **ptr = &m_first_varpool_insertion_hook;
kono
parents: 67
diff changeset
97
kono
parents: 67
diff changeset
98 entry = (varpool_node_hook_list *) xmalloc (sizeof (*entry));
kono
parents: 67
diff changeset
99 entry->hook = hook;
kono
parents: 67
diff changeset
100 entry->data = data;
kono
parents: 67
diff changeset
101 entry->next = NULL;
kono
parents: 67
diff changeset
102 while (*ptr)
kono
parents: 67
diff changeset
103 ptr = &(*ptr)->next;
kono
parents: 67
diff changeset
104 *ptr = entry;
kono
parents: 67
diff changeset
105 return entry;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107
111
kono
parents: 67
diff changeset
108 /* Remove ENTRY from the list of hooks called on inserted nodes. */
kono
parents: 67
diff changeset
109 void
kono
parents: 67
diff changeset
110 symbol_table::remove_varpool_insertion_hook (varpool_node_hook_list *entry)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 {
111
kono
parents: 67
diff changeset
112 varpool_node_hook_list **ptr = &m_first_varpool_insertion_hook;
kono
parents: 67
diff changeset
113
kono
parents: 67
diff changeset
114 while (*ptr != entry)
kono
parents: 67
diff changeset
115 ptr = &(*ptr)->next;
kono
parents: 67
diff changeset
116 *ptr = entry->next;
kono
parents: 67
diff changeset
117 free (entry);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119
111
kono
parents: 67
diff changeset
120 /* Call all node insertion hooks. */
kono
parents: 67
diff changeset
121 void
kono
parents: 67
diff changeset
122 symbol_table::call_varpool_insertion_hooks (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
123 {
111
kono
parents: 67
diff changeset
124 varpool_node_hook_list *entry = m_first_varpool_insertion_hook;
kono
parents: 67
diff changeset
125 while (entry)
kono
parents: 67
diff changeset
126 {
kono
parents: 67
diff changeset
127 entry->hook (node, entry->data);
kono
parents: 67
diff changeset
128 entry = entry->next;
kono
parents: 67
diff changeset
129 }
kono
parents: 67
diff changeset
130 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
131
111
kono
parents: 67
diff changeset
132 /* Allocate new callgraph node and insert it into basic data structures. */
kono
parents: 67
diff changeset
133
kono
parents: 67
diff changeset
134 varpool_node *
kono
parents: 67
diff changeset
135 varpool_node::create_empty (void)
kono
parents: 67
diff changeset
136 {
kono
parents: 67
diff changeset
137 varpool_node *node = ggc_cleared_alloc<varpool_node> ();
kono
parents: 67
diff changeset
138 node->type = SYMTAB_VARIABLE;
kono
parents: 67
diff changeset
139 return node;
kono
parents: 67
diff changeset
140 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
141
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 /* Return varpool node assigned to DECL. Create new one when needed. */
111
kono
parents: 67
diff changeset
143 varpool_node *
kono
parents: 67
diff changeset
144 varpool_node::get_create (tree decl)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 {
111
kono
parents: 67
diff changeset
146 varpool_node *node = varpool_node::get (decl);
kono
parents: 67
diff changeset
147 gcc_checking_assert (VAR_P (decl));
kono
parents: 67
diff changeset
148 if (node)
kono
parents: 67
diff changeset
149 return node;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150
111
kono
parents: 67
diff changeset
151 node = varpool_node::create_empty ();
kono
parents: 67
diff changeset
152 node->decl = decl;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
111
kono
parents: 67
diff changeset
154 if ((flag_openacc || flag_openmp)
kono
parents: 67
diff changeset
155 && lookup_attribute ("omp declare target", DECL_ATTRIBUTES (decl)))
kono
parents: 67
diff changeset
156 {
kono
parents: 67
diff changeset
157 node->offloadable = 1;
kono
parents: 67
diff changeset
158 if (ENABLE_OFFLOADING && !DECL_EXTERNAL (decl))
kono
parents: 67
diff changeset
159 {
kono
parents: 67
diff changeset
160 g->have_offload = true;
kono
parents: 67
diff changeset
161 if (!in_lto_p)
kono
parents: 67
diff changeset
162 vec_safe_push (offload_vars, decl);
kono
parents: 67
diff changeset
163 }
kono
parents: 67
diff changeset
164 }
kono
parents: 67
diff changeset
165
kono
parents: 67
diff changeset
166 node->register_symbol ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 return node;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169
111
kono
parents: 67
diff changeset
170 /* Remove variable from symbol table. */
kono
parents: 67
diff changeset
171
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
172 void
111
kono
parents: 67
diff changeset
173 varpool_node::remove (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
174 {
111
kono
parents: 67
diff changeset
175 symtab->call_varpool_removal_hooks (this);
kono
parents: 67
diff changeset
176 if (lto_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
177 {
111
kono
parents: 67
diff changeset
178 lto_free_function_in_decl_state_for_node (this);
kono
parents: 67
diff changeset
179 lto_file_data = 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
180 }
111
kono
parents: 67
diff changeset
181
kono
parents: 67
diff changeset
182 /* When streaming we can have multiple nodes associated with decl. */
kono
parents: 67
diff changeset
183 if (symtab->state == LTO_STREAMING)
kono
parents: 67
diff changeset
184 ;
kono
parents: 67
diff changeset
185 /* Keep constructor when it may be used for folding. We remove
kono
parents: 67
diff changeset
186 references to external variables before final compilation. */
kono
parents: 67
diff changeset
187 else if (DECL_INITIAL (decl) && DECL_INITIAL (decl) != error_mark_node
kono
parents: 67
diff changeset
188 && !ctor_useable_for_folding_p ())
kono
parents: 67
diff changeset
189 remove_initializer ();
kono
parents: 67
diff changeset
190
kono
parents: 67
diff changeset
191 unregister ();
kono
parents: 67
diff changeset
192 ggc_free (this);
kono
parents: 67
diff changeset
193 }
kono
parents: 67
diff changeset
194
kono
parents: 67
diff changeset
195 /* Remove node initializer when it is no longer needed. */
kono
parents: 67
diff changeset
196 void
kono
parents: 67
diff changeset
197 varpool_node::remove_initializer (void)
kono
parents: 67
diff changeset
198 {
kono
parents: 67
diff changeset
199 if (DECL_INITIAL (decl)
kono
parents: 67
diff changeset
200 && !DECL_IN_CONSTANT_POOL (decl)
kono
parents: 67
diff changeset
201 /* Keep vtables for BINFO folding. */
kono
parents: 67
diff changeset
202 && !DECL_VIRTUAL_P (decl)
kono
parents: 67
diff changeset
203 /* FIXME: http://gcc.gnu.org/PR55395 */
kono
parents: 67
diff changeset
204 && debug_info_level == DINFO_LEVEL_NONE
kono
parents: 67
diff changeset
205 /* When doing declaration merging we have duplicate
kono
parents: 67
diff changeset
206 entries for given decl. Do not attempt to remove
kono
parents: 67
diff changeset
207 the boides, or we will end up remiving
kono
parents: 67
diff changeset
208 wrong one. */
kono
parents: 67
diff changeset
209 && symtab->state != LTO_STREAMING)
kono
parents: 67
diff changeset
210 DECL_INITIAL (decl) = error_mark_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
211 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
212
111
kono
parents: 67
diff changeset
213 /* Dump given varpool node to F. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 void
111
kono
parents: 67
diff changeset
215 varpool_node::dump (FILE *f)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 {
111
kono
parents: 67
diff changeset
217 dump_base (f);
kono
parents: 67
diff changeset
218 fprintf (f, " Availability: %s\n",
kono
parents: 67
diff changeset
219 symtab->function_flags_ready
kono
parents: 67
diff changeset
220 ? cgraph_availability_names[get_availability ()]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 : "not-ready");
111
kono
parents: 67
diff changeset
222 fprintf (f, " Varpool flags:");
kono
parents: 67
diff changeset
223 if (DECL_INITIAL (decl))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 fprintf (f, " initialized");
111
kono
parents: 67
diff changeset
225 if (output)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 fprintf (f, " output");
111
kono
parents: 67
diff changeset
227 if (used_by_single_function)
kono
parents: 67
diff changeset
228 fprintf (f, " used-by-single-function");
kono
parents: 67
diff changeset
229 if (need_bounds_init)
kono
parents: 67
diff changeset
230 fprintf (f, " need-bounds-init");
kono
parents: 67
diff changeset
231 if (TREE_READONLY (decl))
kono
parents: 67
diff changeset
232 fprintf (f, " read-only");
kono
parents: 67
diff changeset
233 if (ctor_useable_for_folding_p ())
kono
parents: 67
diff changeset
234 fprintf (f, " const-value-known");
kono
parents: 67
diff changeset
235 if (writeonly)
kono
parents: 67
diff changeset
236 fprintf (f, " write-only");
kono
parents: 67
diff changeset
237 if (tls_model)
kono
parents: 67
diff changeset
238 fprintf (f, " tls-%s", tls_model_names [tls_model]);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 fprintf (f, "\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
241
111
kono
parents: 67
diff changeset
242
kono
parents: 67
diff changeset
243 /* Dump given varpool node to stderr. */
kono
parents: 67
diff changeset
244 void varpool_node::debug (void)
kono
parents: 67
diff changeset
245 {
kono
parents: 67
diff changeset
246 varpool_node::dump (stderr);
kono
parents: 67
diff changeset
247 }
kono
parents: 67
diff changeset
248
kono
parents: 67
diff changeset
249 /* Dump the variable pool to F. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 void
111
kono
parents: 67
diff changeset
251 varpool_node::dump_varpool (FILE *f)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 {
111
kono
parents: 67
diff changeset
253 varpool_node *node;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 fprintf (f, "variable pool:\n\n");
111
kono
parents: 67
diff changeset
256 FOR_EACH_VARIABLE (node)
kono
parents: 67
diff changeset
257 node->dump (f);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
260 /* Dump the variable pool to stderr. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
261
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
262 DEBUG_FUNCTION void
111
kono
parents: 67
diff changeset
263 varpool_node::debug_varpool (void)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
264 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
265 dump_varpool (stderr);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
266 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
267
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 /* Given an assembler name, lookup node. */
111
kono
parents: 67
diff changeset
269 varpool_node *
kono
parents: 67
diff changeset
270 varpool_node::get_for_asmname (tree asmname)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 {
111
kono
parents: 67
diff changeset
272 if (symtab_node *node = symtab_node::get_for_asmname (asmname))
kono
parents: 67
diff changeset
273 return dyn_cast <varpool_node *> (node);
kono
parents: 67
diff changeset
274 else
kono
parents: 67
diff changeset
275 return NULL;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
277
111
kono
parents: 67
diff changeset
278 /* When doing LTO, read variable's constructor from disk if
kono
parents: 67
diff changeset
279 it is not already present. */
kono
parents: 67
diff changeset
280
kono
parents: 67
diff changeset
281 tree
kono
parents: 67
diff changeset
282 varpool_node::get_constructor (void)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
283 {
111
kono
parents: 67
diff changeset
284 lto_file_decl_data *file_data;
kono
parents: 67
diff changeset
285 const char *data, *name;
kono
parents: 67
diff changeset
286 size_t len;
kono
parents: 67
diff changeset
287
kono
parents: 67
diff changeset
288 if (DECL_INITIAL (decl) != error_mark_node
kono
parents: 67
diff changeset
289 || !in_lto_p
kono
parents: 67
diff changeset
290 || !lto_file_data)
kono
parents: 67
diff changeset
291 return DECL_INITIAL (decl);
kono
parents: 67
diff changeset
292
kono
parents: 67
diff changeset
293 timevar_push (TV_IPA_LTO_CTORS_IN);
kono
parents: 67
diff changeset
294
kono
parents: 67
diff changeset
295 file_data = lto_file_data;
kono
parents: 67
diff changeset
296 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
kono
parents: 67
diff changeset
297
kono
parents: 67
diff changeset
298 /* We may have renamed the declaration, e.g., a static function. */
kono
parents: 67
diff changeset
299 name = lto_get_decl_name_mapping (file_data, name);
kono
parents: 67
diff changeset
300 struct lto_in_decl_state *decl_state
kono
parents: 67
diff changeset
301 = lto_get_function_in_decl_state (file_data, decl);
kono
parents: 67
diff changeset
302
kono
parents: 67
diff changeset
303 data = lto_get_section_data (file_data, LTO_section_function_body,
kono
parents: 67
diff changeset
304 name, &len, decl_state->compressed);
kono
parents: 67
diff changeset
305 if (!data)
kono
parents: 67
diff changeset
306 fatal_error (input_location, "%s: section %s is missing",
kono
parents: 67
diff changeset
307 file_data->file_name,
kono
parents: 67
diff changeset
308 name);
kono
parents: 67
diff changeset
309
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
310 if (!quiet_flag)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
311 fprintf (stderr, " in:%s", IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
111
kono
parents: 67
diff changeset
312 lto_input_variable_constructor (file_data, this, data);
kono
parents: 67
diff changeset
313 gcc_assert (DECL_INITIAL (decl) != error_mark_node);
kono
parents: 67
diff changeset
314 lto_stats.num_function_bodies++;
kono
parents: 67
diff changeset
315 lto_free_section_data (file_data, LTO_section_function_body, name,
kono
parents: 67
diff changeset
316 data, len, decl_state->compressed);
kono
parents: 67
diff changeset
317 lto_free_function_in_decl_state_for_node (this);
kono
parents: 67
diff changeset
318 timevar_pop (TV_IPA_LTO_CTORS_IN);
kono
parents: 67
diff changeset
319 return DECL_INITIAL (decl);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
320 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
321
111
kono
parents: 67
diff changeset
322 /* Return true if variable has constructor that can be used for folding. */
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
323
f6334be47118 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 bool
111
kono
parents: 67
diff changeset
325 varpool_node::ctor_useable_for_folding_p (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
326 {
111
kono
parents: 67
diff changeset
327 varpool_node *real_node = this;
kono
parents: 67
diff changeset
328
kono
parents: 67
diff changeset
329 if (real_node->alias && real_node->definition)
kono
parents: 67
diff changeset
330 real_node = ultimate_alias_target ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
331
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
332 if (TREE_CODE (decl) == CONST_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
333 || DECL_IN_CONSTANT_POOL (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
334 return true;
111
kono
parents: 67
diff changeset
335 if (TREE_THIS_VOLATILE (decl))
kono
parents: 67
diff changeset
336 return false;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
337
111
kono
parents: 67
diff changeset
338 /* If we do not have a constructor, we can't use it. */
kono
parents: 67
diff changeset
339 if (DECL_INITIAL (real_node->decl) == error_mark_node
kono
parents: 67
diff changeset
340 && !real_node->lto_file_data)
kono
parents: 67
diff changeset
341 return false;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
342
111
kono
parents: 67
diff changeset
343 /* Avoid attempts to load constructors that was not streamed. */
kono
parents: 67
diff changeset
344 if (flag_ltrans && DECL_INITIAL (real_node->decl) == error_mark_node
kono
parents: 67
diff changeset
345 && real_node->body_removed)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
346 return false;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
347
111
kono
parents: 67
diff changeset
348 /* Vtables are defined by their types and must match no matter of interposition
kono
parents: 67
diff changeset
349 rules. */
kono
parents: 67
diff changeset
350 if (DECL_VIRTUAL_P (decl))
kono
parents: 67
diff changeset
351 {
kono
parents: 67
diff changeset
352 /* The C++ front end creates VAR_DECLs for vtables of typeinfo
kono
parents: 67
diff changeset
353 classes not defined in the current TU so that it can refer
kono
parents: 67
diff changeset
354 to them from typeinfo objects. Avoid returning NULL_TREE. */
kono
parents: 67
diff changeset
355 return DECL_INITIAL (real_node->decl) != NULL;
kono
parents: 67
diff changeset
356 }
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
357
111
kono
parents: 67
diff changeset
358 /* Alias of readonly variable is also readonly, since the variable is stored
kono
parents: 67
diff changeset
359 in readonly memory. We also accept readonly aliases of non-readonly
kono
parents: 67
diff changeset
360 locations assuming that user knows what he is asking for. */
kono
parents: 67
diff changeset
361 if (!TREE_READONLY (decl) && !TREE_READONLY (real_node->decl))
kono
parents: 67
diff changeset
362 return false;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
363
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
364 /* Variables declared 'const' without an initializer
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
365 have zero as the initializer if they may not be
111
kono
parents: 67
diff changeset
366 overridden at link or run time.
kono
parents: 67
diff changeset
367
kono
parents: 67
diff changeset
368 It is actually requirement for C++ compiler to optimize const variables
kono
parents: 67
diff changeset
369 consistently. As a GNU extension, do not enfore this rule for user defined
kono
parents: 67
diff changeset
370 weak variables, so we support interposition on:
kono
parents: 67
diff changeset
371 static const int dummy = 0;
kono
parents: 67
diff changeset
372 extern const int foo __attribute__((__weak__, __alias__("dummy")));
kono
parents: 67
diff changeset
373 */
kono
parents: 67
diff changeset
374 if ((!DECL_INITIAL (real_node->decl)
kono
parents: 67
diff changeset
375 || (DECL_WEAK (decl) && !DECL_COMDAT (decl)))
kono
parents: 67
diff changeset
376 && (DECL_EXTERNAL (decl) || decl_replaceable_p (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
377 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
378
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
379 /* Variables declared `const' with an initializer are considered
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
380 to not be overwritable with different initializer by default.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
381
f6334be47118 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 ??? Previously we behaved so for scalar variables but not for array
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
383 accesses. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
384 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
385 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
386
111
kono
parents: 67
diff changeset
387 /* If DECLARATION is constant variable and its initial value is known
kono
parents: 67
diff changeset
388 (so we can do constant folding), return its constructor (DECL_INITIAL).
kono
parents: 67
diff changeset
389 This may be an expression or NULL when DECL is initialized to 0.
kono
parents: 67
diff changeset
390 Return ERROR_MARK_NODE otherwise.
kono
parents: 67
diff changeset
391
kono
parents: 67
diff changeset
392 In LTO this may actually trigger reading the constructor from disk.
kono
parents: 67
diff changeset
393 For this reason varpool_ctor_useable_for_folding_p should be used when
kono
parents: 67
diff changeset
394 the actual constructor value is not needed. */
kono
parents: 67
diff changeset
395
kono
parents: 67
diff changeset
396 tree
kono
parents: 67
diff changeset
397 ctor_for_folding (tree decl)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
398 {
111
kono
parents: 67
diff changeset
399 varpool_node *node, *real_node;
kono
parents: 67
diff changeset
400 tree real_decl;
kono
parents: 67
diff changeset
401
kono
parents: 67
diff changeset
402 if (!VAR_P (decl) && TREE_CODE (decl) != CONST_DECL)
kono
parents: 67
diff changeset
403 return error_mark_node;
kono
parents: 67
diff changeset
404
kono
parents: 67
diff changeset
405 if (TREE_CODE (decl) == CONST_DECL
kono
parents: 67
diff changeset
406 || DECL_IN_CONSTANT_POOL (decl))
kono
parents: 67
diff changeset
407 return DECL_INITIAL (decl);
kono
parents: 67
diff changeset
408
kono
parents: 67
diff changeset
409 if (TREE_THIS_VOLATILE (decl))
kono
parents: 67
diff changeset
410 return error_mark_node;
kono
parents: 67
diff changeset
411
kono
parents: 67
diff changeset
412 /* Do not care about automatic variables. Those are never initialized
kono
parents: 67
diff changeset
413 anyway, because gimplifier exapnds the code. */
kono
parents: 67
diff changeset
414 if (!TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
kono
parents: 67
diff changeset
415 {
kono
parents: 67
diff changeset
416 gcc_assert (!TREE_PUBLIC (decl));
kono
parents: 67
diff changeset
417 return error_mark_node;
kono
parents: 67
diff changeset
418 }
kono
parents: 67
diff changeset
419
kono
parents: 67
diff changeset
420 gcc_assert (VAR_P (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
421
111
kono
parents: 67
diff changeset
422 real_node = node = varpool_node::get (decl);
kono
parents: 67
diff changeset
423 if (node)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
424 {
111
kono
parents: 67
diff changeset
425 real_node = node->ultimate_alias_target ();
kono
parents: 67
diff changeset
426 real_decl = real_node->decl;
kono
parents: 67
diff changeset
427 }
kono
parents: 67
diff changeset
428 else
kono
parents: 67
diff changeset
429 real_decl = decl;
kono
parents: 67
diff changeset
430
kono
parents: 67
diff changeset
431 /* See if we are dealing with alias.
kono
parents: 67
diff changeset
432 In most cases alias is just alternative symbol pointing to a given
kono
parents: 67
diff changeset
433 constructor. This allows us to use interposition rules of DECL
kono
parents: 67
diff changeset
434 constructor of REAL_NODE. However weakrefs are special by being just
kono
parents: 67
diff changeset
435 alternative name of their target (if defined). */
kono
parents: 67
diff changeset
436 if (decl != real_decl)
kono
parents: 67
diff changeset
437 {
kono
parents: 67
diff changeset
438 gcc_assert (!DECL_INITIAL (decl)
kono
parents: 67
diff changeset
439 || (node->alias && node->get_alias_target () == real_node)
kono
parents: 67
diff changeset
440 || DECL_INITIAL (decl) == error_mark_node);
kono
parents: 67
diff changeset
441 while (node->transparent_alias && node->analyzed)
kono
parents: 67
diff changeset
442 {
kono
parents: 67
diff changeset
443 node = node->get_alias_target ();
kono
parents: 67
diff changeset
444 decl = node->decl;
kono
parents: 67
diff changeset
445 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
446 }
111
kono
parents: 67
diff changeset
447
kono
parents: 67
diff changeset
448 if ((!DECL_VIRTUAL_P (real_decl)
kono
parents: 67
diff changeset
449 || DECL_INITIAL (real_decl) == error_mark_node
kono
parents: 67
diff changeset
450 || !DECL_INITIAL (real_decl))
kono
parents: 67
diff changeset
451 && (!node || !node->ctor_useable_for_folding_p ()))
kono
parents: 67
diff changeset
452 return error_mark_node;
kono
parents: 67
diff changeset
453
kono
parents: 67
diff changeset
454 /* OK, we can return constructor. See if we need to fetch it from disk
kono
parents: 67
diff changeset
455 in LTO mode. */
kono
parents: 67
diff changeset
456 if (DECL_INITIAL (real_decl) != error_mark_node
kono
parents: 67
diff changeset
457 || !in_lto_p)
kono
parents: 67
diff changeset
458 return DECL_INITIAL (real_decl);
kono
parents: 67
diff changeset
459 return real_node->get_constructor ();
kono
parents: 67
diff changeset
460 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
461
111
kono
parents: 67
diff changeset
462 /* Add the variable DECL to the varpool.
kono
parents: 67
diff changeset
463 Unlike finalize_decl function is intended to be used
kono
parents: 67
diff changeset
464 by middle end and allows insertion of new variable at arbitrary point
kono
parents: 67
diff changeset
465 of compilation. */
kono
parents: 67
diff changeset
466 void
kono
parents: 67
diff changeset
467 varpool_node::add (tree decl)
kono
parents: 67
diff changeset
468 {
kono
parents: 67
diff changeset
469 varpool_node *node;
kono
parents: 67
diff changeset
470 varpool_node::finalize_decl (decl);
kono
parents: 67
diff changeset
471 node = varpool_node::get_create (decl);
kono
parents: 67
diff changeset
472 symtab->call_varpool_insertion_hooks (node);
kono
parents: 67
diff changeset
473 if (node->externally_visible_p ())
kono
parents: 67
diff changeset
474 node->externally_visible = true;
kono
parents: 67
diff changeset
475 if (lookup_attribute ("no_reorder", DECL_ATTRIBUTES (decl)))
kono
parents: 67
diff changeset
476 node->no_reorder = 1;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
477 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
478
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
479 /* Return variable availability. See cgraph.h for description of individual
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
480 return values. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
481 enum availability
111
kono
parents: 67
diff changeset
482 varpool_node::get_availability (symtab_node *ref)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
483 {
111
kono
parents: 67
diff changeset
484 if (!definition)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
485 return AVAIL_NOT_AVAILABLE;
111
kono
parents: 67
diff changeset
486 if (!TREE_PUBLIC (decl))
kono
parents: 67
diff changeset
487 return AVAIL_AVAILABLE;
kono
parents: 67
diff changeset
488 if (DECL_IN_CONSTANT_POOL (decl)
kono
parents: 67
diff changeset
489 || DECL_VIRTUAL_P (decl))
kono
parents: 67
diff changeset
490 return AVAIL_AVAILABLE;
kono
parents: 67
diff changeset
491 if (transparent_alias && definition)
kono
parents: 67
diff changeset
492 {
kono
parents: 67
diff changeset
493 enum availability avail;
kono
parents: 67
diff changeset
494
kono
parents: 67
diff changeset
495 ultimate_alias_target (&avail, ref);
kono
parents: 67
diff changeset
496 return avail;
kono
parents: 67
diff changeset
497 }
kono
parents: 67
diff changeset
498 /* If this is a reference from symbol itself and there are no aliases, we
kono
parents: 67
diff changeset
499 may be sure that the symbol was not interposed by something else because
kono
parents: 67
diff changeset
500 the symbol itself would be unreachable otherwise. */
kono
parents: 67
diff changeset
501 if ((this == ref && !has_aliases_p ())
kono
parents: 67
diff changeset
502 || (ref && get_comdat_group ()
kono
parents: 67
diff changeset
503 && get_comdat_group () == ref->get_comdat_group ()))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
504 return AVAIL_AVAILABLE;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
505 /* If the variable can be overwritten, return OVERWRITABLE. Takes
111
kono
parents: 67
diff changeset
506 care of at least one notable extension - the COMDAT variables
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
507 used to share template instantiations in C++. */
111
kono
parents: 67
diff changeset
508 if (decl_replaceable_p (decl)
kono
parents: 67
diff changeset
509 || DECL_EXTERNAL (decl))
kono
parents: 67
diff changeset
510 return AVAIL_INTERPOSABLE;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
511 return AVAIL_AVAILABLE;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
512 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
513
111
kono
parents: 67
diff changeset
514 void
kono
parents: 67
diff changeset
515 varpool_node::analyze (void)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
516 {
111
kono
parents: 67
diff changeset
517 /* When reading back varpool at LTO time, we re-construct the queue in order
kono
parents: 67
diff changeset
518 to have "needed" list right by inserting all needed nodes into varpool.
kono
parents: 67
diff changeset
519 We however don't want to re-analyze already analyzed nodes. */
kono
parents: 67
diff changeset
520 if (!analyzed)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
521 {
111
kono
parents: 67
diff changeset
522 gcc_assert (!in_lto_p || symtab->function_flags_ready);
kono
parents: 67
diff changeset
523 /* Compute the alignment early so function body expanders are
kono
parents: 67
diff changeset
524 already informed about increased alignment. */
kono
parents: 67
diff changeset
525 align_variable (decl, 0);
kono
parents: 67
diff changeset
526 }
kono
parents: 67
diff changeset
527 if (alias)
kono
parents: 67
diff changeset
528 resolve_alias (varpool_node::get (alias_target));
kono
parents: 67
diff changeset
529 else if (DECL_INITIAL (decl))
kono
parents: 67
diff changeset
530 record_references_in_initializer (decl, analyzed);
kono
parents: 67
diff changeset
531 analyzed = true;
kono
parents: 67
diff changeset
532 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
533
111
kono
parents: 67
diff changeset
534 /* Assemble thunks and aliases associated to varpool node. */
kono
parents: 67
diff changeset
535
kono
parents: 67
diff changeset
536 void
kono
parents: 67
diff changeset
537 varpool_node::assemble_aliases (void)
kono
parents: 67
diff changeset
538 {
kono
parents: 67
diff changeset
539 ipa_ref *ref;
kono
parents: 67
diff changeset
540
kono
parents: 67
diff changeset
541 FOR_EACH_ALIAS (this, ref)
kono
parents: 67
diff changeset
542 {
kono
parents: 67
diff changeset
543 varpool_node *alias = dyn_cast <varpool_node *> (ref->referring);
kono
parents: 67
diff changeset
544 if (!alias->transparent_alias)
kono
parents: 67
diff changeset
545 do_assemble_alias (alias->decl,
kono
parents: 67
diff changeset
546 DECL_ASSEMBLER_NAME (decl));
kono
parents: 67
diff changeset
547 alias->assemble_aliases ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
548 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
549 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
550
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
551 /* Output one variable, if necessary. Return whether we output it. */
111
kono
parents: 67
diff changeset
552
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
553 bool
111
kono
parents: 67
diff changeset
554 varpool_node::assemble_decl (void)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
555 {
111
kono
parents: 67
diff changeset
556 /* Aliases are outout when their target is produced or by
kono
parents: 67
diff changeset
557 output_weakrefs. */
kono
parents: 67
diff changeset
558 if (alias)
kono
parents: 67
diff changeset
559 return false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
560
111
kono
parents: 67
diff changeset
561 /* Constant pool is output from RTL land when the reference
kono
parents: 67
diff changeset
562 survive till this level. */
kono
parents: 67
diff changeset
563 if (DECL_IN_CONSTANT_POOL (decl) && TREE_ASM_WRITTEN (decl))
kono
parents: 67
diff changeset
564 return false;
kono
parents: 67
diff changeset
565
kono
parents: 67
diff changeset
566 /* Decls with VALUE_EXPR should not be in the varpool at all. They
kono
parents: 67
diff changeset
567 are not real variables, but just info for debugging and codegen.
kono
parents: 67
diff changeset
568 Unfortunately at the moment emutls is not updating varpool correctly
kono
parents: 67
diff changeset
569 after turning real vars into value_expr vars. */
kono
parents: 67
diff changeset
570 if (DECL_HAS_VALUE_EXPR_P (decl)
kono
parents: 67
diff changeset
571 && !targetm.have_tls)
kono
parents: 67
diff changeset
572 return false;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
573
111
kono
parents: 67
diff changeset
574 /* Hard register vars do not need to be output. */
kono
parents: 67
diff changeset
575 if (DECL_HARD_REGISTER (decl))
kono
parents: 67
diff changeset
576 return false;
kono
parents: 67
diff changeset
577
kono
parents: 67
diff changeset
578 gcc_checking_assert (!TREE_ASM_WRITTEN (decl)
kono
parents: 67
diff changeset
579 && VAR_P (decl)
kono
parents: 67
diff changeset
580 && !DECL_HAS_VALUE_EXPR_P (decl));
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
111
kono
parents: 67
diff changeset
582 if (!in_other_partition
kono
parents: 67
diff changeset
583 && !DECL_EXTERNAL (decl))
kono
parents: 67
diff changeset
584 {
kono
parents: 67
diff changeset
585 get_constructor ();
kono
parents: 67
diff changeset
586 assemble_variable (decl, 0, 1, 0);
kono
parents: 67
diff changeset
587 gcc_assert (TREE_ASM_WRITTEN (decl));
kono
parents: 67
diff changeset
588 gcc_assert (definition);
kono
parents: 67
diff changeset
589 assemble_aliases ();
kono
parents: 67
diff changeset
590 /* After the parser has generated debugging information, augment
kono
parents: 67
diff changeset
591 this information with any new location/etc information that may
kono
parents: 67
diff changeset
592 have become available after the compilation proper. */
kono
parents: 67
diff changeset
593 debug_hooks->late_global_decl (decl);
kono
parents: 67
diff changeset
594 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
595 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
596
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
597 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
598 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
599
111
kono
parents: 67
diff changeset
600 /* Add NODE to queue starting at FIRST.
kono
parents: 67
diff changeset
601 The queue is linked via AUX pointers and terminated by pointer to 1. */
kono
parents: 67
diff changeset
602
kono
parents: 67
diff changeset
603 static void
kono
parents: 67
diff changeset
604 enqueue_node (varpool_node *node, varpool_node **first)
kono
parents: 67
diff changeset
605 {
kono
parents: 67
diff changeset
606 if (node->aux)
kono
parents: 67
diff changeset
607 return;
kono
parents: 67
diff changeset
608 gcc_checking_assert (*first);
kono
parents: 67
diff changeset
609 node->aux = *first;
kono
parents: 67
diff changeset
610 *first = node;
kono
parents: 67
diff changeset
611 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
612
111
kono
parents: 67
diff changeset
613 /* Optimization of function bodies might've rendered some variables as
kono
parents: 67
diff changeset
614 unnecessary so we want to avoid these from being compiled. Re-do
kono
parents: 67
diff changeset
615 reachability starting from variables that are either externally visible
kono
parents: 67
diff changeset
616 or was referred from the asm output routines. */
kono
parents: 67
diff changeset
617
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
618 void
111
kono
parents: 67
diff changeset
619 symbol_table::remove_unreferenced_decls (void)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
620 {
111
kono
parents: 67
diff changeset
621 varpool_node *next, *node;
kono
parents: 67
diff changeset
622 varpool_node *first = (varpool_node *)(void *)1;
kono
parents: 67
diff changeset
623 int i;
kono
parents: 67
diff changeset
624 ipa_ref *ref = NULL;
kono
parents: 67
diff changeset
625 hash_set<varpool_node *> referenced;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
626
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
627 if (seen_error ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
628 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
629
111
kono
parents: 67
diff changeset
630 if (dump_file)
kono
parents: 67
diff changeset
631 fprintf (dump_file, "Trivially needed variables:");
kono
parents: 67
diff changeset
632 FOR_EACH_DEFINED_VARIABLE (node)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
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 (node->analyzed
111
kono
parents: 67
diff changeset
635 && (!node->can_remove_if_no_refs_p ()
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
636 /* We just expanded all function bodies. See if any 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
637 them needed the variable. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
638 || DECL_RTL_SET_P (node->decl)))
111
kono
parents: 67
diff changeset
639 {
kono
parents: 67
diff changeset
640 enqueue_node (node, &first);
kono
parents: 67
diff changeset
641 if (dump_file)
kono
parents: 67
diff changeset
642 fprintf (dump_file, " %s", node->asm_name ());
kono
parents: 67
diff changeset
643 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
644 }
111
kono
parents: 67
diff changeset
645 while (first != (varpool_node *)(void *)1)
kono
parents: 67
diff changeset
646 {
kono
parents: 67
diff changeset
647 node = first;
kono
parents: 67
diff changeset
648 first = (varpool_node *)first->aux;
kono
parents: 67
diff changeset
649
kono
parents: 67
diff changeset
650 if (node->same_comdat_group)
kono
parents: 67
diff changeset
651 {
kono
parents: 67
diff changeset
652 symtab_node *next;
kono
parents: 67
diff changeset
653 for (next = node->same_comdat_group;
kono
parents: 67
diff changeset
654 next != node;
kono
parents: 67
diff changeset
655 next = next->same_comdat_group)
kono
parents: 67
diff changeset
656 {
kono
parents: 67
diff changeset
657 varpool_node *vnext = dyn_cast <varpool_node *> (next);
kono
parents: 67
diff changeset
658 if (vnext && vnext->analyzed && !next->comdat_local_p ())
kono
parents: 67
diff changeset
659 enqueue_node (vnext, &first);
kono
parents: 67
diff changeset
660 }
kono
parents: 67
diff changeset
661 }
kono
parents: 67
diff changeset
662 for (i = 0; node->iterate_reference (i, ref); i++)
kono
parents: 67
diff changeset
663 {
kono
parents: 67
diff changeset
664 varpool_node *vnode = dyn_cast <varpool_node *> (ref->referred);
kono
parents: 67
diff changeset
665 if (vnode
kono
parents: 67
diff changeset
666 && !vnode->in_other_partition
kono
parents: 67
diff changeset
667 && (!DECL_EXTERNAL (ref->referred->decl)
kono
parents: 67
diff changeset
668 || vnode->alias)
kono
parents: 67
diff changeset
669 && vnode->analyzed)
kono
parents: 67
diff changeset
670 enqueue_node (vnode, &first);
kono
parents: 67
diff changeset
671 else
kono
parents: 67
diff changeset
672 {
kono
parents: 67
diff changeset
673 referenced.add (vnode);
kono
parents: 67
diff changeset
674 while (vnode && vnode->alias && vnode->definition)
kono
parents: 67
diff changeset
675 {
kono
parents: 67
diff changeset
676 vnode = vnode->get_alias_target ();
kono
parents: 67
diff changeset
677 referenced.add (vnode);
kono
parents: 67
diff changeset
678 }
kono
parents: 67
diff changeset
679 }
kono
parents: 67
diff changeset
680 }
kono
parents: 67
diff changeset
681 }
kono
parents: 67
diff changeset
682 if (dump_file)
kono
parents: 67
diff changeset
683 fprintf (dump_file, "\nRemoving variables:");
kono
parents: 67
diff changeset
684 for (node = first_defined_variable (); node; node = next)
kono
parents: 67
diff changeset
685 {
kono
parents: 67
diff changeset
686 next = next_defined_variable (node);
kono
parents: 67
diff changeset
687 if (!node->aux && !node->no_reorder)
kono
parents: 67
diff changeset
688 {
kono
parents: 67
diff changeset
689 if (dump_file)
kono
parents: 67
diff changeset
690 fprintf (dump_file, " %s", node->asm_name ());
kono
parents: 67
diff changeset
691 if (referenced.contains(node))
kono
parents: 67
diff changeset
692 node->remove_initializer ();
kono
parents: 67
diff changeset
693 else
kono
parents: 67
diff changeset
694 node->remove ();
kono
parents: 67
diff changeset
695 }
kono
parents: 67
diff changeset
696 }
kono
parents: 67
diff changeset
697
kono
parents: 67
diff changeset
698 if (dump_file)
kono
parents: 67
diff changeset
699 fprintf (dump_file, "\n");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
700 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
701
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
702 /* For variables in named sections make sure get_variable_section
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
703 is called before we switch to those sections. Then section
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
704 conflicts between read-only and read-only requiring relocations
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
705 sections can be resolved. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
706 void
111
kono
parents: 67
diff changeset
707 varpool_node::finalize_named_section_flags (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
708 {
111
kono
parents: 67
diff changeset
709 if (!TREE_ASM_WRITTEN (decl)
kono
parents: 67
diff changeset
710 && !alias
kono
parents: 67
diff changeset
711 && !in_other_partition
kono
parents: 67
diff changeset
712 && !DECL_EXTERNAL (decl)
kono
parents: 67
diff changeset
713 && VAR_P (decl)
kono
parents: 67
diff changeset
714 && !DECL_HAS_VALUE_EXPR_P (decl)
kono
parents: 67
diff changeset
715 && get_section ())
kono
parents: 67
diff changeset
716 get_variable_section (decl, false);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
717 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
718
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
719 /* Output all variables enqueued to be assembled. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
720 bool
111
kono
parents: 67
diff changeset
721 symbol_table::output_variables (void)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
722 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
723 bool changed = false;
111
kono
parents: 67
diff changeset
724 varpool_node *node;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
725
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
726 if (seen_error ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
727 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
728
111
kono
parents: 67
diff changeset
729 remove_unreferenced_decls ();
kono
parents: 67
diff changeset
730
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
731 timevar_push (TV_VAROUT);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
732
111
kono
parents: 67
diff changeset
733 FOR_EACH_DEFINED_VARIABLE (node)
kono
parents: 67
diff changeset
734 {
kono
parents: 67
diff changeset
735 /* Handled in output_in_order. */
kono
parents: 67
diff changeset
736 if (node->no_reorder)
kono
parents: 67
diff changeset
737 continue;
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
738
111
kono
parents: 67
diff changeset
739 node->finalize_named_section_flags ();
kono
parents: 67
diff changeset
740 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
741
111
kono
parents: 67
diff changeset
742 /* There is a similar loop in output_in_order. Please keep them in sync. */
kono
parents: 67
diff changeset
743 FOR_EACH_VARIABLE (node)
kono
parents: 67
diff changeset
744 {
kono
parents: 67
diff changeset
745 /* Handled in output_in_order. */
kono
parents: 67
diff changeset
746 if (node->no_reorder)
kono
parents: 67
diff changeset
747 continue;
kono
parents: 67
diff changeset
748 if (DECL_HARD_REGISTER (node->decl)
kono
parents: 67
diff changeset
749 || DECL_HAS_VALUE_EXPR_P (node->decl))
kono
parents: 67
diff changeset
750 continue;
kono
parents: 67
diff changeset
751 if (node->definition)
kono
parents: 67
diff changeset
752 changed |= node->assemble_decl ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
753 else
111
kono
parents: 67
diff changeset
754 assemble_undefined_decl (node->decl);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
755 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
756 timevar_pop (TV_VAROUT);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
757 return changed;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
758 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
759
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
760 /* Attempt to mark ALIAS as an alias to DECL. Return TRUE if successful.
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
761 Extra name aliases are output whenever DECL is output. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
762
111
kono
parents: 67
diff changeset
763 varpool_node *
kono
parents: 67
diff changeset
764 varpool_node::create_alias (tree alias, tree decl)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
765 {
111
kono
parents: 67
diff changeset
766 varpool_node *alias_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
767
111
kono
parents: 67
diff changeset
768 gcc_assert (VAR_P (decl));
kono
parents: 67
diff changeset
769 gcc_assert (VAR_P (alias));
kono
parents: 67
diff changeset
770 alias_node = varpool_node::get_create (alias);
kono
parents: 67
diff changeset
771 alias_node->alias = true;
kono
parents: 67
diff changeset
772 alias_node->definition = true;
kono
parents: 67
diff changeset
773 alias_node->alias_target = decl;
kono
parents: 67
diff changeset
774 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (alias)) != NULL)
kono
parents: 67
diff changeset
775 alias_node->weakref = alias_node->transparent_alias = 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
776 return alias_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
777 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
778
111
kono
parents: 67
diff changeset
779 /* Attempt to mark ALIAS as an alias to DECL. Return TRUE if successful.
kono
parents: 67
diff changeset
780 Extra name aliases are output whenever DECL is output. */
kono
parents: 67
diff changeset
781
kono
parents: 67
diff changeset
782 varpool_node *
kono
parents: 67
diff changeset
783 varpool_node::create_extra_name_alias (tree alias, tree decl)
kono
parents: 67
diff changeset
784 {
kono
parents: 67
diff changeset
785 varpool_node *alias_node;
kono
parents: 67
diff changeset
786
kono
parents: 67
diff changeset
787 /* If aliases aren't supported by the assembler, fail. */
kono
parents: 67
diff changeset
788 if (!TARGET_SUPPORTS_ALIASES)
kono
parents: 67
diff changeset
789 return NULL;
kono
parents: 67
diff changeset
790
kono
parents: 67
diff changeset
791 alias_node = varpool_node::create_alias (alias, decl);
kono
parents: 67
diff changeset
792 alias_node->cpp_implicit_alias = true;
kono
parents: 67
diff changeset
793
kono
parents: 67
diff changeset
794 /* Extra name alias mechanizm creates aliases really late
kono
parents: 67
diff changeset
795 via DECL_ASSEMBLER_NAME mechanizm.
kono
parents: 67
diff changeset
796 This is unfortunate because they are not going through the
kono
parents: 67
diff changeset
797 standard channels. Ensure they get output. */
kono
parents: 67
diff changeset
798 if (symtab->cpp_implicit_aliases_done)
kono
parents: 67
diff changeset
799 alias_node->resolve_alias (varpool_node::get_create (decl));
kono
parents: 67
diff changeset
800 return alias_node;
kono
parents: 67
diff changeset
801 }
kono
parents: 67
diff changeset
802
kono
parents: 67
diff changeset
803 /* Worker for call_for_symbol_and_aliases. */
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
804
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
805 bool
111
kono
parents: 67
diff changeset
806 varpool_node::call_for_symbol_and_aliases_1 (bool (*callback) (varpool_node *,
kono
parents: 67
diff changeset
807 void *),
kono
parents: 67
diff changeset
808 void *data,
kono
parents: 67
diff changeset
809 bool include_overwritable)
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
810 {
111
kono
parents: 67
diff changeset
811 ipa_ref *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
812
111
kono
parents: 67
diff changeset
813 FOR_EACH_ALIAS (this, ref)
kono
parents: 67
diff changeset
814 {
kono
parents: 67
diff changeset
815 varpool_node *alias = dyn_cast <varpool_node *> (ref->referring);
kono
parents: 67
diff changeset
816 if (include_overwritable
kono
parents: 67
diff changeset
817 || alias->get_availability () > AVAIL_INTERPOSABLE)
kono
parents: 67
diff changeset
818 if (alias->call_for_symbol_and_aliases (callback, data,
kono
parents: 67
diff changeset
819 include_overwritable))
kono
parents: 67
diff changeset
820 return true;
kono
parents: 67
diff changeset
821 }
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
822 return false;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
823 }