Update change log
[platform/upstream/gcc48.git] / gcc / cgraphbuild.c
1 /* Callgraph construction.
2    Copyright (C) 2003-2013 Free Software Foundation, Inc.
3    Contributed by Jan Hubicka
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 "tm.h"
25 #include "tree.h"
26 #include "tree-flow.h"
27 #include "langhooks.h"
28 #include "pointer-set.h"
29 #include "cgraph.h"
30 #include "intl.h"
31 #include "gimple.h"
32 #include "tree-pass.h"
33 #include "ipa-utils.h"
34 #include "except.h"
35 #include "ipa-inline.h"
36
37 /* Context of record_reference.  */
38 struct record_reference_ctx
39 {
40   bool only_vars;
41   struct varpool_node *varpool_node;
42 };
43
44 /* Walk tree and record all calls and references to functions/variables.
45    Called via walk_tree: TP is pointer to tree to be examined.
46    When DATA is non-null, record references to callgraph.
47    */
48
49 static tree
50 record_reference (tree *tp, int *walk_subtrees, void *data)
51 {
52   tree t = *tp;
53   tree decl;
54   struct record_reference_ctx *ctx = (struct record_reference_ctx *)data;
55
56   t = canonicalize_constructor_val (t, NULL);
57   if (!t)
58     t = *tp;
59   else if (t != *tp)
60     *tp = t;
61
62   switch (TREE_CODE (t))
63     {
64     case VAR_DECL:
65     case FUNCTION_DECL:
66       gcc_unreachable ();
67       break;
68
69     case FDESC_EXPR:
70     case ADDR_EXPR:
71       /* Record dereferences to the functions.  This makes the
72          functions reachable unconditionally.  */
73       decl = get_base_var (*tp);
74       if (TREE_CODE (decl) == FUNCTION_DECL)
75         {
76           struct cgraph_node *node = cgraph_get_create_node (decl);
77           if (!ctx->only_vars)
78             cgraph_mark_address_taken_node (node);
79           ipa_record_reference ((symtab_node)ctx->varpool_node,
80                                 (symtab_node)node,
81                                 IPA_REF_ADDR, NULL);
82         }
83
84       if (TREE_CODE (decl) == VAR_DECL)
85         {
86           struct varpool_node *vnode = varpool_node_for_decl (decl);
87           ipa_record_reference ((symtab_node)ctx->varpool_node,
88                                 (symtab_node)vnode,
89                                 IPA_REF_ADDR, NULL);
90         }
91       *walk_subtrees = 0;
92       break;
93
94     default:
95       /* Save some cycles by not walking types and declaration as we
96          won't find anything useful there anyway.  */
97       if (IS_TYPE_OR_DECL_P (*tp))
98         {
99           *walk_subtrees = 0;
100           break;
101         }
102       break;
103     }
104
105   return NULL_TREE;
106 }
107
108 /* Record references to typeinfos in the type list LIST.  */
109
110 static void
111 record_type_list (struct cgraph_node *node, tree list)
112 {
113   for (; list; list = TREE_CHAIN (list))
114     {
115       tree type = TREE_VALUE (list);
116       
117       if (TYPE_P (type))
118         type = lookup_type_for_runtime (type);
119       STRIP_NOPS (type);
120       if (TREE_CODE (type) == ADDR_EXPR)
121         {
122           type = TREE_OPERAND (type, 0);
123           if (TREE_CODE (type) == VAR_DECL)
124             {
125               struct varpool_node *vnode = varpool_node_for_decl (type);
126               ipa_record_reference ((symtab_node)node,
127                                     (symtab_node)vnode,
128                                     IPA_REF_ADDR, NULL);
129             }
130         }
131     }
132 }
133
134 /* Record all references we will introduce by producing EH tables
135    for NODE.  */
136
137 static void
138 record_eh_tables (struct cgraph_node *node, struct function *fun)
139 {
140   eh_region i;
141
142   if (DECL_FUNCTION_PERSONALITY (node->symbol.decl))
143     {
144       struct cgraph_node *per_node;
145
146       per_node = cgraph_get_create_node (DECL_FUNCTION_PERSONALITY (node->symbol.decl));
147       ipa_record_reference ((symtab_node)node, (symtab_node)per_node, IPA_REF_ADDR, NULL);
148       cgraph_mark_address_taken_node (per_node);
149     }
150
151   i = fun->eh->region_tree;
152   if (!i)
153     return;
154
155   while (1)
156     {
157       switch (i->type)
158         {
159         case ERT_CLEANUP:
160         case ERT_MUST_NOT_THROW:
161           break;
162
163         case ERT_TRY:
164           {
165             eh_catch c;
166             for (c = i->u.eh_try.first_catch; c; c = c->next_catch)
167               record_type_list (node, c->type_list);
168           }
169           break;
170
171         case ERT_ALLOWED_EXCEPTIONS:
172           record_type_list (node, i->u.allowed.type_list);
173           break;
174         }
175       /* If there are sub-regions, process them.  */
176       if (i->inner)
177         i = i->inner;
178       /* If there are peers, process them.  */
179       else if (i->next_peer)
180         i = i->next_peer;
181       /* Otherwise, step back up the tree to the next peer.  */
182       else
183         {
184           do
185             {
186               i = i->outer;
187               if (i == NULL)
188                 return;
189             }
190           while (i->next_peer == NULL);
191           i = i->next_peer;
192         }
193     }
194 }
195
196 /* Computes the frequency of the call statement so that it can be stored in
197    cgraph_edge.  BB is the basic block of the call statement.  */
198 int
199 compute_call_stmt_bb_frequency (tree decl, basic_block bb)
200 {
201   int entry_freq = ENTRY_BLOCK_PTR_FOR_FUNCTION
202                      (DECL_STRUCT_FUNCTION (decl))->frequency;
203   int freq = bb->frequency;
204
205   if (profile_status_for_function (DECL_STRUCT_FUNCTION (decl)) == PROFILE_ABSENT)
206     return CGRAPH_FREQ_BASE;
207
208   if (!entry_freq)
209     entry_freq = 1, freq++;
210
211   freq = freq * CGRAPH_FREQ_BASE / entry_freq;
212   if (freq > CGRAPH_FREQ_MAX)
213     freq = CGRAPH_FREQ_MAX;
214
215   return freq;
216 }
217
218 /* Mark address taken in STMT.  */
219
220 static bool
221 mark_address (gimple stmt, tree addr, void *data)
222 {
223   addr = get_base_address (addr);
224   if (TREE_CODE (addr) == FUNCTION_DECL)
225     {
226       struct cgraph_node *node = cgraph_get_create_node (addr);
227       cgraph_mark_address_taken_node (node);
228       ipa_record_reference ((symtab_node)data,
229                             (symtab_node)node,
230                             IPA_REF_ADDR, stmt);
231     }
232   else if (addr && TREE_CODE (addr) == VAR_DECL
233            && (TREE_STATIC (addr) || DECL_EXTERNAL (addr)))
234     {
235       struct varpool_node *vnode = varpool_node_for_decl (addr);
236
237       ipa_record_reference ((symtab_node)data,
238                             (symtab_node)vnode,
239                             IPA_REF_ADDR, stmt);
240     }
241
242   return false;
243 }
244
245 /* Mark load of T.  */
246
247 static bool
248 mark_load (gimple stmt, tree t, void *data)
249 {
250   t = get_base_address (t);
251   if (t && TREE_CODE (t) == FUNCTION_DECL)
252     {
253       /* ??? This can happen on platforms with descriptors when these are
254          directly manipulated in the code.  Pretend that it's an address.  */
255       struct cgraph_node *node = cgraph_get_create_node (t);
256       cgraph_mark_address_taken_node (node);
257       ipa_record_reference ((symtab_node)data,
258                             (symtab_node)node,
259                             IPA_REF_ADDR, stmt);
260     }
261   else if (t && TREE_CODE (t) == VAR_DECL
262            && (TREE_STATIC (t) || DECL_EXTERNAL (t)))
263     {
264       struct varpool_node *vnode = varpool_node_for_decl (t);
265
266       ipa_record_reference ((symtab_node)data,
267                             (symtab_node)vnode,
268                             IPA_REF_LOAD, stmt);
269     }
270   return false;
271 }
272
273 /* Mark store of T.  */
274
275 static bool
276 mark_store (gimple stmt, tree t, void *data)
277 {
278   t = get_base_address (t);
279   if (t && TREE_CODE (t) == VAR_DECL
280       && (TREE_STATIC (t) || DECL_EXTERNAL (t)))
281     {
282       struct varpool_node *vnode = varpool_node_for_decl (t);
283
284       ipa_record_reference ((symtab_node)data,
285                             (symtab_node)vnode,
286                             IPA_REF_STORE, stmt);
287      }
288   return false;
289 }
290
291 /* Create cgraph edges for function calls.
292    Also look for functions and variables having addresses taken.  */
293
294 static unsigned int
295 build_cgraph_edges (void)
296 {
297   basic_block bb;
298   struct cgraph_node *node = cgraph_get_node (current_function_decl);
299   struct pointer_set_t *visited_nodes = pointer_set_create ();
300   gimple_stmt_iterator gsi;
301   tree decl;
302   unsigned ix;
303
304   /* Create the callgraph edges and record the nodes referenced by the function.
305      body.  */
306   FOR_EACH_BB (bb)
307     {
308       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
309         {
310           gimple stmt = gsi_stmt (gsi);
311           tree decl;
312
313           if (is_gimple_call (stmt))
314             {
315               int freq = compute_call_stmt_bb_frequency (current_function_decl,
316                                                          bb);
317               decl = gimple_call_fndecl (stmt);
318               if (decl)
319                 cgraph_create_edge (node, cgraph_get_create_node (decl),
320                                     stmt, bb->count, freq);
321               else
322                 cgraph_create_indirect_edge (node, stmt,
323                                              gimple_call_flags (stmt),
324                                              bb->count, freq);
325             }
326           walk_stmt_load_store_addr_ops (stmt, node, mark_load,
327                                          mark_store, mark_address);
328           if (gimple_code (stmt) == GIMPLE_OMP_PARALLEL
329               && gimple_omp_parallel_child_fn (stmt))
330             {
331               tree fn = gimple_omp_parallel_child_fn (stmt);
332               ipa_record_reference ((symtab_node)node,
333                                     (symtab_node)cgraph_get_create_node (fn),
334                                     IPA_REF_ADDR, stmt);
335             }
336           if (gimple_code (stmt) == GIMPLE_OMP_TASK)
337             {
338               tree fn = gimple_omp_task_child_fn (stmt);
339               if (fn)
340                 ipa_record_reference ((symtab_node)node,
341                                       (symtab_node) cgraph_get_create_node (fn),
342                                       IPA_REF_ADDR, stmt);
343               fn = gimple_omp_task_copy_fn (stmt);
344               if (fn)
345                 ipa_record_reference ((symtab_node)node,
346                                       (symtab_node)cgraph_get_create_node (fn),
347                                       IPA_REF_ADDR, stmt);
348             }
349         }
350       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
351         walk_stmt_load_store_addr_ops (gsi_stmt (gsi), node,
352                                        mark_load, mark_store, mark_address);
353    }
354
355   /* Look for initializers of constant variables and private statics.  */
356   FOR_EACH_LOCAL_DECL (cfun, ix, decl)
357     if (TREE_CODE (decl) == VAR_DECL
358         && (TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
359         && !DECL_HAS_VALUE_EXPR_P (decl))
360       varpool_finalize_decl (decl);
361   record_eh_tables (node, cfun);
362
363   pointer_set_destroy (visited_nodes);
364   return 0;
365 }
366
367 struct gimple_opt_pass pass_build_cgraph_edges =
368 {
369  {
370   GIMPLE_PASS,
371   "*build_cgraph_edges",                        /* name */
372   OPTGROUP_NONE,                        /* optinfo_flags */
373   NULL,                                 /* gate */
374   build_cgraph_edges,                   /* execute */
375   NULL,                                 /* sub */
376   NULL,                                 /* next */
377   0,                                    /* static_pass_number */
378   TV_NONE,                              /* tv_id */
379   PROP_cfg,                             /* properties_required */
380   0,                                    /* properties_provided */
381   0,                                    /* properties_destroyed */
382   0,                                    /* todo_flags_start */
383   0                                     /* todo_flags_finish */
384  }
385 };
386
387 /* Record references to functions and other variables present in the
388    initial value of DECL, a variable.
389    When ONLY_VARS is true, we mark needed only variables, not functions.  */
390
391 void
392 record_references_in_initializer (tree decl, bool only_vars)
393 {
394   struct pointer_set_t *visited_nodes = pointer_set_create ();
395   struct varpool_node *node = varpool_node_for_decl (decl);
396   struct record_reference_ctx ctx = {false, NULL};
397
398   ctx.varpool_node = node;
399   ctx.only_vars = only_vars;
400   walk_tree (&DECL_INITIAL (decl), record_reference,
401              &ctx, visited_nodes);
402   pointer_set_destroy (visited_nodes);
403 }
404
405 /* Rebuild cgraph edges for current function node.  This needs to be run after
406    passes that don't update the cgraph.  */
407
408 unsigned int
409 rebuild_cgraph_edges (void)
410 {
411   basic_block bb;
412   struct cgraph_node *node = cgraph_get_node (current_function_decl);
413   gimple_stmt_iterator gsi;
414
415   cgraph_node_remove_callees (node);
416   ipa_remove_all_references (&node->symbol.ref_list);
417
418   node->count = ENTRY_BLOCK_PTR->count;
419
420   FOR_EACH_BB (bb)
421     {
422       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
423         {
424           gimple stmt = gsi_stmt (gsi);
425           tree decl;
426
427           if (is_gimple_call (stmt))
428             {
429               int freq = compute_call_stmt_bb_frequency (current_function_decl,
430                                                          bb);
431               decl = gimple_call_fndecl (stmt);
432               if (decl)
433                 cgraph_create_edge (node, cgraph_get_create_node (decl), stmt,
434                                     bb->count, freq);
435               else
436                 cgraph_create_indirect_edge (node, stmt,
437                                              gimple_call_flags (stmt),
438                                              bb->count, freq);
439             }
440           walk_stmt_load_store_addr_ops (stmt, node, mark_load,
441                                          mark_store, mark_address);
442
443         }
444       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
445         walk_stmt_load_store_addr_ops (gsi_stmt (gsi), node,
446                                        mark_load, mark_store, mark_address);
447     }
448   record_eh_tables (node, cfun);
449   gcc_assert (!node->global.inlined_to);
450
451   return 0;
452 }
453
454 /* Rebuild cgraph edges for current function node.  This needs to be run after
455    passes that don't update the cgraph.  */
456
457 void
458 cgraph_rebuild_references (void)
459 {
460   basic_block bb;
461   struct cgraph_node *node = cgraph_get_node (current_function_decl);
462   gimple_stmt_iterator gsi;
463
464   ipa_remove_all_references (&node->symbol.ref_list);
465
466   node->count = ENTRY_BLOCK_PTR->count;
467
468   FOR_EACH_BB (bb)
469     {
470       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
471         {
472           gimple stmt = gsi_stmt (gsi);
473
474           walk_stmt_load_store_addr_ops (stmt, node, mark_load,
475                                          mark_store, mark_address);
476
477         }
478       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
479         walk_stmt_load_store_addr_ops (gsi_stmt (gsi), node,
480                                        mark_load, mark_store, mark_address);
481     }
482   record_eh_tables (node, cfun);
483 }
484
485 struct gimple_opt_pass pass_rebuild_cgraph_edges =
486 {
487  {
488   GIMPLE_PASS,
489   "*rebuild_cgraph_edges",              /* name */
490   OPTGROUP_NONE,                        /* optinfo_flags */
491   NULL,                                 /* gate */
492   rebuild_cgraph_edges,                 /* execute */
493   NULL,                                 /* sub */
494   NULL,                                 /* next */
495   0,                                    /* static_pass_number */
496   TV_CGRAPH,                            /* tv_id */
497   PROP_cfg,                             /* properties_required */
498   0,                                    /* properties_provided */
499   0,                                    /* properties_destroyed */
500   0,                                    /* todo_flags_start */
501   0,                                    /* todo_flags_finish */
502  }
503 };
504
505
506 static unsigned int
507 remove_cgraph_callee_edges (void)
508 {
509   cgraph_node_remove_callees (cgraph_get_node (current_function_decl));
510   return 0;
511 }
512
513 struct gimple_opt_pass pass_remove_cgraph_callee_edges =
514 {
515  {
516   GIMPLE_PASS,
517   "*remove_cgraph_callee_edges",                /* name */
518   OPTGROUP_NONE,                        /* optinfo_flags */
519   NULL,                                 /* gate */
520   remove_cgraph_callee_edges,           /* execute */
521   NULL,                                 /* sub */
522   NULL,                                 /* next */
523   0,                                    /* static_pass_number */
524   TV_NONE,                              /* tv_id */
525   0,                                    /* properties_required */
526   0,                                    /* properties_provided */
527   0,                                    /* properties_destroyed */
528   0,                                    /* todo_flags_start */
529   0,                                    /* todo_flags_finish */
530  }
531 };