]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/lto-symtab.c
* lto-symtab.c (lto_cgraph_replace_node): Assert that inline clones has
[thirdparty/gcc.git] / gcc / lto-symtab.c
1 /* LTO symbol table.
2 Copyright 2009 Free Software Foundation, Inc.
3 Contributed by CodeSourcery, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "toplev.h"
25 #include "tree.h"
26 #include "gimple.h"
27 #include "ggc.h" /* lambda.h needs this */
28 #include "lambda.h" /* gcd */
29 #include "hashtab.h"
30 #include "plugin-api.h"
31 #include "lto-streamer.h"
32
33 /* Vector to keep track of external variables we've seen so far. */
34 VEC(tree,gc) *lto_global_var_decls;
35
36 /* Symbol table entry. */
37
38 struct GTY(()) lto_symtab_entry_def
39 {
40 /* The symbol table entry key, an IDENTIFIER. */
41 tree id;
42 /* The symbol table entry, a DECL. */
43 tree decl;
44 /* LTO file-data and symbol resolution for this decl. */
45 struct lto_file_decl_data * GTY((skip (""))) file_data;
46 enum ld_plugin_symbol_resolution resolution;
47 /* Pointer to the next entry with the same key. Before decl merging
48 this links all symbols from the different TUs. After decl merging
49 this links merged but incompatible decls, thus all prevailing ones
50 remaining. */
51 struct lto_symtab_entry_def *next;
52 };
53 typedef struct lto_symtab_entry_def *lto_symtab_entry_t;
54
55 /* A poor man's symbol table. This hashes identifier to prevailing DECL
56 if there is one. */
57
58 static GTY ((if_marked ("lto_symtab_entry_marked_p"),
59 param_is (struct lto_symtab_entry_def)))
60 htab_t lto_symtab_identifiers;
61
62 /* Return the hash value of an lto_symtab_entry_t object pointed to by P. */
63
64 static hashval_t
65 lto_symtab_entry_hash (const void *p)
66 {
67 const struct lto_symtab_entry_def *base =
68 (const struct lto_symtab_entry_def *) p;
69 return htab_hash_string (IDENTIFIER_POINTER (base->id));
70 }
71
72 /* Return non-zero if P1 and P2 points to lto_symtab_entry_def structs
73 corresponding to the same symbol. */
74
75 static int
76 lto_symtab_entry_eq (const void *p1, const void *p2)
77 {
78 const struct lto_symtab_entry_def *base1 =
79 (const struct lto_symtab_entry_def *) p1;
80 const struct lto_symtab_entry_def *base2 =
81 (const struct lto_symtab_entry_def *) p2;
82 return (base1->id == base2->id);
83 }
84
85 /* Returns non-zero if P points to an lto_symtab_entry_def struct that needs
86 to be marked for GC. */
87
88 static int
89 lto_symtab_entry_marked_p (const void *p)
90 {
91 const struct lto_symtab_entry_def *base =
92 (const struct lto_symtab_entry_def *) p;
93
94 /* Keep this only if the decl or the chain is marked. */
95 return (ggc_marked_p (base->decl)
96 || (base->next && ggc_marked_p (base->next)));
97 }
98
99 /* Lazily initialize resolution hash tables. */
100
101 static void
102 lto_symtab_maybe_init_hash_table (void)
103 {
104 if (lto_symtab_identifiers)
105 return;
106
107 lto_symtab_identifiers =
108 htab_create_ggc (1021, lto_symtab_entry_hash,
109 lto_symtab_entry_eq, NULL);
110 }
111
112 static bool maybe_merge_incomplete_and_complete_type (tree, tree);
113
114 /* Try to merge an incomplete type INCOMPLETE with a complete type
115 COMPLETE of same kinds.
116 Return true if they were merged, false otherwise. */
117
118 static bool
119 merge_incomplete_and_complete_type (tree incomplete, tree complete)
120 {
121 /* For merging array types do some extra sanity checking. */
122 if (TREE_CODE (incomplete) == ARRAY_TYPE
123 && !maybe_merge_incomplete_and_complete_type (TREE_TYPE (incomplete),
124 TREE_TYPE (complete))
125 && !gimple_types_compatible_p (TREE_TYPE (incomplete),
126 TREE_TYPE (complete)))
127 return false;
128
129 /* ??? Ideally we would do this by means of a common canonical type, but
130 that's difficult as we do not have links from the canonical type
131 back to all its children. */
132 gimple_force_type_merge (incomplete, complete);
133
134 return true;
135 }
136
137 /* Try to merge a maybe complete / incomplete type pair TYPE1 and TYPE2.
138 Return true if they were merged, false otherwise. */
139
140 static bool
141 maybe_merge_incomplete_and_complete_type (tree type1, tree type2)
142 {
143 bool res = false;
144
145 if (TREE_CODE (type1) != TREE_CODE (type2))
146 return false;
147
148 if (!COMPLETE_TYPE_P (type1) && COMPLETE_TYPE_P (type2))
149 res = merge_incomplete_and_complete_type (type1, type2);
150 else if (COMPLETE_TYPE_P (type1) && !COMPLETE_TYPE_P (type2))
151 res = merge_incomplete_and_complete_type (type2, type1);
152
153 /* Recurse on pointer targets. */
154 if (!res
155 && POINTER_TYPE_P (type1)
156 && POINTER_TYPE_P (type2))
157 res = maybe_merge_incomplete_and_complete_type (TREE_TYPE (type1),
158 TREE_TYPE (type2));
159
160 return res;
161 }
162
163 /* Check if OLD_DECL and NEW_DECL are compatible. */
164
165 static bool
166 lto_symtab_compatible (tree old_decl, tree new_decl)
167 {
168 tree old_type, new_type;
169
170 if (TREE_CODE (old_decl) != TREE_CODE (new_decl))
171 {
172 switch (TREE_CODE (new_decl))
173 {
174 case VAR_DECL:
175 gcc_assert (TREE_CODE (old_decl) == FUNCTION_DECL);
176 error_at (DECL_SOURCE_LOCATION (new_decl),
177 "function %qD redeclared as variable", new_decl);
178 inform (DECL_SOURCE_LOCATION (old_decl),
179 "previously declared here");
180 return false;
181
182 case FUNCTION_DECL:
183 gcc_assert (TREE_CODE (old_decl) == VAR_DECL);
184 error_at (DECL_SOURCE_LOCATION (new_decl),
185 "variable %qD redeclared as function", new_decl);
186 inform (DECL_SOURCE_LOCATION (old_decl),
187 "previously declared here");
188 return false;
189
190 default:
191 gcc_unreachable ();
192 }
193 }
194
195 if (TREE_CODE (new_decl) == FUNCTION_DECL)
196 {
197 if (!gimple_types_compatible_p (TREE_TYPE (old_decl),
198 TREE_TYPE (new_decl)))
199 /* If we don't have a merged type yet...sigh. The linker
200 wouldn't complain if the types were mismatched, so we
201 probably shouldn't either. Just use the type from
202 whichever decl appears to be associated with the
203 definition. If for some odd reason neither decl is, the
204 older one wins. */
205 (void) 0;
206
207 return true;
208 }
209
210 /* Now we exclusively deal with VAR_DECLs. */
211
212 /* Handle external declarations with incomplete type or pointed-to
213 incomplete types by forcefully merging the types.
214 ??? In principle all types involved in the two decls should
215 be merged forcefully, for example without considering type or
216 field names. */
217 old_type = TREE_TYPE (old_decl);
218 new_type = TREE_TYPE (new_decl);
219
220 if (DECL_EXTERNAL (old_decl) || DECL_EXTERNAL (new_decl))
221 maybe_merge_incomplete_and_complete_type (old_type, new_type);
222 else if (POINTER_TYPE_P (old_type)
223 && POINTER_TYPE_P (new_type))
224 maybe_merge_incomplete_and_complete_type (TREE_TYPE (old_type),
225 TREE_TYPE (new_type));
226
227 /* For array types we have to accept external declarations with
228 different sizes than the actual definition (164.gzip).
229 ??? We could emit a warning here. */
230 if (TREE_CODE (old_type) == TREE_CODE (new_type)
231 && TREE_CODE (old_type) == ARRAY_TYPE
232 && COMPLETE_TYPE_P (old_type)
233 && COMPLETE_TYPE_P (new_type)
234 && tree_int_cst_compare (TYPE_SIZE (old_type),
235 TYPE_SIZE (new_type)) != 0
236 && gimple_types_compatible_p (TREE_TYPE (old_type),
237 TREE_TYPE (new_type)))
238 {
239 /* If only one is external use the type of the non-external decl.
240 Else use the larger one and also adjust the decl size.
241 ??? Directional merging would allow us to simply pick the
242 larger one instead of rewriting it. */
243 if (DECL_EXTERNAL (old_decl) ^ DECL_EXTERNAL (new_decl))
244 {
245 if (DECL_EXTERNAL (old_decl))
246 TREE_TYPE (old_decl) = new_type;
247 else if (DECL_EXTERNAL (new_decl))
248 TREE_TYPE (new_decl) = old_type;
249 }
250 else
251 {
252 if (tree_int_cst_compare (TYPE_SIZE (old_type),
253 TYPE_SIZE (new_type)) < 0)
254 {
255 TREE_TYPE (old_decl) = new_type;
256 DECL_SIZE (old_decl) = DECL_SIZE (new_decl);
257 DECL_SIZE_UNIT (old_decl) = DECL_SIZE_UNIT (new_decl);
258 }
259 else
260 {
261 TREE_TYPE (new_decl) = old_type;
262 DECL_SIZE (new_decl) = DECL_SIZE (old_decl);
263 DECL_SIZE_UNIT (new_decl) = DECL_SIZE_UNIT (old_decl);
264 }
265 }
266 }
267
268 /* We can tolerate differences in type qualification, the
269 qualification of the prevailing definition will prevail. */
270 old_type = TYPE_MAIN_VARIANT (TREE_TYPE (old_decl));
271 new_type = TYPE_MAIN_VARIANT (TREE_TYPE (new_decl));
272 if (!gimple_types_compatible_p (old_type, new_type))
273 {
274 if (warning_at (DECL_SOURCE_LOCATION (new_decl), 0,
275 "type of %qD does not match original declaration",
276 new_decl))
277 inform (DECL_SOURCE_LOCATION (old_decl),
278 "previously declared here");
279 return false;
280 }
281
282 /* ??? We might want to emit a warning here if type qualification
283 differences were spotted. Do not do this unconditionally though. */
284
285 /* There is no point in comparing too many details of the decls here.
286 The type compatibility checks or the completing of types has properly
287 dealt with most issues. */
288
289 /* The following should all not invoke fatal errors as in non-LTO
290 mode the linker wouldn't complain either. Just emit warnings. */
291
292 /* Report a warning if user-specified alignments do not match. */
293 if ((DECL_USER_ALIGN (old_decl) && DECL_USER_ALIGN (new_decl))
294 && DECL_ALIGN (old_decl) != DECL_ALIGN (new_decl))
295 {
296 warning_at (DECL_SOURCE_LOCATION (new_decl), 0,
297 "alignment of %qD does not match original declaration",
298 new_decl);
299 inform (DECL_SOURCE_LOCATION (old_decl), "previously declared here");
300 return false;
301 }
302
303 return true;
304 }
305
306 /* Registers DECL with the LTO symbol table as having resolution RESOLUTION
307 and read from FILE_DATA. */
308
309 void
310 lto_symtab_register_decl (tree decl,
311 ld_plugin_symbol_resolution_t resolution,
312 struct lto_file_decl_data *file_data)
313 {
314 lto_symtab_entry_t new_entry;
315 void **slot;
316
317 /* Check that declarations reaching this function do not have
318 properties inconsistent with having external linkage. If any of
319 these asertions fail, then the object file reader has failed to
320 detect these cases and issue appropriate error messages. */
321 gcc_assert (decl
322 && TREE_PUBLIC (decl)
323 && (TREE_CODE (decl) == VAR_DECL
324 || TREE_CODE (decl) == FUNCTION_DECL)
325 && DECL_ASSEMBLER_NAME_SET_P (decl));
326 if (TREE_CODE (decl) == VAR_DECL)
327 gcc_assert (!(DECL_EXTERNAL (decl) && DECL_INITIAL (decl)));
328 if (TREE_CODE (decl) == FUNCTION_DECL)
329 gcc_assert (!DECL_ABSTRACT (decl));
330
331 new_entry = GGC_CNEW (struct lto_symtab_entry_def);
332 new_entry->id = DECL_ASSEMBLER_NAME (decl);
333 new_entry->decl = decl;
334 new_entry->resolution = resolution;
335 new_entry->file_data = file_data;
336
337 lto_symtab_maybe_init_hash_table ();
338 slot = htab_find_slot (lto_symtab_identifiers, new_entry, INSERT);
339 new_entry->next = (lto_symtab_entry_t) *slot;
340 *slot = new_entry;
341 }
342
343 /* Get the lto_symtab_entry_def struct associated with ID
344 if there is one. */
345
346 static lto_symtab_entry_t
347 lto_symtab_get (tree id)
348 {
349 struct lto_symtab_entry_def temp;
350 void **slot;
351
352 lto_symtab_maybe_init_hash_table ();
353 temp.id = id;
354 slot = htab_find_slot (lto_symtab_identifiers, &temp, NO_INSERT);
355 return slot ? (lto_symtab_entry_t) *slot : NULL;
356 }
357
358 /* Get the linker resolution for DECL. */
359
360 enum ld_plugin_symbol_resolution
361 lto_symtab_get_resolution (tree decl)
362 {
363 lto_symtab_entry_t e;
364
365 gcc_assert (DECL_ASSEMBLER_NAME_SET_P (decl));
366
367 e = lto_symtab_get (DECL_ASSEMBLER_NAME (decl));
368 while (e && e->decl != decl)
369 e = e->next;
370 if (!e)
371 return LDPR_UNKNOWN;
372
373 return e->resolution;
374 }
375
376 /* Replace the cgraph node OLD_NODE with NEW_NODE in the cgraph, merging
377 all edges and removing the old node. */
378
379 static void
380 lto_cgraph_replace_node (struct cgraph_node *old_node,
381 struct cgraph_node *new_node)
382 {
383 struct cgraph_edge *e, *next;
384
385 /* Merge node flags. */
386 if (old_node->needed)
387 cgraph_mark_needed_node (new_node);
388 if (old_node->reachable)
389 cgraph_mark_reachable_node (new_node);
390 if (old_node->address_taken)
391 {
392 gcc_assert (!new_node->global.inlined_to);
393 cgraph_mark_address_taken_node (new_node);
394 }
395
396 /* Redirect all incoming edges. */
397 for (e = old_node->callers; e; e = next)
398 {
399 next = e->next_caller;
400 cgraph_redirect_edge_callee (e, new_node);
401 }
402
403 /* There are not supposed to be any outgoing edges from a node we
404 replace. Still this can happen for multiple instances of weak
405 functions.
406 ??? For now do what the old code did. Do not create edges for them. */
407 for (e = old_node->callees; e; e = next)
408 {
409 next = e->next_callee;
410 cgraph_remove_edge (e);
411 }
412
413 /* Finally remove the replaced node. */
414 cgraph_remove_node (old_node);
415 }
416
417 /* Merge two variable or function symbol table entries ENTRY1 and ENTRY2.
418 Return the prevailing one or NULL if a merge is not possible. */
419
420 static lto_symtab_entry_t
421 lto_symtab_merge (lto_symtab_entry_t entry1, lto_symtab_entry_t entry2)
422 {
423 tree old_decl = entry1->decl;
424 tree new_decl = entry2->decl;
425 ld_plugin_symbol_resolution_t old_resolution = entry1->resolution;
426 ld_plugin_symbol_resolution_t new_resolution = entry2->resolution;
427 struct cgraph_node *old_node = NULL;
428 struct cgraph_node *new_node = NULL;
429
430 /* Give ODR violation errors. */
431 if (new_resolution == LDPR_PREVAILING_DEF
432 || new_resolution == LDPR_PREVAILING_DEF_IRONLY)
433 {
434 if ((old_resolution == LDPR_PREVAILING_DEF
435 || old_resolution == LDPR_PREVAILING_DEF_IRONLY)
436 && (old_resolution != new_resolution || flag_no_common))
437 {
438 error_at (DECL_SOURCE_LOCATION (new_decl),
439 "%qD has already been defined", new_decl);
440 inform (DECL_SOURCE_LOCATION (old_decl),
441 "previously defined here");
442 return NULL;
443 }
444 }
445
446 /* The linker may ask us to combine two incompatible symbols. */
447 if (!lto_symtab_compatible (old_decl, new_decl))
448 return NULL;
449
450 if (TREE_CODE (old_decl) == FUNCTION_DECL)
451 old_node = cgraph_get_node (old_decl);
452 if (TREE_CODE (new_decl) == FUNCTION_DECL)
453 new_node = cgraph_get_node (new_decl);
454
455 /* Merge decl state in both directions, we may still end up using
456 the new decl. */
457 TREE_ADDRESSABLE (old_decl) |= TREE_ADDRESSABLE (new_decl);
458 TREE_ADDRESSABLE (new_decl) |= TREE_ADDRESSABLE (old_decl);
459
460 gcc_assert (new_resolution != LDPR_UNKNOWN
461 && new_resolution != LDPR_UNDEF
462 && old_resolution != LDPR_UNKNOWN
463 && old_resolution != LDPR_UNDEF);
464
465 if (new_resolution == LDPR_PREVAILING_DEF
466 || new_resolution == LDPR_PREVAILING_DEF_IRONLY
467 || (!old_node && new_node))
468 {
469 gcc_assert ((!old_node && new_node)
470 || old_resolution == LDPR_PREEMPTED_IR
471 || old_resolution == LDPR_RESOLVED_IR
472 || (old_resolution == new_resolution && !flag_no_common));
473 if (old_node)
474 lto_cgraph_replace_node (old_node, new_node);
475 /* Choose new_decl, entry2. */
476 return entry2;
477 }
478
479 if (new_resolution == LDPR_PREEMPTED_REG
480 || new_resolution == LDPR_RESOLVED_EXEC
481 || new_resolution == LDPR_RESOLVED_DYN)
482 gcc_assert (old_resolution == LDPR_PREEMPTED_REG
483 || old_resolution == LDPR_RESOLVED_EXEC
484 || old_resolution == LDPR_RESOLVED_DYN);
485
486 if (new_resolution == LDPR_PREEMPTED_IR
487 || new_resolution == LDPR_RESOLVED_IR)
488 gcc_assert (old_resolution == LDPR_PREVAILING_DEF
489 || old_resolution == LDPR_PREVAILING_DEF_IRONLY
490 || old_resolution == LDPR_PREEMPTED_IR
491 || old_resolution == LDPR_RESOLVED_IR);
492
493 if (new_node)
494 lto_cgraph_replace_node (new_node, old_node);
495
496 /* Choose old_decl, entry1. */
497 return entry1;
498 }
499
500 /* Resolve the symbol with the candidates in the chain *SLOT and store
501 their resolutions. */
502
503 static void
504 lto_symtab_resolve_symbols (void **slot)
505 {
506 lto_symtab_entry_t e = (lto_symtab_entry_t) *slot;
507
508 /* If the chain is already resolved there is nothing to do. */
509 if (e->resolution != LDPR_UNKNOWN)
510 return;
511
512 /* This is a poor mans resolver. */
513 for (; e; e = e->next)
514 {
515 gcc_assert (e->resolution == LDPR_UNKNOWN);
516 if (DECL_EXTERNAL (e->decl)
517 || (TREE_CODE (e->decl) == FUNCTION_DECL
518 && !cgraph_get_node (e->decl)))
519 e->resolution = LDPR_RESOLVED_IR;
520 else
521 {
522 if (TREE_READONLY (e->decl))
523 e->resolution = LDPR_PREVAILING_DEF_IRONLY;
524 else
525 e->resolution = LDPR_PREVAILING_DEF;
526 }
527 }
528 }
529
530 /* Merge one symbol table chain to a (set of) prevailing decls. */
531
532 static void
533 lto_symtab_merge_decls_2 (void **slot)
534 {
535 lto_symtab_entry_t e2, e1;
536
537 /* Nothing to do for a single entry. */
538 e1 = (lto_symtab_entry_t) *slot;
539 if (!e1->next)
540 return;
541
542 /* Try to merge each entry with each other entry. In case of a
543 single prevailing decl this is linear. */
544 restart:
545 for (; e1; e1 = e1->next)
546 for (e2 = e1->next; e2; e2 = e2->next)
547 {
548 lto_symtab_entry_t prevailing = lto_symtab_merge (e1, e2);
549 if (prevailing == e1)
550 {
551 lto_symtab_entry_t tmp = prevailing;
552 while (tmp->next != e2)
553 tmp = tmp->next;
554 tmp->next = e2->next;
555 e2->next = NULL;
556 e2 = tmp;
557 }
558 else if (prevailing == e2)
559 {
560 lto_symtab_entry_t tmp = (lto_symtab_entry_t) *slot;
561 if (tmp == e1)
562 {
563 *slot = e1->next;
564 tmp = e1->next;
565 }
566 else
567 {
568 while (tmp->next != e1)
569 tmp = tmp->next;
570 tmp->next = e1->next;
571 }
572 e1->next = NULL;
573 e1 = tmp;
574 goto restart;
575 }
576 }
577 }
578
579 /* Fixup the chain of prevailing variable decls *SLOT that are commonized
580 during link-time. */
581
582 static void
583 lto_symtab_fixup_var_decls (void **slot)
584 {
585 lto_symtab_entry_t e = (lto_symtab_entry_t) *slot;
586 tree size = bitsize_zero_node;
587
588 /* Find the largest prevailing decl and move it to the front of the chain.
589 This is the decl we will output as representative for the common
590 section. */
591 size = bitsize_zero_node;
592 if (e->resolution == LDPR_PREVAILING_DEF_IRONLY
593 || e->resolution == LDPR_PREVAILING_DEF)
594 size = DECL_SIZE (e->decl);
595 for (; e->next;)
596 {
597 lto_symtab_entry_t next = e->next;
598 if ((next->resolution == LDPR_PREVAILING_DEF_IRONLY
599 || next->resolution == LDPR_PREVAILING_DEF)
600 && tree_int_cst_lt (size, DECL_SIZE (next->decl)))
601 {
602 size = DECL_SIZE (next->decl);
603 e->next = next->next;
604 next->next = (lto_symtab_entry_t) *slot;
605 *slot = next;
606 }
607 else
608 e = next;
609 }
610
611 /* Mark everything apart from the first var as written out. */
612 e = (lto_symtab_entry_t) *slot;
613 for (e = e->next; e; e = e->next)
614 TREE_ASM_WRITTEN (e->decl) = true;
615 }
616
617 /* Helper to process the decl chain for the symbol table entry *SLOT. */
618
619 static int
620 lto_symtab_merge_decls_1 (void **slot, void *data ATTRIBUTE_UNUSED)
621 {
622 lto_symtab_entry_t e;
623
624 /* Compute the symbol resolutions. */
625 lto_symtab_resolve_symbols (slot);
626
627 /* Register and adjust types of the entries. */
628 for (e = (lto_symtab_entry_t) *slot; e; e = e->next)
629 TREE_TYPE (e->decl) = gimple_register_type (TREE_TYPE (e->decl));
630
631 /* Merge the chain to a (hopefully) single prevailing decl. */
632 lto_symtab_merge_decls_2 (slot);
633
634 /* ??? Ideally we should delay all diagnostics until this point to
635 avoid duplicates. */
636
637 /* All done for FUNCTION_DECLs. */
638 e = (lto_symtab_entry_t) *slot;
639 if (TREE_CODE (e->decl) == FUNCTION_DECL)
640 return 1;
641
642 /* Fixup variables in case there are multiple prevailing ones. */
643 if (e->next)
644 lto_symtab_fixup_var_decls (slot);
645
646 /* Insert all variable decls into the global variable decl vector. */
647 for (e = (lto_symtab_entry_t) *slot; e; e = e->next)
648 VEC_safe_push (tree, gc, lto_global_var_decls, e->decl);
649
650 return 1;
651 }
652
653 /* Resolve and merge all symbol table chains to a prevailing decl. */
654
655 void
656 lto_symtab_merge_decls (void)
657 {
658 lto_symtab_maybe_init_hash_table ();
659 htab_traverse (lto_symtab_identifiers, lto_symtab_merge_decls_1, NULL);
660 }
661
662
663 /* Given the decl DECL, return the prevailing decl with the same name. */
664
665 tree
666 lto_symtab_prevailing_decl (tree decl)
667 {
668 lto_symtab_entry_t ret;
669
670 /* Builtins and local symbols are their own prevailing decl. */
671 if (!TREE_PUBLIC (decl) || is_builtin_fn (decl))
672 return decl;
673
674 /* DECL_ABSTRACTs are their own prevailng decl. */
675 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_ABSTRACT (decl))
676 return decl;
677
678 /* Ensure DECL_ASSEMBLER_NAME will not set assembler name. */
679 gcc_assert (DECL_ASSEMBLER_NAME_SET_P (decl));
680
681 /* Walk through the list of candidates and return the one we merged to. */
682 ret = lto_symtab_get (DECL_ASSEMBLER_NAME (decl));
683 if (!ret)
684 return NULL_TREE;
685
686 /* If there is only one candidate return it. */
687 if (ret->next == NULL)
688 return ret->decl;
689
690 /* If there are multiple decls to choose from find the one we merged
691 with and return that. */
692 while (ret)
693 {
694 if (gimple_types_compatible_p (TREE_TYPE (decl), TREE_TYPE (ret->decl)))
695 return ret->decl;
696
697 ret = ret->next;
698 }
699
700 gcc_unreachable ();
701 }
702
703 /* Remove any storage used to store resolution of DECL. */
704
705 void
706 lto_symtab_clear_resolution (tree decl)
707 {
708 struct lto_symtab_entry_def temp;
709 lto_symtab_entry_t head;
710 void **slot;
711
712 if (!TREE_PUBLIC (decl))
713 return;
714
715 /* LTO FIXME: There should be no DECL_ABSTRACT in the middle end. */
716 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_ABSTRACT (decl))
717 return;
718
719 gcc_assert (DECL_ASSEMBLER_NAME_SET_P (decl));
720
721 lto_symtab_maybe_init_hash_table ();
722 temp.id = DECL_ASSEMBLER_NAME (decl);
723 slot = htab_find_slot (lto_symtab_identifiers, &temp, NO_INSERT);
724 if (!*slot)
725 return;
726
727 head = (lto_symtab_entry_t) *slot;
728 if (head->decl == decl)
729 {
730 if (head->next)
731 {
732 *slot = head->next;
733 head->next = NULL;
734 }
735 else
736 htab_remove_elt (lto_symtab_identifiers, &temp);
737 }
738 else
739 {
740 lto_symtab_entry_t e;
741 while (head->next && head->next->decl != decl)
742 head = head->next;
743 if (head->next)
744 {
745 e = head->next;
746 head->next = e->next;
747 e->next = NULL;
748 }
749 }
750 }
751
752 #include "gt-lto-symtab.h"