OSDN Git Service

2009-08-28 Sebastian Pop <sebastian.pop@amd.com>
[pf3gnuchains/gcc-fork.git] / gcc / cgraph.c
1 /* Callgraph handling code.
2    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009
3    Free Software Foundation, Inc.
4    Contributed by Jan Hubicka
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /*  This file contains basic routines manipulating call graph
23
24 The callgraph:
25
26     The call-graph is data structure designed for intra-procedural optimization
27     but it is also used in non-unit-at-a-time compilation to allow easier code
28     sharing.
29
30     The call-graph consist of nodes and edges represented via linked lists.
31     Each function (external or not) corresponds to the unique node.
32
33     The mapping from declarations to call-graph nodes is done using hash table
34     based on DECL_UID.  The call-graph nodes are created lazily using
35     cgraph_node function when called for unknown declaration.
36
37     The callgraph at the moment does not represent indirect calls or calls
38     from other compilation unit.  Flag NEEDED is set for each node that may
39     be accessed in such an invisible way and it shall be considered an
40     entry point to the callgraph.
41
42     Interprocedural information:
43
44       Callgraph is place to store data needed for interprocedural optimization.
45       All data structures are divided into three components: local_info that
46       is produced while analyzing the function, global_info that is result
47       of global walking of the callgraph on the end of compilation and
48       rtl_info used by RTL backend to propagate data from already compiled
49       functions to their callers.
50
51     Inlining plans:
52
53       The function inlining information is decided in advance and maintained
54       in the callgraph as so called inline plan.
55       For each inlined call, the callee's node is cloned to represent the
56       new function copy produced by inliner.
57       Each inlined call gets a unique corresponding clone node of the callee
58       and the data structure is updated while inlining is performed, so
59       the clones are eliminated and their callee edges redirected to the
60       caller.
61
62       Each edge has "inline_failed" field.  When the field is set to NULL,
63       the call will be inlined.  When it is non-NULL it contains a reason
64       why inlining wasn't performed.  */
65
66 #include "config.h"
67 #include "system.h"
68 #include "coretypes.h"
69 #include "tm.h"
70 #include "tree.h"
71 #include "tree-inline.h"
72 #include "langhooks.h"
73 #include "hashtab.h"
74 #include "toplev.h"
75 #include "flags.h"
76 #include "ggc.h"
77 #include "debug.h"
78 #include "target.h"
79 #include "basic-block.h"
80 #include "cgraph.h"
81 #include "output.h"
82 #include "intl.h"
83 #include "gimple.h"
84 #include "tree-dump.h"
85 #include "tree-flow.h"
86 #include "value-prof.h"
87
88 static void cgraph_node_remove_callers (struct cgraph_node *node);
89 static inline void cgraph_edge_remove_caller (struct cgraph_edge *e);
90 static inline void cgraph_edge_remove_callee (struct cgraph_edge *e);
91
92 /* Hash table used to convert declarations into nodes.  */
93 static GTY((param_is (struct cgraph_node))) htab_t cgraph_hash;
94 /* Hash table used to convert assembler names into nodes.  */
95 static GTY((param_is (struct cgraph_node))) htab_t assembler_name_hash;
96
97 /* The linked list of cgraph nodes.  */
98 struct cgraph_node *cgraph_nodes;
99
100 /* Queue of cgraph nodes scheduled to be lowered.  */
101 struct cgraph_node *cgraph_nodes_queue;
102
103 /* Queue of cgraph nodes scheduled to be added into cgraph.  This is a
104    secondary queue used during optimization to accommodate passes that
105    may generate new functions that need to be optimized and expanded.  */
106 struct cgraph_node *cgraph_new_nodes;
107
108 /* Number of nodes in existence.  */
109 int cgraph_n_nodes;
110
111 /* Maximal uid used in cgraph nodes.  */
112 int cgraph_max_uid;
113
114 /* Maximal uid used in cgraph edges.  */
115 int cgraph_edge_max_uid;
116
117 /* Maximal pid used for profiling */
118 int cgraph_max_pid;
119
120 /* Set when whole unit has been analyzed so we can access global info.  */
121 bool cgraph_global_info_ready = false;
122
123 /* What state callgraph is in right now.  */
124 enum cgraph_state cgraph_state = CGRAPH_STATE_CONSTRUCTION;
125
126 /* Set when the cgraph is fully build and the basic flags are computed.  */
127 bool cgraph_function_flags_ready = false;
128
129 /* Linked list of cgraph asm nodes.  */
130 struct cgraph_asm_node *cgraph_asm_nodes;
131
132 /* Last node in cgraph_asm_nodes.  */
133 static GTY(()) struct cgraph_asm_node *cgraph_asm_last_node;
134
135 /* The order index of the next cgraph node to be created.  This is
136    used so that we can sort the cgraph nodes in order by when we saw
137    them, to support -fno-toplevel-reorder.  */
138 int cgraph_order;
139
140 /* List of hooks trigerred on cgraph_edge events.  */
141 struct cgraph_edge_hook_list {
142   cgraph_edge_hook hook;
143   void *data;
144   struct cgraph_edge_hook_list *next;
145 };
146
147 /* List of hooks trigerred on cgraph_node events.  */
148 struct cgraph_node_hook_list {
149   cgraph_node_hook hook;
150   void *data;
151   struct cgraph_node_hook_list *next;
152 };
153
154 /* List of hooks trigerred on events involving two cgraph_edges.  */
155 struct cgraph_2edge_hook_list {
156   cgraph_2edge_hook hook;
157   void *data;
158   struct cgraph_2edge_hook_list *next;
159 };
160
161 /* List of hooks trigerred on events involving two cgraph_nodes.  */
162 struct cgraph_2node_hook_list {
163   cgraph_2node_hook hook;
164   void *data;
165   struct cgraph_2node_hook_list *next;
166 };
167
168 /* List of hooks triggered when an edge is removed.  */
169 struct cgraph_edge_hook_list *first_cgraph_edge_removal_hook;
170 /* List of hooks triggered when a node is removed.  */
171 struct cgraph_node_hook_list *first_cgraph_node_removal_hook;
172 /* List of hooks triggered when an edge is duplicated.  */
173 struct cgraph_2edge_hook_list *first_cgraph_edge_duplicated_hook;
174 /* List of hooks triggered when a node is duplicated.  */
175 struct cgraph_2node_hook_list *first_cgraph_node_duplicated_hook;
176 /* List of hooks triggered when an function is inserted.  */
177 struct cgraph_node_hook_list *first_cgraph_function_insertion_hook;
178
179 /* Head of a linked list of unused (freed) call graph nodes.
180    Do not GTY((delete)) this list so UIDs gets reliably recycled.  */
181 static GTY(()) struct cgraph_node *free_nodes;
182 /* Head of a linked list of unused (freed) call graph edges.
183    Do not GTY((delete)) this list so UIDs gets reliably recycled.  */
184 static GTY(()) struct cgraph_edge *free_edges;
185
186 /* Macros to access the next item in the list of free cgraph nodes and
187    edges. */
188 #define NEXT_FREE_NODE(NODE) (NODE)->next
189 #define NEXT_FREE_EDGE(EDGE) (EDGE)->prev_caller
190
191 /* Register HOOK to be called with DATA on each removed edge.  */
192 struct cgraph_edge_hook_list *
193 cgraph_add_edge_removal_hook (cgraph_edge_hook hook, void *data)
194 {
195   struct cgraph_edge_hook_list *entry;
196   struct cgraph_edge_hook_list **ptr = &first_cgraph_edge_removal_hook;
197
198   entry = (struct cgraph_edge_hook_list *) xmalloc (sizeof (*entry));
199   entry->hook = hook;
200   entry->data = data;
201   entry->next = NULL;
202   while (*ptr)
203     ptr = &(*ptr)->next;
204   *ptr = entry;
205   return entry;
206 }
207
208 /* Remove ENTRY from the list of hooks called on removing edges.  */
209 void
210 cgraph_remove_edge_removal_hook (struct cgraph_edge_hook_list *entry)
211 {
212   struct cgraph_edge_hook_list **ptr = &first_cgraph_edge_removal_hook;
213
214   while (*ptr != entry)
215     ptr = &(*ptr)->next;
216   *ptr = entry->next;
217   free (entry);
218 }
219
220 /* Call all edge removal hooks.  */
221 static void
222 cgraph_call_edge_removal_hooks (struct cgraph_edge *e)
223 {
224   struct cgraph_edge_hook_list *entry = first_cgraph_edge_removal_hook;
225   while (entry)
226   {
227     entry->hook (e, entry->data);
228     entry = entry->next;
229   }
230 }
231
232 /* Register HOOK to be called with DATA on each removed node.  */
233 struct cgraph_node_hook_list *
234 cgraph_add_node_removal_hook (cgraph_node_hook hook, void *data)
235 {
236   struct cgraph_node_hook_list *entry;
237   struct cgraph_node_hook_list **ptr = &first_cgraph_node_removal_hook;
238
239   entry = (struct cgraph_node_hook_list *) xmalloc (sizeof (*entry));
240   entry->hook = hook;
241   entry->data = data;
242   entry->next = NULL;
243   while (*ptr)
244     ptr = &(*ptr)->next;
245   *ptr = entry;
246   return entry;
247 }
248
249 /* Remove ENTRY from the list of hooks called on removing nodes.  */
250 void
251 cgraph_remove_node_removal_hook (struct cgraph_node_hook_list *entry)
252 {
253   struct cgraph_node_hook_list **ptr = &first_cgraph_node_removal_hook;
254
255   while (*ptr != entry)
256     ptr = &(*ptr)->next;
257   *ptr = entry->next;
258   free (entry);
259 }
260
261 /* Call all node removal hooks.  */
262 static void
263 cgraph_call_node_removal_hooks (struct cgraph_node *node)
264 {
265   struct cgraph_node_hook_list *entry = first_cgraph_node_removal_hook;
266   while (entry)
267   {
268     entry->hook (node, entry->data);
269     entry = entry->next;
270   }
271 }
272
273 /* Register HOOK to be called with DATA on each removed node.  */
274 struct cgraph_node_hook_list *
275 cgraph_add_function_insertion_hook (cgraph_node_hook hook, void *data)
276 {
277   struct cgraph_node_hook_list *entry;
278   struct cgraph_node_hook_list **ptr = &first_cgraph_function_insertion_hook;
279
280   entry = (struct cgraph_node_hook_list *) xmalloc (sizeof (*entry));
281   entry->hook = hook;
282   entry->data = data;
283   entry->next = NULL;
284   while (*ptr)
285     ptr = &(*ptr)->next;
286   *ptr = entry;
287   return entry;
288 }
289
290 /* Remove ENTRY from the list of hooks called on removing nodes.  */
291 void
292 cgraph_remove_function_insertion_hook (struct cgraph_node_hook_list *entry)
293 {
294   struct cgraph_node_hook_list **ptr = &first_cgraph_function_insertion_hook;
295
296   while (*ptr != entry)
297     ptr = &(*ptr)->next;
298   *ptr = entry->next;
299   free (entry);
300 }
301
302 /* Call all node removal hooks.  */
303 void
304 cgraph_call_function_insertion_hooks (struct cgraph_node *node)
305 {
306   struct cgraph_node_hook_list *entry = first_cgraph_function_insertion_hook;
307   while (entry)
308   {
309     entry->hook (node, entry->data);
310     entry = entry->next;
311   }
312 }
313
314 /* Register HOOK to be called with DATA on each duplicated edge.  */
315 struct cgraph_2edge_hook_list *
316 cgraph_add_edge_duplication_hook (cgraph_2edge_hook hook, void *data)
317 {
318   struct cgraph_2edge_hook_list *entry;
319   struct cgraph_2edge_hook_list **ptr = &first_cgraph_edge_duplicated_hook;
320
321   entry = (struct cgraph_2edge_hook_list *) xmalloc (sizeof (*entry));
322   entry->hook = hook;
323   entry->data = data;
324   entry->next = NULL;
325   while (*ptr)
326     ptr = &(*ptr)->next;
327   *ptr = entry;
328   return entry;
329 }
330
331 /* Remove ENTRY from the list of hooks called on duplicating edges.  */
332 void
333 cgraph_remove_edge_duplication_hook (struct cgraph_2edge_hook_list *entry)
334 {
335   struct cgraph_2edge_hook_list **ptr = &first_cgraph_edge_duplicated_hook;
336
337   while (*ptr != entry)
338     ptr = &(*ptr)->next;
339   *ptr = entry->next;
340   free (entry);
341 }
342
343 /* Call all edge duplication hooks.  */
344 static void
345 cgraph_call_edge_duplication_hooks (struct cgraph_edge *cs1,
346                                     struct cgraph_edge *cs2)
347 {
348   struct cgraph_2edge_hook_list *entry = first_cgraph_edge_duplicated_hook;
349   while (entry)
350   {
351     entry->hook (cs1, cs2, entry->data);
352     entry = entry->next;
353   }
354 }
355
356 /* Register HOOK to be called with DATA on each duplicated node.  */
357 struct cgraph_2node_hook_list *
358 cgraph_add_node_duplication_hook (cgraph_2node_hook hook, void *data)
359 {
360   struct cgraph_2node_hook_list *entry;
361   struct cgraph_2node_hook_list **ptr = &first_cgraph_node_duplicated_hook;
362
363   entry = (struct cgraph_2node_hook_list *) xmalloc (sizeof (*entry));
364   entry->hook = hook;
365   entry->data = data;
366   entry->next = NULL;
367   while (*ptr)
368     ptr = &(*ptr)->next;
369   *ptr = entry;
370   return entry;
371 }
372
373 /* Remove ENTRY from the list of hooks called on duplicating nodes.  */
374 void
375 cgraph_remove_node_duplication_hook (struct cgraph_2node_hook_list *entry)
376 {
377   struct cgraph_2node_hook_list **ptr = &first_cgraph_node_duplicated_hook;
378
379   while (*ptr != entry)
380     ptr = &(*ptr)->next;
381   *ptr = entry->next;
382   free (entry);
383 }
384
385 /* Call all node duplication hooks.  */
386 static void
387 cgraph_call_node_duplication_hooks (struct cgraph_node *node1,
388                                     struct cgraph_node *node2)
389 {
390   struct cgraph_2node_hook_list *entry = first_cgraph_node_duplicated_hook;
391   while (entry)
392   {
393     entry->hook (node1, node2, entry->data);
394     entry = entry->next;
395   }
396 }
397
398 /* Returns a hash code for P.  */
399
400 static hashval_t
401 hash_node (const void *p)
402 {
403   const struct cgraph_node *n = (const struct cgraph_node *) p;
404   return (hashval_t) DECL_UID (n->decl);
405 }
406
407 /* Returns nonzero if P1 and P2 are equal.  */
408
409 static int
410 eq_node (const void *p1, const void *p2)
411 {
412   const struct cgraph_node *n1 = (const struct cgraph_node *) p1;
413   const struct cgraph_node *n2 = (const struct cgraph_node *) p2;
414   return DECL_UID (n1->decl) == DECL_UID (n2->decl);
415 }
416
417 /* Allocate new callgraph node and insert it into basic data structures.  */
418
419 static struct cgraph_node *
420 cgraph_create_node (void)
421 {
422   struct cgraph_node *node;
423
424   if (free_nodes)
425     {
426       node = free_nodes;
427       free_nodes = NEXT_FREE_NODE (node);
428     }
429   else
430     {
431       node = GGC_CNEW (struct cgraph_node);
432       node->uid = cgraph_max_uid++;
433     }
434
435   node->next = cgraph_nodes;
436   node->pid = -1;
437   node->order = cgraph_order++;
438   if (cgraph_nodes)
439     cgraph_nodes->previous = node;
440   node->previous = NULL;
441   node->global.estimated_growth = INT_MIN;
442   cgraph_nodes = node;
443   cgraph_n_nodes++;
444   return node;
445 }
446
447 /* Return cgraph node assigned to DECL.  Create new one when needed.  */
448
449 struct cgraph_node *
450 cgraph_node (tree decl)
451 {
452   struct cgraph_node key, *node, **slot;
453
454   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
455
456   if (!cgraph_hash)
457     cgraph_hash = htab_create_ggc (10, hash_node, eq_node, NULL);
458
459   key.decl = decl;
460
461   slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, &key, INSERT);
462
463   if (*slot)
464     {
465       node = *slot;
466       return node;
467     }
468
469   node = cgraph_create_node ();
470   node->decl = decl;
471   *slot = node;
472   if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)
473     {
474       node->origin = cgraph_node (DECL_CONTEXT (decl));
475       node->next_nested = node->origin->nested;
476       node->origin->nested = node;
477     }
478   if (assembler_name_hash)
479     {
480       void **aslot;
481       tree name = DECL_ASSEMBLER_NAME (decl);
482
483       aslot = htab_find_slot_with_hash (assembler_name_hash, name,
484                                         decl_assembler_name_hash (name),
485                                         INSERT);
486       /* We can have multiple declarations with same assembler name. For C++
487          it is __builtin_strlen and strlen, for instance.  Do we need to
488          record them all?  Original implementation marked just first one
489          so lets hope for the best.  */
490       if (*aslot == NULL)
491         *aslot = node;
492     }
493   return node;
494 }
495
496 /* Insert already constructed node into hashtable.  */
497
498 void
499 cgraph_insert_node_to_hashtable (struct cgraph_node *node)
500 {
501   struct cgraph_node **slot;
502
503   slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, node, INSERT);
504
505   gcc_assert (!*slot);
506   *slot = node;
507 }
508
509 /* Returns a hash code for P.  */
510
511 static hashval_t
512 hash_node_by_assembler_name (const void *p)
513 {
514   const struct cgraph_node *n = (const struct cgraph_node *) p;
515   return (hashval_t) decl_assembler_name_hash (DECL_ASSEMBLER_NAME (n->decl));
516 }
517
518 /* Returns nonzero if P1 and P2 are equal.  */
519
520 static int
521 eq_assembler_name (const void *p1, const void *p2)
522 {
523   const struct cgraph_node *n1 = (const struct cgraph_node *) p1;
524   const_tree name = (const_tree)p2;
525   return (decl_assembler_name_equal (n1->decl, name));
526 }
527
528 /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
529    Return NULL if there's no such node.  */
530
531 struct cgraph_node *
532 cgraph_node_for_asm (tree asmname)
533 {
534   struct cgraph_node *node;
535   void **slot;
536
537   if (!assembler_name_hash)
538     {
539       assembler_name_hash =
540         htab_create_ggc (10, hash_node_by_assembler_name, eq_assembler_name,
541                          NULL);
542       for (node = cgraph_nodes; node; node = node->next)
543         if (!node->global.inlined_to)
544           {
545             tree name = DECL_ASSEMBLER_NAME (node->decl);
546             slot = htab_find_slot_with_hash (assembler_name_hash, name,
547                                              decl_assembler_name_hash (name),
548                                              INSERT);
549             /* We can have multiple declarations with same assembler name. For C++
550                it is __builtin_strlen and strlen, for instance.  Do we need to
551                record them all?  Original implementation marked just first one
552                so lets hope for the best.  */
553             if (*slot)
554               continue;
555             *slot = node;
556           }
557     }
558
559   slot = htab_find_slot_with_hash (assembler_name_hash, asmname,
560                                    decl_assembler_name_hash (asmname),
561                                    NO_INSERT);
562
563   if (slot)
564     return (struct cgraph_node *) *slot;
565   return NULL;
566 }
567
568 /* Returns a hash value for X (which really is a die_struct).  */
569
570 static hashval_t
571 edge_hash (const void *x)
572 {
573   return htab_hash_pointer (((const struct cgraph_edge *) x)->call_stmt);
574 }
575
576 /* Return nonzero if decl_id of die_struct X is the same as UID of decl *Y.  */
577
578 static int
579 edge_eq (const void *x, const void *y)
580 {
581   return ((const struct cgraph_edge *) x)->call_stmt == y;
582 }
583
584
585 /* Return the callgraph edge representing the GIMPLE_CALL statement
586    CALL_STMT.  */
587
588 struct cgraph_edge *
589 cgraph_edge (struct cgraph_node *node, gimple call_stmt)
590 {
591   struct cgraph_edge *e, *e2;
592   int n = 0;
593
594   if (node->call_site_hash)
595     return (struct cgraph_edge *)
596       htab_find_with_hash (node->call_site_hash, call_stmt,
597                            htab_hash_pointer (call_stmt));
598
599   /* This loop may turn out to be performance problem.  In such case adding
600      hashtables into call nodes with very many edges is probably best
601      solution.  It is not good idea to add pointer into CALL_EXPR itself
602      because we want to make possible having multiple cgraph nodes representing
603      different clones of the same body before the body is actually cloned.  */
604   for (e = node->callees; e; e= e->next_callee)
605     {
606       if (e->call_stmt == call_stmt)
607         break;
608       n++;
609     }
610
611   if (n > 100)
612     {
613       node->call_site_hash = htab_create_ggc (120, edge_hash, edge_eq, NULL);
614       for (e2 = node->callees; e2; e2 = e2->next_callee)
615         {
616           void **slot;
617           slot = htab_find_slot_with_hash (node->call_site_hash,
618                                            e2->call_stmt,
619                                            htab_hash_pointer (e2->call_stmt),
620                                            INSERT);
621           gcc_assert (!*slot);
622           *slot = e2;
623         }
624     }
625
626   return e;
627 }
628
629
630 /* Change field call_stmt of edge E to NEW_STMT.  */
631
632 void
633 cgraph_set_call_stmt (struct cgraph_edge *e, gimple new_stmt)
634 {
635   if (e->caller->call_site_hash)
636     {
637       htab_remove_elt_with_hash (e->caller->call_site_hash,
638                                  e->call_stmt,
639                                  htab_hash_pointer (e->call_stmt));
640     }
641   e->call_stmt = new_stmt;
642   push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
643   e->can_throw_external = stmt_can_throw_external (new_stmt);
644   pop_cfun ();
645   if (e->caller->call_site_hash)
646     {
647       void **slot;
648       slot = htab_find_slot_with_hash (e->caller->call_site_hash,
649                                        e->call_stmt,
650                                        htab_hash_pointer
651                                        (e->call_stmt), INSERT);
652       gcc_assert (!*slot);
653       *slot = e;
654     }
655 }
656
657 /* Like cgraph_set_call_stmt but walk the clone tree and update all
658    clones sharing the same function body.  */
659
660 void
661 cgraph_set_call_stmt_including_clones (struct cgraph_node *orig,
662                                        gimple old_stmt, gimple new_stmt)
663 {
664   struct cgraph_node *node;
665   struct cgraph_edge *edge = cgraph_edge (orig, old_stmt);
666
667   if (edge)
668     cgraph_set_call_stmt (edge, new_stmt);
669
670   node = orig->clones;
671   if (node)
672     while (node != orig)
673       {
674         struct cgraph_edge *edge = cgraph_edge (node, old_stmt);
675         if (edge)
676           cgraph_set_call_stmt (edge, new_stmt);
677         if (node->clones)
678           node = node->clones;
679         else if (node->next_sibling_clone)
680           node = node->next_sibling_clone;
681         else
682           {
683             while (node != orig && !node->next_sibling_clone)
684               node = node->clone_of;
685             if (node != orig)
686               node = node->next_sibling_clone;
687           }
688       }
689 }
690
691 /* Like cgraph_create_edge walk the clone tree and update all clones sharing
692    same function body.  
693    
694    TODO: COUNT and LOOP_DEPTH should be properly distributed based on relative
695    frequencies of the clones.  */
696
697 void
698 cgraph_create_edge_including_clones (struct cgraph_node *orig,
699                                      struct cgraph_node *callee,
700                                      gimple stmt, gcov_type count,
701                                      int freq, int loop_depth,
702                                      cgraph_inline_failed_t reason)
703 {
704   struct cgraph_node *node;
705   struct cgraph_edge *edge;
706
707   if (!cgraph_edge (orig, stmt))
708     {
709       edge = cgraph_create_edge (orig, callee, stmt, count, freq, loop_depth);
710       edge->inline_failed = reason;
711     }
712
713   node = orig->clones;
714   if (node)
715     while (node != orig)
716       {
717         /* It is possible that we already constant propagated into the clone
718            and turned indirect call into dirrect call.  */
719         if (!cgraph_edge (node, stmt))
720           {
721             edge = cgraph_create_edge (node, callee, stmt, count,
722                                        freq, loop_depth);
723             edge->inline_failed = reason;
724           }
725
726         if (node->clones)
727           node = node->clones;
728         else if (node->next_sibling_clone)
729           node = node->next_sibling_clone;
730         else
731           {
732             while (node != orig && !node->next_sibling_clone)
733               node = node->clone_of;
734             if (node != orig)
735               node = node->next_sibling_clone;
736           }
737       }
738 }
739
740 /* Give initial reasons why inlining would fail on EDGE.  This gets either
741    nullified or usually overwritten by more precise reasons later.  */
742
743 static void
744 initialize_inline_failed (struct cgraph_edge *e)
745 {
746   struct cgraph_node *callee = e->callee;
747
748   if (!callee->analyzed)
749     e->inline_failed = CIF_BODY_NOT_AVAILABLE;
750   else if (callee->local.redefined_extern_inline)
751     e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
752   else if (!callee->local.inlinable)
753     e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
754   else if (gimple_call_cannot_inline_p (e->call_stmt))
755     e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
756   else
757     e->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
758 }
759
760 /* Create edge from CALLER to CALLEE in the cgraph.  */
761
762 struct cgraph_edge *
763 cgraph_create_edge (struct cgraph_node *caller, struct cgraph_node *callee,
764                     gimple call_stmt, gcov_type count, int freq, int nest)
765 {
766   struct cgraph_edge *edge;
767
768 #ifdef ENABLE_CHECKING
769   /* This is rather pricely check possibly trigerring construction of call stmt
770      hashtable.  */
771   gcc_assert (!cgraph_edge (caller, call_stmt));
772 #endif
773
774   gcc_assert (is_gimple_call (call_stmt));
775
776   if (free_edges)
777     {
778       edge = free_edges;
779       free_edges = NEXT_FREE_EDGE (edge);
780     }
781   else
782     {
783       edge = GGC_NEW (struct cgraph_edge);
784       edge->uid = cgraph_edge_max_uid++;
785     }
786
787   edge->aux = NULL;
788
789   edge->caller = caller;
790   edge->callee = callee;
791   edge->call_stmt = call_stmt;
792   push_cfun (DECL_STRUCT_FUNCTION (caller->decl));
793   edge->can_throw_external = stmt_can_throw_external (call_stmt);
794   pop_cfun ();
795   edge->prev_caller = NULL;
796   edge->next_caller = callee->callers;
797   if (callee->callers)
798     callee->callers->prev_caller = edge;
799   edge->prev_callee = NULL;
800   edge->next_callee = caller->callees;
801   if (caller->callees)
802     caller->callees->prev_callee = edge;
803   caller->callees = edge;
804   callee->callers = edge;
805   edge->count = count;
806   gcc_assert (count >= 0);
807   edge->frequency = freq;
808   gcc_assert (freq >= 0);
809   gcc_assert (freq <= CGRAPH_FREQ_MAX);
810   edge->loop_nest = nest;
811   edge->indirect_call = 0;
812   if (caller->call_site_hash)
813     {
814       void **slot;
815       slot = htab_find_slot_with_hash (caller->call_site_hash,
816                                        edge->call_stmt,
817                                        htab_hash_pointer
818                                          (edge->call_stmt),
819                                        INSERT);
820       gcc_assert (!*slot);
821       *slot = edge;
822     }
823
824   initialize_inline_failed (edge);
825
826   return edge;
827 }
828
829 /* Remove the edge E from the list of the callers of the callee.  */
830
831 static inline void
832 cgraph_edge_remove_callee (struct cgraph_edge *e)
833 {
834   if (e->prev_caller)
835     e->prev_caller->next_caller = e->next_caller;
836   if (e->next_caller)
837     e->next_caller->prev_caller = e->prev_caller;
838   if (!e->prev_caller)
839     e->callee->callers = e->next_caller;
840 }
841
842 /* Remove the edge E from the list of the callees of the caller.  */
843
844 static inline void
845 cgraph_edge_remove_caller (struct cgraph_edge *e)
846 {
847   if (e->prev_callee)
848     e->prev_callee->next_callee = e->next_callee;
849   if (e->next_callee)
850     e->next_callee->prev_callee = e->prev_callee;
851   if (!e->prev_callee)
852     e->caller->callees = e->next_callee;
853   if (e->caller->call_site_hash)
854     htab_remove_elt_with_hash (e->caller->call_site_hash,
855                                e->call_stmt,
856                                htab_hash_pointer (e->call_stmt));
857 }
858
859 /* Put the edge onto the free list.  */
860
861 static void
862 cgraph_free_edge (struct cgraph_edge *e)
863 {
864   int uid = e->uid;
865
866   /* Clear out the edge so we do not dangle pointers.  */
867   memset (e, 0, sizeof (*e));
868   e->uid = uid;
869   NEXT_FREE_EDGE (e) = free_edges;
870   free_edges = e;
871 }
872
873 /* Remove the edge E in the cgraph.  */
874
875 void
876 cgraph_remove_edge (struct cgraph_edge *e)
877 {
878   /* Call all edge removal hooks.  */
879   cgraph_call_edge_removal_hooks (e);
880
881   /* Remove from callers list of the callee.  */
882   cgraph_edge_remove_callee (e);
883
884   /* Remove from callees list of the callers.  */
885   cgraph_edge_remove_caller (e);
886
887   /* Put the edge onto the free list.  */
888   cgraph_free_edge (e);
889 }
890
891 /* Redirect callee of E to N.  The function does not update underlying
892    call expression.  */
893
894 void
895 cgraph_redirect_edge_callee (struct cgraph_edge *e, struct cgraph_node *n)
896 {
897   /* Remove from callers list of the current callee.  */
898   cgraph_edge_remove_callee (e);
899
900   /* Insert to callers list of the new callee.  */
901   e->prev_caller = NULL;
902   if (n->callers)
903     n->callers->prev_caller = e;
904   e->next_caller = n->callers;
905   n->callers = e;
906   e->callee = n;
907 }
908
909
910 /* Update or remove the corresponding cgraph edge if a GIMPLE_CALL
911    OLD_STMT changed into NEW_STMT.  OLD_CALL is gimple_call_fndecl
912    of OLD_STMT if it was previously call statement.  */
913
914 static void
915 cgraph_update_edges_for_call_stmt_node (struct cgraph_node *node,
916                                         gimple old_stmt, tree old_call, gimple new_stmt)
917 {
918   tree new_call = (is_gimple_call (new_stmt)) ? gimple_call_fndecl (new_stmt) : 0;
919
920   /* We are seeing indirect calls, then there is nothing to update.  */
921   if (!new_call && !old_call)
922     return;
923   /* See if we turned indirect call into direct call or folded call to one builtin
924      into different bultin.  */
925   if (old_call != new_call)
926     {
927       struct cgraph_edge *e = cgraph_edge (node, old_stmt);
928       struct cgraph_edge *ne = NULL;
929       gcov_type count;
930       int frequency;
931       int loop_nest;
932
933       if (e)
934         {
935           /* See if the call is already there.  It might be because of indirect
936              inlining already found it.  */
937           if (new_call && e->callee->decl == new_call)
938             return;
939
940           /* Otherwise remove edge and create new one; we can't simply redirect
941              since function has changed, so inline plan and other information
942              attached to edge is invalid.  */
943           cgraph_remove_edge (e);
944           count = e->count;
945           frequency = e->frequency;
946           loop_nest = e->loop_nest;
947         }
948       else
949         {
950           /* We are seeing new direct call; compute profile info based on BB.  */
951           basic_block bb = gimple_bb (new_stmt);
952           count = bb->count;
953           frequency = compute_call_stmt_bb_frequency (current_function_decl,
954                                                       bb);
955           loop_nest = bb->loop_depth;
956         }
957
958       if (new_call)
959         {
960           ne = cgraph_create_edge (node, cgraph_node (new_call),
961                                    new_stmt, count, frequency,
962                                    loop_nest);
963           gcc_assert (ne->inline_failed);
964         }
965     }
966   /* We only updated the call stmt; update pointer in cgraph edge..  */
967   else if (old_stmt != new_stmt)
968     cgraph_set_call_stmt (cgraph_edge (node, old_stmt), new_stmt);
969 }
970
971 /* Update or remove the corresponding cgraph edge if a GIMPLE_CALL
972    OLD_STMT changed into NEW_STMT.  OLD_DECL is gimple_call_fndecl
973    of OLD_STMT before it was updated (updating can happen inplace).  */
974
975 void
976 cgraph_update_edges_for_call_stmt (gimple old_stmt, tree old_decl, gimple new_stmt)
977 {
978   struct cgraph_node *orig = cgraph_node (cfun->decl);
979   struct cgraph_node *node;
980
981   cgraph_update_edges_for_call_stmt_node (orig, old_stmt, old_decl, new_stmt);
982   if (orig->clones)
983     for (node = orig->clones; node != orig;)
984       {
985         cgraph_update_edges_for_call_stmt_node (node, old_stmt, old_decl, new_stmt);
986         if (node->clones)
987           node = node->clones;
988         else if (node->next_sibling_clone)
989           node = node->next_sibling_clone;
990         else
991           {
992             while (node != orig && !node->next_sibling_clone)
993               node = node->clone_of;
994             if (node != orig)
995               node = node->next_sibling_clone;
996           }
997       }
998 }
999
1000
1001 /* Remove all callees from the node.  */
1002
1003 void
1004 cgraph_node_remove_callees (struct cgraph_node *node)
1005 {
1006   struct cgraph_edge *e, *f;
1007
1008   /* It is sufficient to remove the edges from the lists of callers of
1009      the callees.  The callee list of the node can be zapped with one
1010      assignment.  */
1011   for (e = node->callees; e; e = f)
1012     {
1013       f = e->next_callee;
1014       cgraph_call_edge_removal_hooks (e);
1015       cgraph_edge_remove_callee (e);
1016       cgraph_free_edge (e);
1017     }
1018   node->callees = NULL;
1019   if (node->call_site_hash)
1020     {
1021       htab_delete (node->call_site_hash);
1022       node->call_site_hash = NULL;
1023     }
1024 }
1025
1026 /* Remove all callers from the node.  */
1027
1028 static void
1029 cgraph_node_remove_callers (struct cgraph_node *node)
1030 {
1031   struct cgraph_edge *e, *f;
1032
1033   /* It is sufficient to remove the edges from the lists of callees of
1034      the callers.  The caller list of the node can be zapped with one
1035      assignment.  */
1036   for (e = node->callers; e; e = f)
1037     {
1038       f = e->next_caller;
1039       cgraph_call_edge_removal_hooks (e);
1040       cgraph_edge_remove_caller (e);
1041       cgraph_free_edge (e);
1042     }
1043   node->callers = NULL;
1044 }
1045
1046 /* Release memory used to represent body of function NODE.  */
1047
1048 void
1049 cgraph_release_function_body (struct cgraph_node *node)
1050 {
1051   if (DECL_STRUCT_FUNCTION (node->decl))
1052     {
1053       tree old_decl = current_function_decl;
1054       push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1055       if (cfun->gimple_df)
1056         {
1057           current_function_decl = node->decl;
1058           delete_tree_ssa ();
1059           delete_tree_cfg_annotations ();
1060           cfun->eh = NULL;
1061           current_function_decl = old_decl;
1062         }
1063       if (cfun->cfg)
1064         {
1065           gcc_assert (dom_computed[0] == DOM_NONE);
1066           gcc_assert (dom_computed[1] == DOM_NONE);
1067           clear_edges ();
1068         }
1069       if (cfun->value_histograms)
1070         free_histograms ();
1071       gcc_assert (!current_loops);
1072       pop_cfun();
1073       gimple_set_body (node->decl, NULL);
1074       VEC_free (ipa_opt_pass, heap,
1075                 DECL_STRUCT_FUNCTION (node->decl)->ipa_transforms_to_apply);
1076       /* Struct function hangs a lot of data that would leak if we didn't
1077          removed all pointers to it.   */
1078       ggc_free (DECL_STRUCT_FUNCTION (node->decl));
1079       DECL_STRUCT_FUNCTION (node->decl) = NULL;
1080     }
1081   DECL_SAVED_TREE (node->decl) = NULL;
1082   /* If the node is abstract and needed, then do not clear DECL_INITIAL
1083      of its associated function function declaration because it's
1084      needed to emit debug info later.  */
1085   if (!node->abstract_and_needed)
1086     DECL_INITIAL (node->decl) = error_mark_node;
1087 }
1088
1089 /* Remove the node from cgraph.  */
1090
1091 void
1092 cgraph_remove_node (struct cgraph_node *node)
1093 {
1094   void **slot;
1095   bool kill_body = false;
1096   struct cgraph_node *n;
1097   int uid = node->uid;
1098
1099   cgraph_call_node_removal_hooks (node);
1100   cgraph_node_remove_callers (node);
1101   cgraph_node_remove_callees (node);
1102
1103   /* Incremental inlining access removed nodes stored in the postorder list.
1104      */
1105   node->needed = node->reachable = false;
1106   for (n = node->nested; n; n = n->next_nested)
1107     n->origin = NULL;
1108   node->nested = NULL;
1109   if (node->origin)
1110     {
1111       struct cgraph_node **node2 = &node->origin->nested;
1112
1113       while (*node2 != node)
1114         node2 = &(*node2)->next_nested;
1115       *node2 = node->next_nested;
1116     }
1117   if (node->previous)
1118     node->previous->next = node->next;
1119   else
1120     cgraph_nodes = node->next;
1121   if (node->next)
1122     node->next->previous = node->previous;
1123   node->next = NULL;
1124   node->previous = NULL;
1125   slot = htab_find_slot (cgraph_hash, node, NO_INSERT);
1126   if (*slot == node)
1127     {
1128       struct cgraph_node *next_inline_clone;
1129
1130       for (next_inline_clone = node->clones;
1131            next_inline_clone && next_inline_clone->decl != node->decl;
1132            next_inline_clone = next_inline_clone->next_sibling_clone)
1133         ;
1134
1135       /* If there is inline clone of the node being removed, we need
1136          to put it into the position of removed node and reorganize all
1137          other clones to be based on it.  */
1138       if (next_inline_clone)
1139         {
1140           struct cgraph_node *n;
1141           struct cgraph_node *new_clones;
1142
1143           *slot = next_inline_clone;
1144
1145           /* Unlink inline clone from the list of clones of removed node.  */
1146           if (next_inline_clone->next_sibling_clone)
1147             next_inline_clone->next_sibling_clone->prev_sibling_clone
1148               = next_inline_clone->prev_sibling_clone;
1149           if (next_inline_clone->prev_sibling_clone)
1150             {
1151               next_inline_clone->prev_sibling_clone->next_sibling_clone
1152                 = next_inline_clone->next_sibling_clone;
1153             }
1154           else
1155            node->clones = next_inline_clone->next_sibling_clone;
1156
1157           new_clones = node->clones;
1158           node->clones = NULL;
1159
1160           /* Copy clone info.  */
1161           next_inline_clone->clone = node->clone;
1162
1163           /* Now place it into clone tree at same level at NODE.  */
1164           next_inline_clone->clone_of = node->clone_of;
1165           next_inline_clone->prev_sibling_clone = NULL;
1166           next_inline_clone->next_sibling_clone = NULL;
1167           if (node->clone_of)
1168             {
1169               next_inline_clone->next_sibling_clone = node->clone_of->clones;
1170               node->clone_of->clones = next_inline_clone;
1171             }
1172
1173           /* Merge the clone list.  */
1174           if (new_clones)
1175             {
1176               if (!next_inline_clone->clones)
1177                 next_inline_clone->clones = new_clones;
1178               else
1179                 {
1180                   n = next_inline_clone->clones;
1181                   while (n->next_sibling_clone)
1182                     n =  n->next_sibling_clone;
1183                   n->next_sibling_clone = new_clones;
1184                   new_clones->prev_sibling_clone = n;
1185                 }
1186             }
1187
1188           /* Update clone_of pointers.  */
1189           n = new_clones;
1190           while (n)
1191             {
1192               n->clone_of = next_inline_clone;
1193               n = n->next_sibling_clone;
1194             }
1195         }
1196       else
1197         {
1198           htab_clear_slot (cgraph_hash, slot);
1199           kill_body = true;
1200         }
1201
1202     }
1203   else
1204     gcc_assert (node->clone_of);
1205   if (node->prev_sibling_clone)
1206     node->prev_sibling_clone->next_sibling_clone = node->next_sibling_clone;
1207   else if (node->clone_of)
1208     node->clone_of->clones = node->next_sibling_clone;
1209   if (node->next_sibling_clone)
1210     node->next_sibling_clone->prev_sibling_clone = node->prev_sibling_clone;
1211   if (node->clones)
1212     {
1213       struct cgraph_node *n;
1214
1215       for (n = node->clones; n->next_sibling_clone; n = n->next_sibling_clone)
1216         n->clone_of = node->clone_of;
1217       n->clone_of = node->clone_of;
1218       n->next_sibling_clone = node->clone_of->clones;
1219       if (node->clone_of->clones)
1220         node->clone_of->clones->prev_sibling_clone = n;
1221       node->clone_of->clones = node->clones;
1222     }
1223
1224   /* While all the clones are removed after being proceeded, the function
1225      itself is kept in the cgraph even after it is compiled.  Check whether
1226      we are done with this body and reclaim it proactively if this is the case.
1227      */
1228   if (!kill_body && *slot)
1229     {
1230       struct cgraph_node *n = (struct cgraph_node *) *slot;
1231       if (!n->clones && !n->clone_of && !n->global.inlined_to
1232           && (cgraph_global_info_ready
1233               && (TREE_ASM_WRITTEN (n->decl) || DECL_EXTERNAL (n->decl))))
1234         kill_body = true;
1235     }
1236   if (assembler_name_hash)
1237     {
1238       tree name = DECL_ASSEMBLER_NAME (node->decl);
1239       slot = htab_find_slot_with_hash (assembler_name_hash, name,
1240                                        decl_assembler_name_hash (name),
1241                                        NO_INSERT);
1242       /* Inline clones are not hashed.  */
1243       if (slot && *slot == node)
1244         htab_clear_slot (assembler_name_hash, slot);
1245     }
1246
1247   if (kill_body)
1248     cgraph_release_function_body (node);
1249   node->decl = NULL;
1250   if (node->call_site_hash)
1251     {
1252       htab_delete (node->call_site_hash);
1253       node->call_site_hash = NULL;
1254     }
1255   cgraph_n_nodes--;
1256
1257   /* Clear out the node to NULL all pointers and add the node to the free
1258      list.  */
1259   memset (node, 0, sizeof(*node));
1260   node->uid = uid;
1261   NEXT_FREE_NODE (node) = free_nodes;
1262   free_nodes = node;
1263 }
1264
1265 /* Remove the node from cgraph.  */
1266
1267 void
1268 cgraph_remove_node_and_inline_clones (struct cgraph_node *node)
1269 {
1270   struct cgraph_edge *e, *next;
1271   for (e = node->callees; e; e = next)
1272     {
1273       next = e->next_callee;
1274       if (!e->inline_failed)
1275         cgraph_remove_node_and_inline_clones (e->callee);
1276     }
1277   cgraph_remove_node (node);
1278 }
1279
1280 /* Notify finalize_compilation_unit that given node is reachable.  */
1281
1282 void
1283 cgraph_mark_reachable_node (struct cgraph_node *node)
1284 {
1285   if (!node->reachable && node->local.finalized)
1286     {
1287       notice_global_symbol (node->decl);
1288       node->reachable = 1;
1289       gcc_assert (!cgraph_global_info_ready);
1290
1291       node->next_needed = cgraph_nodes_queue;
1292       cgraph_nodes_queue = node;
1293     }
1294 }
1295
1296 /* Likewise indicate that a node is needed, i.e. reachable via some
1297    external means.  */
1298
1299 void
1300 cgraph_mark_needed_node (struct cgraph_node *node)
1301 {
1302   node->needed = 1;
1303   cgraph_mark_reachable_node (node);
1304 }
1305
1306 /* Likewise indicate that a node is having address taken.  */
1307
1308 void
1309 cgraph_mark_address_taken_node (struct cgraph_node *node)
1310 {
1311   node->address_taken = 1;
1312   cgraph_mark_needed_node (node);
1313 }
1314
1315 /* Return local info for the compiled function.  */
1316
1317 struct cgraph_local_info *
1318 cgraph_local_info (tree decl)
1319 {
1320   struct cgraph_node *node;
1321
1322   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1323   node = cgraph_node (decl);
1324   return &node->local;
1325 }
1326
1327 /* Return local info for the compiled function.  */
1328
1329 struct cgraph_global_info *
1330 cgraph_global_info (tree decl)
1331 {
1332   struct cgraph_node *node;
1333
1334   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL && cgraph_global_info_ready);
1335   node = cgraph_node (decl);
1336   return &node->global;
1337 }
1338
1339 /* Return local info for the compiled function.  */
1340
1341 struct cgraph_rtl_info *
1342 cgraph_rtl_info (tree decl)
1343 {
1344   struct cgraph_node *node;
1345
1346   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1347   node = cgraph_node (decl);
1348   if (decl != current_function_decl
1349       && !TREE_ASM_WRITTEN (node->decl))
1350     return NULL;
1351   return &node->rtl;
1352 }
1353
1354 /* Return a string describing the failure REASON.  */
1355
1356 const char*
1357 cgraph_inline_failed_string (cgraph_inline_failed_t reason)
1358 {
1359 #undef DEFCIFCODE
1360 #define DEFCIFCODE(code, string)        string,
1361
1362   static const char *cif_string_table[CIF_N_REASONS] = {
1363 #include "cif-code.def"
1364   };
1365
1366   /* Signedness of an enum type is implementation defined, so cast it
1367      to unsigned before testing. */
1368   gcc_assert ((unsigned) reason < CIF_N_REASONS);
1369   return cif_string_table[reason];
1370 }
1371
1372 /* Return name of the node used in debug output.  */
1373 const char *
1374 cgraph_node_name (struct cgraph_node *node)
1375 {
1376   return lang_hooks.decl_printable_name (node->decl, 2);
1377 }
1378
1379 /* Names used to print out the availability enum.  */
1380 const char * const cgraph_availability_names[] =
1381   {"unset", "not_available", "overwritable", "available", "local"};
1382
1383
1384 /* Dump call graph node NODE to file F.  */
1385
1386 void
1387 dump_cgraph_node (FILE *f, struct cgraph_node *node)
1388 {
1389   struct cgraph_edge *edge;
1390   fprintf (f, "%s/%i(%i)", cgraph_node_name (node), node->uid,
1391            node->pid);
1392   dump_addr (f, " @", (void *)node);
1393   if (node->global.inlined_to)
1394     fprintf (f, " (inline copy in %s/%i)",
1395              cgraph_node_name (node->global.inlined_to),
1396              node->global.inlined_to->uid);
1397   if (node->clone_of)
1398     fprintf (f, " (clone of %s/%i)",
1399              cgraph_node_name (node->clone_of),
1400              node->clone_of->uid);
1401   if (cgraph_function_flags_ready)
1402     fprintf (f, " availability:%s",
1403              cgraph_availability_names [cgraph_function_body_availability (node)]);
1404   if (node->count)
1405     fprintf (f, " executed "HOST_WIDEST_INT_PRINT_DEC"x",
1406              (HOST_WIDEST_INT)node->count);
1407   if (node->local.inline_summary.self_time)
1408     fprintf (f, " %i time, %i benefit", node->local.inline_summary.self_time,
1409                                         node->local.inline_summary.time_inlining_benefit);
1410   if (node->global.time && node->global.time
1411       != node->local.inline_summary.self_time)
1412     fprintf (f, " (%i after inlining)", node->global.time);
1413   if (node->local.inline_summary.self_size)
1414     fprintf (f, " %i size, %i benefit", node->local.inline_summary.self_size,
1415                                         node->local.inline_summary.size_inlining_benefit);
1416   if (node->global.size && node->global.size
1417       != node->local.inline_summary.self_size)
1418     fprintf (f, " (%i after inlining)", node->global.size);
1419   if (node->local.inline_summary.estimated_self_stack_size)
1420     fprintf (f, " %i bytes stack usage", (int)node->local.inline_summary.estimated_self_stack_size);
1421   if (node->global.estimated_stack_size != node->local.inline_summary.estimated_self_stack_size)
1422     fprintf (f, " %i bytes after inlining", (int)node->global.estimated_stack_size);
1423   if (node->origin)
1424     fprintf (f, " nested in: %s", cgraph_node_name (node->origin));
1425   if (node->needed)
1426     fprintf (f, " needed");
1427   if (node->address_taken)
1428     fprintf (f, " address_taken");
1429   else if (node->reachable)
1430     fprintf (f, " reachable");
1431   if (gimple_has_body_p (node->decl))
1432     fprintf (f, " body");
1433   if (node->process)
1434     fprintf (f, " process");
1435   if (node->local.local)
1436     fprintf (f, " local");
1437   if (node->local.externally_visible)
1438     fprintf (f, " externally_visible");
1439   if (node->local.finalized)
1440     fprintf (f, " finalized");
1441   if (node->local.disregard_inline_limits)
1442     fprintf (f, " always_inline");
1443   else if (node->local.inlinable)
1444     fprintf (f, " inlinable");
1445   if (node->local.redefined_extern_inline)
1446     fprintf (f, " redefined_extern_inline");
1447   if (TREE_ASM_WRITTEN (node->decl))
1448     fprintf (f, " asm_written");
1449
1450   fprintf (f, "\n  called by: ");
1451   for (edge = node->callers; edge; edge = edge->next_caller)
1452     {
1453       fprintf (f, "%s/%i ", cgraph_node_name (edge->caller),
1454                edge->caller->uid);
1455       if (edge->count)
1456         fprintf (f, "("HOST_WIDEST_INT_PRINT_DEC"x) ",
1457                  (HOST_WIDEST_INT)edge->count);
1458       if (edge->frequency)
1459         fprintf (f, "(%.2f per call) ",
1460                  edge->frequency / (double)CGRAPH_FREQ_BASE);
1461       if (!edge->inline_failed)
1462         fprintf(f, "(inlined) ");
1463       if (edge->indirect_call)
1464         fprintf(f, "(indirect) ");
1465       if (edge->can_throw_external)
1466         fprintf(f, "(can throw external) ");
1467     }
1468
1469   fprintf (f, "\n  calls: ");
1470   for (edge = node->callees; edge; edge = edge->next_callee)
1471     {
1472       fprintf (f, "%s/%i ", cgraph_node_name (edge->callee),
1473                edge->callee->uid);
1474       if (!edge->inline_failed)
1475         fprintf(f, "(inlined) ");
1476       if (edge->indirect_call)
1477         fprintf(f, "(indirect) ");
1478       if (edge->count)
1479         fprintf (f, "("HOST_WIDEST_INT_PRINT_DEC"x) ",
1480                  (HOST_WIDEST_INT)edge->count);
1481       if (edge->frequency)
1482         fprintf (f, "(%.2f per call) ",
1483                  edge->frequency / (double)CGRAPH_FREQ_BASE);
1484       if (edge->loop_nest)
1485         fprintf (f, "(nested in %i loops) ", edge->loop_nest);
1486       if (edge->can_throw_external)
1487         fprintf(f, "(can throw external) ");
1488     }
1489   fprintf (f, "\n");
1490 }
1491
1492
1493 /* Dump call graph node NODE to stderr.  */
1494
1495 void
1496 debug_cgraph_node (struct cgraph_node *node)
1497 {
1498   dump_cgraph_node (stderr, node);
1499 }
1500
1501
1502 /* Dump the callgraph to file F.  */
1503
1504 void
1505 dump_cgraph (FILE *f)
1506 {
1507   struct cgraph_node *node;
1508
1509   fprintf (f, "callgraph:\n\n");
1510   for (node = cgraph_nodes; node; node = node->next)
1511     dump_cgraph_node (f, node);
1512 }
1513
1514
1515 /* Dump the call graph to stderr.  */
1516
1517 void
1518 debug_cgraph (void)
1519 {
1520   dump_cgraph (stderr);
1521 }
1522
1523
1524 /* Set the DECL_ASSEMBLER_NAME and update cgraph hashtables.  */
1525
1526 void
1527 change_decl_assembler_name (tree decl, tree name)
1528 {
1529   gcc_assert (!assembler_name_hash);
1530   if (!DECL_ASSEMBLER_NAME_SET_P (decl))
1531     {
1532       SET_DECL_ASSEMBLER_NAME (decl, name);
1533       return;
1534     }
1535   if (name == DECL_ASSEMBLER_NAME (decl))
1536     return;
1537
1538   if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
1539       && DECL_RTL_SET_P (decl))
1540     warning (0, "%D renamed after being referenced in assembly", decl);
1541
1542   SET_DECL_ASSEMBLER_NAME (decl, name);
1543 }
1544
1545 /* Add a top-level asm statement to the list.  */
1546
1547 struct cgraph_asm_node *
1548 cgraph_add_asm_node (tree asm_str)
1549 {
1550   struct cgraph_asm_node *node;
1551
1552   node = GGC_CNEW (struct cgraph_asm_node);
1553   node->asm_str = asm_str;
1554   node->order = cgraph_order++;
1555   node->next = NULL;
1556   if (cgraph_asm_nodes == NULL)
1557     cgraph_asm_nodes = node;
1558   else
1559     cgraph_asm_last_node->next = node;
1560   cgraph_asm_last_node = node;
1561   return node;
1562 }
1563
1564 /* Return true when the DECL can possibly be inlined.  */
1565 bool
1566 cgraph_function_possibly_inlined_p (tree decl)
1567 {
1568   if (!cgraph_global_info_ready)
1569     return !DECL_UNINLINABLE (decl);
1570   return DECL_POSSIBLY_INLINED (decl);
1571 }
1572
1573 /* Create clone of E in the node N represented by CALL_EXPR the callgraph.  */
1574 struct cgraph_edge *
1575 cgraph_clone_edge (struct cgraph_edge *e, struct cgraph_node *n,
1576                    gimple call_stmt, gcov_type count_scale, int freq_scale,
1577                    int loop_nest, bool update_original)
1578 {
1579   struct cgraph_edge *new_edge;
1580   gcov_type count = e->count * count_scale / REG_BR_PROB_BASE;
1581   gcov_type freq = e->frequency * (gcov_type) freq_scale / CGRAPH_FREQ_BASE;
1582
1583   if (freq > CGRAPH_FREQ_MAX)
1584     freq = CGRAPH_FREQ_MAX;
1585   new_edge = cgraph_create_edge (n, e->callee, call_stmt, count, freq,
1586                             e->loop_nest + loop_nest);
1587
1588   new_edge->inline_failed = e->inline_failed;
1589   new_edge->indirect_call = e->indirect_call;
1590   if (update_original)
1591     {
1592       e->count -= new_edge->count;
1593       if (e->count < 0)
1594         e->count = 0;
1595     }
1596   cgraph_call_edge_duplication_hooks (e, new_edge);
1597   return new_edge;
1598 }
1599
1600 /* Create node representing clone of N executed COUNT times.  Decrease
1601    the execution counts from original node too.
1602
1603    When UPDATE_ORIGINAL is true, the counts are subtracted from the original
1604    function's profile to reflect the fact that part of execution is handled
1605    by node.  */
1606 struct cgraph_node *
1607 cgraph_clone_node (struct cgraph_node *n, gcov_type count, int freq,
1608                    int loop_nest, bool update_original)
1609 {
1610   struct cgraph_node *new_node = cgraph_create_node ();
1611   struct cgraph_edge *e;
1612   gcov_type count_scale;
1613
1614   new_node->decl = n->decl;
1615   new_node->origin = n->origin;
1616   if (new_node->origin)
1617     {
1618       new_node->next_nested = new_node->origin->nested;
1619       new_node->origin->nested = new_node;
1620     }
1621   new_node->analyzed = n->analyzed;
1622   new_node->local = n->local;
1623   new_node->global = n->global;
1624   new_node->rtl = n->rtl;
1625   new_node->count = count;
1626   new_node->clone = n->clone;
1627   if (n->count)
1628     {
1629       if (new_node->count > n->count)
1630         count_scale = REG_BR_PROB_BASE;
1631       else
1632         count_scale = new_node->count * REG_BR_PROB_BASE / n->count;
1633     }
1634   else
1635     count_scale = 0;
1636   if (update_original)
1637     {
1638       n->count -= count;
1639       if (n->count < 0)
1640         n->count = 0;
1641     }
1642
1643   for (e = n->callees;e; e=e->next_callee)
1644     cgraph_clone_edge (e, new_node, e->call_stmt, count_scale, freq, loop_nest,
1645                        update_original);
1646
1647   new_node->next_sibling_clone = n->clones;
1648   if (n->clones)
1649     n->clones->prev_sibling_clone = new_node;
1650   n->clones = new_node;
1651   new_node->clone_of = n;
1652
1653   cgraph_call_node_duplication_hooks (n, new_node);
1654   return new_node;
1655 }
1656
1657 /* Create a new name for omp child function.  Returns an identifier.  */
1658
1659 static GTY(()) unsigned int clone_fn_id_num;
1660
1661 static tree
1662 clone_function_name (tree decl)
1663 {
1664   tree name = DECL_ASSEMBLER_NAME (decl);
1665   size_t len = IDENTIFIER_LENGTH (name);
1666   char *tmp_name, *prefix;
1667
1668   prefix = XALLOCAVEC (char, len + strlen ("_clone") + 1);
1669   memcpy (prefix, IDENTIFIER_POINTER (name), len);
1670   strcpy (prefix + len, "_clone");
1671 #ifndef NO_DOT_IN_LABEL
1672   prefix[len] = '.';
1673 #elif !defined NO_DOLLAR_IN_LABEL
1674   prefix[len] = '$';
1675 #endif
1676   ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix, clone_fn_id_num++);
1677   return get_identifier (tmp_name);
1678 }
1679
1680 /* Create callgraph node clone with new declaration.  The actual body will
1681    be copied later at compilation stage.  
1682
1683    TODO: after merging in ipa-sra use function call notes instead of args_to_skip
1684    bitmap interface.
1685    */
1686 struct cgraph_node *
1687 cgraph_create_virtual_clone (struct cgraph_node *old_node,
1688                              VEC(cgraph_edge_p,heap) *redirect_callers,
1689                              VEC(ipa_replace_map_p,gc) *tree_map,
1690                              bitmap args_to_skip)
1691 {
1692   tree old_decl = old_node->decl;
1693   struct cgraph_node *new_node = NULL;
1694   tree new_decl;
1695   struct cgraph_node key, **slot;
1696   unsigned i;
1697   struct cgraph_edge *e;
1698
1699   gcc_assert  (tree_versionable_function_p (old_decl));
1700
1701   /* Make a new FUNCTION_DECL tree node */
1702   if (!args_to_skip)
1703     new_decl = copy_node (old_decl);
1704   else
1705     new_decl = build_function_decl_skip_args (old_decl, args_to_skip);
1706   DECL_STRUCT_FUNCTION (new_decl) = NULL;
1707
1708   /* Generate a new name for the new version. */
1709   DECL_NAME (new_decl) = clone_function_name (old_decl);
1710   SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
1711   SET_DECL_RTL (new_decl, NULL);
1712
1713   new_node = cgraph_clone_node (old_node, old_node->count,
1714                                 CGRAPH_FREQ_BASE, 0, false);
1715   new_node->decl = new_decl;
1716   /* Update the properties.
1717      Make clone visible only within this translation unit.  Make sure
1718      that is not weak also.
1719      ??? We cannot use COMDAT linkage because there is no
1720      ABI support for this.  */
1721   DECL_EXTERNAL (new_node->decl) = 0;
1722   DECL_COMDAT_GROUP (new_node->decl) = 0;
1723   TREE_PUBLIC (new_node->decl) = 0;
1724   DECL_COMDAT (new_node->decl) = 0;
1725   DECL_WEAK (new_node->decl) = 0;
1726   new_node->clone.tree_map = tree_map;
1727   new_node->clone.args_to_skip = args_to_skip;
1728   if (!args_to_skip)
1729     new_node->clone.combined_args_to_skip = old_node->clone.combined_args_to_skip;
1730   else if (old_node->clone.combined_args_to_skip)
1731     {
1732       int newi = 0, oldi = 0;
1733       tree arg;
1734       bitmap new_args_to_skip = BITMAP_GGC_ALLOC ();
1735       struct cgraph_node *orig_node;
1736       for (orig_node = old_node; orig_node->clone_of; orig_node = orig_node->clone_of)
1737         ;
1738       for (arg = DECL_ARGUMENTS (orig_node->decl); arg; arg = TREE_CHAIN (arg), oldi++)
1739         {
1740           if (bitmap_bit_p (old_node->clone.combined_args_to_skip, oldi))
1741             {
1742               bitmap_set_bit (new_args_to_skip, oldi);
1743               continue;
1744             }
1745           if (bitmap_bit_p (args_to_skip, newi))
1746             bitmap_set_bit (new_args_to_skip, oldi);
1747           newi++;
1748         }
1749       new_node->clone.combined_args_to_skip = new_args_to_skip;
1750     }
1751   else
1752     new_node->clone.combined_args_to_skip = args_to_skip;
1753   new_node->local.externally_visible = 0;
1754   new_node->local.local = 1;
1755   new_node->lowered = true;
1756   new_node->reachable = true;
1757
1758   key.decl = new_decl;
1759   slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, &key, INSERT);
1760   gcc_assert (!*slot);
1761   *slot = new_node;
1762   if (assembler_name_hash)
1763     {
1764       void **aslot;
1765       tree name = DECL_ASSEMBLER_NAME (new_decl);
1766
1767       aslot = htab_find_slot_with_hash (assembler_name_hash, name,
1768                                         decl_assembler_name_hash (name),
1769                                         INSERT);
1770       gcc_assert (!*aslot);
1771       *aslot = new_node;
1772     }
1773    for (i = 0; VEC_iterate (cgraph_edge_p, redirect_callers, i, e); i++)
1774      {
1775        /* Redirect calls to the old version node to point to its new
1776           version.  */
1777        cgraph_redirect_edge_callee (e, new_node);
1778      }
1779   
1780   return new_node;
1781 }
1782
1783 /* NODE is no longer nested function; update cgraph accordingly.  */
1784 void
1785 cgraph_unnest_node (struct cgraph_node *node)
1786 {
1787   struct cgraph_node **node2 = &node->origin->nested;
1788   gcc_assert (node->origin);
1789
1790   while (*node2 != node)
1791     node2 = &(*node2)->next_nested;
1792   *node2 = node->next_nested;
1793   node->origin = NULL;
1794 }
1795
1796 /* Return function availability.  See cgraph.h for description of individual
1797    return values.  */
1798 enum availability
1799 cgraph_function_body_availability (struct cgraph_node *node)
1800 {
1801   enum availability avail;
1802   gcc_assert (cgraph_function_flags_ready);
1803   if (!node->analyzed)
1804     avail = AVAIL_NOT_AVAILABLE;
1805   else if (node->local.local)
1806     avail = AVAIL_LOCAL;
1807   else if (!node->local.externally_visible)
1808     avail = AVAIL_AVAILABLE;
1809   /* Inline functions are safe to be analyzed even if their sybol can
1810      be overwritten at runtime.  It is not meaningful to enfore any sane
1811      behaviour on replacing inline function by different body.  */
1812   else if (DECL_DECLARED_INLINE_P (node->decl))
1813     avail = AVAIL_AVAILABLE;
1814
1815   /* If the function can be overwritten, return OVERWRITABLE.  Take
1816      care at least of two notable extensions - the COMDAT functions
1817      used to share template instantiations in C++ (this is symmetric
1818      to code cp_cannot_inline_tree_fn and probably shall be shared and
1819      the inlinability hooks completely eliminated).
1820
1821      ??? Does the C++ one definition rule allow us to always return
1822      AVAIL_AVAILABLE here?  That would be good reason to preserve this
1823      bit.  */
1824
1825   else if (DECL_REPLACEABLE_P (node->decl) && !DECL_EXTERNAL (node->decl))
1826     avail = AVAIL_OVERWRITABLE;
1827   else avail = AVAIL_AVAILABLE;
1828
1829   return avail;
1830 }
1831
1832 /* Add the function FNDECL to the call graph.
1833    Unlike cgraph_finalize_function, this function is intended to be used
1834    by middle end and allows insertion of new function at arbitrary point
1835    of compilation.  The function can be either in high, low or SSA form
1836    GIMPLE.
1837
1838    The function is assumed to be reachable and have address taken (so no
1839    API breaking optimizations are performed on it).  
1840
1841    Main work done by this function is to enqueue the function for later
1842    processing to avoid need the passes to be re-entrant.  */
1843
1844 void
1845 cgraph_add_new_function (tree fndecl, bool lowered)
1846 {
1847   struct cgraph_node *node;
1848   switch (cgraph_state)
1849     {
1850       case CGRAPH_STATE_CONSTRUCTION:
1851         /* Just enqueue function to be processed at nearest occurrence.  */
1852         node = cgraph_node (fndecl);
1853         node->next_needed = cgraph_new_nodes;
1854         if (lowered)
1855           node->lowered = true;
1856         cgraph_new_nodes = node;
1857         break;
1858
1859       case CGRAPH_STATE_IPA:
1860       case CGRAPH_STATE_IPA_SSA:
1861       case CGRAPH_STATE_EXPANSION:
1862         /* Bring the function into finalized state and enqueue for later
1863            analyzing and compilation.  */
1864         node = cgraph_node (fndecl);
1865         node->local.local = false;
1866         node->local.finalized = true;
1867         node->reachable = node->needed = true;
1868         if (!lowered && cgraph_state == CGRAPH_STATE_EXPANSION)
1869           {
1870             push_cfun (DECL_STRUCT_FUNCTION (fndecl));
1871             current_function_decl = fndecl;
1872             gimple_register_cfg_hooks ();
1873             /* C++ Thunks are emitted late via this function, gimplify them.  */
1874             if (!gimple_body (fndecl))
1875               gimplify_function_tree (fndecl);
1876             tree_lowering_passes (fndecl);
1877             bitmap_obstack_initialize (NULL);
1878             if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (fndecl)))
1879               execute_pass_list (pass_early_local_passes.pass.sub);
1880             bitmap_obstack_release (NULL);
1881             pop_cfun ();
1882             current_function_decl = NULL;
1883
1884             lowered = true;
1885           }
1886         if (lowered)
1887           node->lowered = true;
1888         node->next_needed = cgraph_new_nodes;
1889         cgraph_new_nodes = node;
1890         break;
1891
1892       case CGRAPH_STATE_FINISHED:
1893         /* At the very end of compilation we have to do all the work up
1894            to expansion.  */
1895         push_cfun (DECL_STRUCT_FUNCTION (fndecl));
1896         current_function_decl = fndecl;
1897         gimple_register_cfg_hooks ();
1898         if (!lowered)
1899           tree_lowering_passes (fndecl);
1900         bitmap_obstack_initialize (NULL);
1901         if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (fndecl)))
1902           execute_pass_list (pass_early_local_passes.pass.sub);
1903         bitmap_obstack_release (NULL);
1904         tree_rest_of_compilation (fndecl);
1905         pop_cfun ();
1906         current_function_decl = NULL;
1907         break;
1908     }
1909 }
1910
1911 /* Return true if NODE can be made local for API change.
1912    Extern inline functions and C++ COMDAT functions can be made local
1913    at the expense of possible code size growth if function is used in multiple
1914    compilation units.  */
1915 bool
1916 cgraph_node_can_be_local_p (struct cgraph_node *node)
1917 {
1918   return !node->needed;
1919 }
1920
1921 /* Bring NODE local.  */
1922 void
1923 cgraph_make_node_local (struct cgraph_node *node)
1924 {
1925   gcc_assert (cgraph_node_can_be_local_p (node));
1926   if (DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl))
1927     {
1928       DECL_COMDAT (node->decl) = 0;
1929       DECL_COMDAT_GROUP (node->decl) = 0;
1930       TREE_PUBLIC (node->decl) = 0;
1931       DECL_WEAK (node->decl) = 0;
1932       DECL_EXTERNAL (node->decl) = 0;
1933       node->local.externally_visible = false;
1934       node->local.local = true;
1935       gcc_assert (cgraph_function_body_availability (node) == AVAIL_LOCAL);
1936     }
1937 }
1938
1939 #include "gt-cgraph.h"