OSDN Git Service

Remove doubled up words.
[pf3gnuchains/gcc-fork.git] / gcc / ipa-prop.c
1 /* Interprocedural analyses.
2    Copyright (C) 2005, 2007, 2008, 2009, 2010
3    Free Software Foundation, 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 "tree.h"
25 #include "langhooks.h"
26 #include "ggc.h"
27 #include "target.h"
28 #include "cgraph.h"
29 #include "ipa-prop.h"
30 #include "tree-flow.h"
31 #include "tree-pass.h"
32 #include "tree-inline.h"
33 #include "gimple.h"
34 #include "flags.h"
35 #include "timevar.h"
36 #include "flags.h"
37 #include "diagnostic.h"
38 #include "tree-pretty-print.h"
39 #include "gimple-pretty-print.h"
40 #include "lto-streamer.h"
41
42
43 /* Intermediate information about a parameter that is only useful during the
44    run of ipa_analyze_node and is not kept afterwards.  */
45
46 struct param_analysis_info
47 {
48   bool modified;
49   bitmap visited_statements;
50 };
51
52 /* Vector where the parameter infos are actually stored. */
53 VEC (ipa_node_params_t, heap) *ipa_node_params_vector;
54 /* Vector where the parameter infos are actually stored. */
55 VEC (ipa_edge_args_t, gc) *ipa_edge_args_vector;
56
57 /* Bitmap with all UIDs of call graph edges that have been already processed
58    by indirect inlining.  */
59 static bitmap iinlining_processed_edges;
60
61 /* Holders of ipa cgraph hooks: */
62 static struct cgraph_edge_hook_list *edge_removal_hook_holder;
63 static struct cgraph_node_hook_list *node_removal_hook_holder;
64 static struct cgraph_2edge_hook_list *edge_duplication_hook_holder;
65 static struct cgraph_2node_hook_list *node_duplication_hook_holder;
66
67 /* Add cgraph NODE described by INFO to the worklist WL regardless of whether
68    it is in one or not.  It should almost never be used directly, as opposed to
69    ipa_push_func_to_list.  */
70
71 void
72 ipa_push_func_to_list_1 (struct ipa_func_list **wl,
73                          struct cgraph_node *node,
74                          struct ipa_node_params *info)
75 {
76   struct ipa_func_list *temp;
77
78   info->node_enqueued = 1;
79   temp = XCNEW (struct ipa_func_list);
80   temp->node = node;
81   temp->next = *wl;
82   *wl = temp;
83 }
84
85 /* Initialize worklist to contain all functions.  */
86
87 struct ipa_func_list *
88 ipa_init_func_list (void)
89 {
90   struct cgraph_node *node;
91   struct ipa_func_list * wl;
92
93   wl = NULL;
94   for (node = cgraph_nodes; node; node = node->next)
95     if (node->analyzed)
96       {
97         struct ipa_node_params *info = IPA_NODE_REF (node);
98         /* Unreachable nodes should have been eliminated before ipcp and
99            inlining.  */
100         gcc_assert (node->needed || node->reachable);
101         ipa_push_func_to_list_1 (&wl, node, info);
102       }
103
104   return wl;
105 }
106
107 /* Remove a function from the worklist WL and return it.  */
108
109 struct cgraph_node *
110 ipa_pop_func_from_list (struct ipa_func_list **wl)
111 {
112   struct ipa_node_params *info;
113   struct ipa_func_list *first;
114   struct cgraph_node *node;
115
116   first = *wl;
117   *wl = (*wl)->next;
118   node = first->node;
119   free (first);
120
121   info = IPA_NODE_REF (node);
122   info->node_enqueued = 0;
123   return node;
124 }
125
126 /* Return index of the formal whose tree is PTREE in function which corresponds
127    to INFO.  */
128
129 static int
130 ipa_get_param_decl_index (struct ipa_node_params *info, tree ptree)
131 {
132   int i, count;
133
134   count = ipa_get_param_count (info);
135   for (i = 0; i < count; i++)
136     if (ipa_get_param(info, i) == ptree)
137       return i;
138
139   return -1;
140 }
141
142 /* Populate the param_decl field in parameter descriptors of INFO that
143    corresponds to NODE.  */
144
145 static void
146 ipa_populate_param_decls (struct cgraph_node *node,
147                           struct ipa_node_params *info)
148 {
149   tree fndecl;
150   tree fnargs;
151   tree parm;
152   int param_num;
153
154   fndecl = node->decl;
155   fnargs = DECL_ARGUMENTS (fndecl);
156   param_num = 0;
157   for (parm = fnargs; parm; parm = DECL_CHAIN (parm))
158     {
159       info->params[param_num].decl = parm;
160       param_num++;
161     }
162 }
163
164 /* Return how many formal parameters FNDECL has.  */
165
166 static inline int
167 count_formal_params_1 (tree fndecl)
168 {
169   tree parm;
170   int count = 0;
171
172   for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
173     count++;
174
175   return count;
176 }
177
178 /* Count number of formal parameters in NOTE. Store the result to the
179    appropriate field of INFO.  */
180
181 static void
182 ipa_count_formal_params (struct cgraph_node *node,
183                          struct ipa_node_params *info)
184 {
185   int param_num;
186
187   param_num = count_formal_params_1 (node->decl);
188   ipa_set_param_count (info, param_num);
189 }
190
191 /* Initialize the ipa_node_params structure associated with NODE by counting
192    the function parameters, creating the descriptors and populating their
193    param_decls.  */
194
195 void
196 ipa_initialize_node_params (struct cgraph_node *node)
197 {
198   struct ipa_node_params *info = IPA_NODE_REF (node);
199
200   if (!info->params)
201     {
202       ipa_count_formal_params (node, info);
203       info->params = XCNEWVEC (struct ipa_param_descriptor,
204                                     ipa_get_param_count (info));
205       ipa_populate_param_decls (node, info);
206     }
207 }
208
209 /* Count number of arguments callsite CS has and store it in
210    ipa_edge_args structure corresponding to this callsite.  */
211
212 static void
213 ipa_count_arguments (struct cgraph_edge *cs)
214 {
215   gimple stmt;
216   int arg_num;
217
218   stmt = cs->call_stmt;
219   gcc_assert (is_gimple_call (stmt));
220   arg_num = gimple_call_num_args (stmt);
221   if (VEC_length (ipa_edge_args_t, ipa_edge_args_vector)
222       <= (unsigned) cgraph_edge_max_uid)
223     VEC_safe_grow_cleared (ipa_edge_args_t, gc,
224                            ipa_edge_args_vector, cgraph_edge_max_uid + 1);
225   ipa_set_cs_argument_count (IPA_EDGE_REF (cs), arg_num);
226 }
227
228 /* Print the jump functions associated with call graph edge CS to file F.  */
229
230 static void
231 ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
232 {
233   int i, count;
234
235   count = ipa_get_cs_argument_count (IPA_EDGE_REF (cs));
236   for (i = 0; i < count; i++)
237     {
238       struct ipa_jump_func *jump_func;
239       enum jump_func_type type;
240
241       jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
242       type = jump_func->type;
243
244       fprintf (f, "       param %d: ", i);
245       if (type == IPA_JF_UNKNOWN)
246         fprintf (f, "UNKNOWN\n");
247       else if (type == IPA_JF_KNOWN_TYPE)
248         {
249           tree binfo_type = TREE_TYPE (jump_func->value.base_binfo);
250           fprintf (f, "KNOWN TYPE, type in binfo is: ");
251           print_generic_expr (f, binfo_type, 0);
252           fprintf (f, " (%u)\n", TYPE_UID (binfo_type));
253         }
254       else if (type == IPA_JF_CONST)
255         {
256           tree val = jump_func->value.constant;
257           fprintf (f, "CONST: ");
258           print_generic_expr (f, val, 0);
259           if (TREE_CODE (val) == ADDR_EXPR
260               && TREE_CODE (TREE_OPERAND (val, 0)) == CONST_DECL)
261             {
262               fprintf (f, " -> ");
263               print_generic_expr (f, DECL_INITIAL (TREE_OPERAND (val, 0)),
264                                   0);
265             }
266           fprintf (f, "\n");
267         }
268       else if (type == IPA_JF_CONST_MEMBER_PTR)
269         {
270           fprintf (f, "CONST MEMBER PTR: ");
271           print_generic_expr (f, jump_func->value.member_cst.pfn, 0);
272           fprintf (f, ", ");
273           print_generic_expr (f, jump_func->value.member_cst.delta, 0);
274           fprintf (f, "\n");
275         }
276       else if (type == IPA_JF_PASS_THROUGH)
277         {
278           fprintf (f, "PASS THROUGH: ");
279           fprintf (f, "%d, op %s ",
280                    jump_func->value.pass_through.formal_id,
281                    tree_code_name[(int)
282                                   jump_func->value.pass_through.operation]);
283           if (jump_func->value.pass_through.operation != NOP_EXPR)
284             print_generic_expr (dump_file,
285                                 jump_func->value.pass_through.operand, 0);
286           fprintf (dump_file, "\n");
287         }
288       else if (type == IPA_JF_ANCESTOR)
289         {
290           fprintf (f, "ANCESTOR: ");
291           fprintf (f, "%d, offset "HOST_WIDE_INT_PRINT_DEC", ",
292                    jump_func->value.ancestor.formal_id,
293                    jump_func->value.ancestor.offset);
294           print_generic_expr (f, jump_func->value.ancestor.type, 0);
295           fprintf (dump_file, "\n");
296         }
297     }
298 }
299
300
301 /* Print the jump functions of all arguments on all call graph edges going from
302    NODE to file F.  */
303
304 void
305 ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
306 {
307   struct cgraph_edge *cs;
308   int i;
309
310   fprintf (f, "  Jump functions of caller  %s:\n", cgraph_node_name (node));
311   for (cs = node->callees; cs; cs = cs->next_callee)
312     {
313       if (!ipa_edge_args_info_available_for_edge_p (cs))
314         continue;
315
316       fprintf (f, "    callsite  %s/%i -> %s/%i : \n",
317                cgraph_node_name (node), node->uid,
318                cgraph_node_name (cs->callee), cs->callee->uid);
319       ipa_print_node_jump_functions_for_edge (f, cs);
320     }
321
322   for (cs = node->indirect_calls, i = 0; cs; cs = cs->next_callee, i++)
323     {
324       if (!ipa_edge_args_info_available_for_edge_p (cs))
325         continue;
326
327       if (cs->call_stmt)
328         {
329           fprintf (f, "    indirect callsite %d for stmt ", i);
330           print_gimple_stmt (f, cs->call_stmt, 0, TDF_SLIM);
331         }
332       else
333         fprintf (f, "    indirect callsite %d :\n", i);
334       ipa_print_node_jump_functions_for_edge (f, cs);
335
336     }
337 }
338
339 /* Print ipa_jump_func data structures of all nodes in the call graph to F.  */
340
341 void
342 ipa_print_all_jump_functions (FILE *f)
343 {
344   struct cgraph_node *node;
345
346   fprintf (f, "\nJump functions:\n");
347   for (node = cgraph_nodes; node; node = node->next)
348     {
349       ipa_print_node_jump_functions (f, node);
350     }
351 }
352
353 /* Structure to be passed in between detect_type_change and
354    check_stmt_for_type_change.  */
355
356 struct type_change_info
357 {
358   /* Set to true if dynamic type change has been detected.  */
359   bool type_maybe_changed;
360 };
361
362 /* Return true if STMT can modify a virtual method table pointer.
363
364    This function makes special assumptions about both constructors and
365    destructors which are all the functions that are allowed to alter the VMT
366    pointers.  It assumes that destructors begin with assignment into all VMT
367    pointers and that constructors essentially look in the following way:
368
369    1) The very first thing they do is that they call constructors of ancestor
370    sub-objects that have them.
371
372    2) Then VMT pointers of this and all its ancestors is set to new values
373    corresponding to the type corresponding to the constructor.
374
375    3) Only afterwards, other stuff such as constructor of member sub-objects
376    and the code written by the user is run.  Only this may include calling
377    virtual functions, directly or indirectly.
378
379    There is no way to call a constructor of an ancestor sub-object in any
380    other way.
381
382    This means that we do not have to care whether constructors get the correct
383    type information because they will always change it (in fact, if we define
384    the type to be given by the VMT pointer, it is undefined).
385
386    The most important fact to derive from the above is that if, for some
387    statement in the section 3, we try to detect whether the dynamic type has
388    changed, we can safely ignore all calls as we examine the function body
389    backwards until we reach statements in section 2 because these calls cannot
390    be ancestor constructors or destructors (if the input is not bogus) and so
391    do not change the dynamic type (this holds true only for automatically
392    allocated objects but at the moment we devirtualize only these).  We then
393    must detect that statements in section 2 change the dynamic type and can try
394    to derive the new type.  That is enough and we can stop, we will never see
395    the calls into constructors of sub-objects in this code.  Therefore we can
396    safely ignore all call statements that we traverse.
397   */
398
399 static bool
400 stmt_may_be_vtbl_ptr_store (gimple stmt)
401 {
402   if (is_gimple_call (stmt))
403     return false;
404   else if (is_gimple_assign (stmt))
405     {
406       tree lhs = gimple_assign_lhs (stmt);
407
408       if (TREE_CODE (lhs) == COMPONENT_REF
409           && !DECL_VIRTUAL_P (TREE_OPERAND (lhs, 1))
410           && !AGGREGATE_TYPE_P (TREE_TYPE (lhs)))
411             return false;
412       /* In the future we might want to use get_base_ref_and_offset to find
413          if there is a field corresponding to the offset and if so, proceed
414          almost like if it was a component ref.  */
415     }
416   return true;
417 }
418
419 /* Callback of walk_aliased_vdefs and a helper function for
420    detect_type_change to check whether a particular statement may modify
421    the virtual table pointer, and if possible also determine the new type of
422    the (sub-)object.  It stores its result into DATA, which points to a
423    type_change_info structure.  */
424
425 static bool
426 check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
427 {
428   gimple stmt = SSA_NAME_DEF_STMT (vdef);
429   struct type_change_info *tci = (struct type_change_info *) data;
430
431   if (stmt_may_be_vtbl_ptr_store (stmt))
432     {
433       tci->type_maybe_changed = true;
434       return true;
435     }
436   else
437     return false;
438 }
439
440 /* Detect whether the dynamic type of ARG has changed (before callsite CALL) by
441    looking for assignments to its virtual table pointer.  If it is, return true
442    and fill in the jump function JFUNC with relevant type information or set it
443    to unknown.  ARG is the object itself (not a pointer to it, unless
444    dereferenced).  BASE is the base of the memory access as returned by
445    get_ref_base_and_extent, as is the offset.  */
446
447 static bool
448 detect_type_change (tree arg, tree base, gimple call,
449                     struct ipa_jump_func *jfunc, HOST_WIDE_INT offset)
450 {
451   struct type_change_info tci;
452   ao_ref ao;
453
454   gcc_checking_assert (DECL_P (arg)
455                        || TREE_CODE (arg) == MEM_REF
456                        || handled_component_p (arg));
457   /* Const calls cannot call virtual methods through VMT and so type changes do
458      not matter.  */
459   if (!flag_devirtualize || !gimple_vuse (call))
460     return false;
461
462   tci.type_maybe_changed = false;
463
464   ao.ref = arg;
465   ao.base = base;
466   ao.offset = offset;
467   ao.size = POINTER_SIZE;
468   ao.max_size = ao.size;
469   ao.ref_alias_set = -1;
470   ao.base_alias_set = -1;
471
472   walk_aliased_vdefs (&ao, gimple_vuse (call), check_stmt_for_type_change,
473                       &tci, NULL);
474   if (!tci.type_maybe_changed)
475     return false;
476
477   jfunc->type = IPA_JF_UNKNOWN;
478   return true;
479 }
480
481 /* Like detect_type_change but ARG is supposed to be a non-dereferenced pointer
482    SSA name (its dereference will become the base and the offset is assumed to
483    be zero).  */
484
485 static bool
486 detect_type_change_ssa (tree arg, gimple call, struct ipa_jump_func *jfunc)
487 {
488   gcc_checking_assert (TREE_CODE (arg) == SSA_NAME);
489   if (!flag_devirtualize
490       || !POINTER_TYPE_P (TREE_TYPE (arg))
491       || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != RECORD_TYPE)
492     return false;
493
494   arg = build2 (MEM_REF, ptr_type_node, arg,
495                 build_int_cst (ptr_type_node, 0));
496
497   return detect_type_change (arg, arg, call, jfunc, 0);
498 }
499
500
501 /* Given that an actual argument is an SSA_NAME (given in NAME) and is a result
502    of an assignment statement STMT, try to find out whether NAME can be
503    described by a (possibly polynomial) pass-through jump-function or an
504    ancestor jump function and if so, write the appropriate function into
505    JFUNC */
506
507 static void
508 compute_complex_assign_jump_func (struct ipa_node_params *info,
509                                   struct ipa_jump_func *jfunc,
510                                   gimple call, gimple stmt, tree name)
511 {
512   HOST_WIDE_INT offset, size, max_size;
513   tree op1, op2, base, ssa;
514   int index;
515
516   op1 = gimple_assign_rhs1 (stmt);
517   op2 = gimple_assign_rhs2 (stmt);
518
519   if (TREE_CODE (op1) == SSA_NAME
520       && SSA_NAME_IS_DEFAULT_DEF (op1))
521     {
522       index = ipa_get_param_decl_index (info, SSA_NAME_VAR (op1));
523       if (index < 0)
524         return;
525
526       if (op2)
527         {
528           if (!is_gimple_ip_invariant (op2)
529               || (TREE_CODE_CLASS (gimple_expr_code (stmt)) != tcc_comparison
530                   && !useless_type_conversion_p (TREE_TYPE (name),
531                                                  TREE_TYPE (op1))))
532             return;
533
534           jfunc->type = IPA_JF_PASS_THROUGH;
535           jfunc->value.pass_through.formal_id = index;
536           jfunc->value.pass_through.operation = gimple_assign_rhs_code (stmt);
537           jfunc->value.pass_through.operand = op2;
538         }
539       else if (gimple_assign_unary_nop_p (stmt)
540                && !detect_type_change_ssa (op1, call, jfunc))
541         {
542           jfunc->type = IPA_JF_PASS_THROUGH;
543           jfunc->value.pass_through.formal_id = index;
544           jfunc->value.pass_through.operation = NOP_EXPR;
545         }
546       return;
547     }
548
549   if (TREE_CODE (op1) != ADDR_EXPR)
550     return;
551   op1 = TREE_OPERAND (op1, 0);
552   if (TREE_CODE (TREE_TYPE (op1)) != RECORD_TYPE)
553     return;
554   base = get_ref_base_and_extent (op1, &offset, &size, &max_size);
555   if (TREE_CODE (base) != MEM_REF
556       /* If this is a varying address, punt.  */
557       || max_size == -1
558       || max_size != size)
559     return;
560   offset += mem_ref_offset (base).low * BITS_PER_UNIT;
561   ssa = TREE_OPERAND (base, 0);
562   if (TREE_CODE (ssa) != SSA_NAME
563       || !SSA_NAME_IS_DEFAULT_DEF (ssa)
564       || offset < 0)
565     return;
566
567   /* Dynamic types are changed only in constructors and destructors and  */
568   index = ipa_get_param_decl_index (info, SSA_NAME_VAR (ssa));
569   if (index >= 0
570       && !detect_type_change (op1, base, call, jfunc, offset))
571     {
572       jfunc->type = IPA_JF_ANCESTOR;
573       jfunc->value.ancestor.formal_id = index;
574       jfunc->value.ancestor.offset = offset;
575       jfunc->value.ancestor.type = TREE_TYPE (op1);
576     }
577 }
578
579
580 /* Given that an actual argument is an SSA_NAME that is a result of a phi
581    statement PHI, try to find out whether NAME is in fact a
582    multiple-inheritance typecast from a descendant into an ancestor of a formal
583    parameter and thus can be described by an ancestor jump function and if so,
584    write the appropriate function into JFUNC.
585
586    Essentially we want to match the following pattern:
587
588      if (obj_2(D) != 0B)
589        goto <bb 3>;
590      else
591        goto <bb 4>;
592
593    <bb 3>:
594      iftmp.1_3 = &obj_2(D)->D.1762;
595
596    <bb 4>:
597      # iftmp.1_1 = PHI <iftmp.1_3(3), 0B(2)>
598      D.1879_6 = middleman_1 (iftmp.1_1, i_5(D));
599      return D.1879_6;  */
600
601 static void
602 compute_complex_ancestor_jump_func (struct ipa_node_params *info,
603                                     struct ipa_jump_func *jfunc,
604                                     gimple call, gimple phi)
605 {
606   HOST_WIDE_INT offset, size, max_size;
607   gimple assign, cond;
608   basic_block phi_bb, assign_bb, cond_bb;
609   tree tmp, parm, expr, obj;
610   int index, i;
611
612   if (gimple_phi_num_args (phi) != 2)
613     return;
614
615   if (integer_zerop (PHI_ARG_DEF (phi, 1)))
616     tmp = PHI_ARG_DEF (phi, 0);
617   else if (integer_zerop (PHI_ARG_DEF (phi, 0)))
618     tmp = PHI_ARG_DEF (phi, 1);
619   else
620     return;
621   if (TREE_CODE (tmp) != SSA_NAME
622       || SSA_NAME_IS_DEFAULT_DEF (tmp)
623       || !POINTER_TYPE_P (TREE_TYPE (tmp))
624       || TREE_CODE (TREE_TYPE (TREE_TYPE (tmp))) != RECORD_TYPE)
625     return;
626
627   assign = SSA_NAME_DEF_STMT (tmp);
628   assign_bb = gimple_bb (assign);
629   if (!single_pred_p (assign_bb)
630       || !gimple_assign_single_p (assign))
631     return;
632   expr = gimple_assign_rhs1 (assign);
633
634   if (TREE_CODE (expr) != ADDR_EXPR)
635     return;
636   expr = TREE_OPERAND (expr, 0);
637   obj = expr;
638   expr = get_ref_base_and_extent (expr, &offset, &size, &max_size);
639
640   if (TREE_CODE (expr) != MEM_REF
641       /* If this is a varying address, punt.  */
642       || max_size == -1
643       || max_size != size)
644     return;
645   offset += mem_ref_offset (expr).low * BITS_PER_UNIT;
646   parm = TREE_OPERAND (expr, 0);
647   if (TREE_CODE (parm) != SSA_NAME
648       || !SSA_NAME_IS_DEFAULT_DEF (parm)
649       || offset < 0)
650     return;
651
652   index = ipa_get_param_decl_index (info, SSA_NAME_VAR (parm));
653   if (index < 0)
654     return;
655
656   cond_bb = single_pred (assign_bb);
657   cond = last_stmt (cond_bb);
658   if (!cond
659       || gimple_code (cond) != GIMPLE_COND
660       || gimple_cond_code (cond) != NE_EXPR
661       || gimple_cond_lhs (cond) != parm
662       || !integer_zerop (gimple_cond_rhs (cond)))
663     return;
664
665   phi_bb = gimple_bb (phi);
666   for (i = 0; i < 2; i++)
667     {
668       basic_block pred = EDGE_PRED (phi_bb, i)->src;
669       if (pred != assign_bb && pred != cond_bb)
670         return;
671     }
672
673   if (!detect_type_change (obj, expr, call, jfunc, offset))
674     {
675       jfunc->type = IPA_JF_ANCESTOR;
676       jfunc->value.ancestor.formal_id = index;
677       jfunc->value.ancestor.offset = offset;
678       jfunc->value.ancestor.type = TREE_TYPE (obj);;
679     }
680 }
681
682 /* Given OP which is passed as an actual argument to a called function,
683    determine if it is possible to construct a KNOWN_TYPE jump function for it
684    and if so, create one and store it to JFUNC.  */
685
686 static void
687 compute_known_type_jump_func (tree op, struct ipa_jump_func *jfunc,
688                               gimple call)
689 {
690   HOST_WIDE_INT offset, size, max_size;
691   tree base, binfo;
692
693   if (!flag_devirtualize
694       || TREE_CODE (op) != ADDR_EXPR
695       || TREE_CODE (TREE_TYPE (TREE_TYPE (op))) != RECORD_TYPE)
696     return;
697
698   op = TREE_OPERAND (op, 0);
699   base = get_ref_base_and_extent (op, &offset, &size, &max_size);
700   if (!DECL_P (base)
701       || max_size == -1
702       || max_size != size
703       || TREE_CODE (TREE_TYPE (base)) != RECORD_TYPE
704       || is_global_var (base))
705     return;
706
707   if (detect_type_change (op, base, call, jfunc, offset))
708     return;
709
710   binfo = TYPE_BINFO (TREE_TYPE (base));
711   if (!binfo)
712     return;
713   binfo = get_binfo_at_offset (binfo, offset, TREE_TYPE (op));
714   if (binfo)
715     {
716       jfunc->type = IPA_JF_KNOWN_TYPE;
717       jfunc->value.base_binfo = binfo;
718     }
719 }
720
721
722 /* Determine the jump functions of scalar arguments.  Scalar means SSA names
723    and constants of a number of selected types.  INFO is the ipa_node_params
724    structure associated with the caller, FUNCTIONS is a pointer to an array of
725    jump function structures associated with CALL which is the call statement
726    being examined.*/
727
728 static void
729 compute_scalar_jump_functions (struct ipa_node_params *info,
730                                struct ipa_jump_func *functions,
731                                gimple call)
732 {
733   tree arg;
734   unsigned num = 0;
735
736   for (num = 0; num < gimple_call_num_args (call); num++)
737     {
738       arg = gimple_call_arg (call, num);
739
740       if (is_gimple_ip_invariant (arg))
741         {
742           functions[num].type = IPA_JF_CONST;
743           functions[num].value.constant = arg;
744         }
745       else if (TREE_CODE (arg) == SSA_NAME)
746         {
747           if (SSA_NAME_IS_DEFAULT_DEF (arg))
748             {
749               int index = ipa_get_param_decl_index (info, SSA_NAME_VAR (arg));
750
751               if (index >= 0
752                   && !detect_type_change_ssa (arg, call, &functions[num]))
753                 {
754                   functions[num].type = IPA_JF_PASS_THROUGH;
755                   functions[num].value.pass_through.formal_id = index;
756                   functions[num].value.pass_through.operation = NOP_EXPR;
757                 }
758             }
759           else
760             {
761               gimple stmt = SSA_NAME_DEF_STMT (arg);
762               if (is_gimple_assign (stmt))
763                 compute_complex_assign_jump_func (info, &functions[num],
764                                                   call, stmt, arg);
765               else if (gimple_code (stmt) == GIMPLE_PHI)
766                 compute_complex_ancestor_jump_func (info, &functions[num],
767                                                     call, stmt);
768             }
769         }
770       else
771         compute_known_type_jump_func (arg, &functions[num], call);
772     }
773 }
774
775 /* Inspect the given TYPE and return true iff it has the same structure (the
776    same number of fields of the same types) as a C++ member pointer.  If
777    METHOD_PTR and DELTA are non-NULL, store the trees representing the
778    corresponding fields there.  */
779
780 static bool
781 type_like_member_ptr_p (tree type, tree *method_ptr, tree *delta)
782 {
783   tree fld;
784
785   if (TREE_CODE (type) != RECORD_TYPE)
786     return false;
787
788   fld = TYPE_FIELDS (type);
789   if (!fld || !POINTER_TYPE_P (TREE_TYPE (fld))
790       || TREE_CODE (TREE_TYPE (TREE_TYPE (fld))) != METHOD_TYPE)
791     return false;
792
793   if (method_ptr)
794     *method_ptr = fld;
795
796   fld = DECL_CHAIN (fld);
797   if (!fld || INTEGRAL_TYPE_P (fld))
798     return false;
799   if (delta)
800     *delta = fld;
801
802   if (DECL_CHAIN (fld))
803     return false;
804
805   return true;
806 }
807
808 /* Callback of walk_aliased_vdefs.  Flags that it has been invoked to the
809    boolean variable pointed to by DATA.  */
810
811 static bool
812 mark_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
813                      void *data)
814 {
815   bool *b = (bool *) data;
816   *b = true;
817   return true;
818 }
819
820 /* Return true if the formal parameter PARM might have been modified in this
821    function before reaching the statement CALL.  PARM_INFO is a pointer to a
822    structure containing intermediate information about PARM.  */
823
824 static bool
825 is_parm_modified_before_call (struct param_analysis_info *parm_info,
826                               gimple call, tree parm)
827 {
828   bool modified = false;
829   ao_ref refd;
830
831   if (parm_info->modified)
832     return true;
833
834   ao_ref_init (&refd, parm);
835   walk_aliased_vdefs (&refd, gimple_vuse (call), mark_modified,
836                       &modified, &parm_info->visited_statements);
837   if (modified)
838     {
839       parm_info->modified = true;
840       return true;
841     }
842   return false;
843 }
844
845 /* Go through arguments of the CALL and for every one that looks like a member
846    pointer, check whether it can be safely declared pass-through and if so,
847    mark that to the corresponding item of jump FUNCTIONS.  Return true iff
848    there are non-pass-through member pointers within the arguments.  INFO
849    describes formal parameters of the caller.  PARMS_INFO is a pointer to a
850    vector containing intermediate information about each formal parameter.  */
851
852 static bool
853 compute_pass_through_member_ptrs (struct ipa_node_params *info,
854                                   struct param_analysis_info *parms_info,
855                                   struct ipa_jump_func *functions,
856                                   gimple call)
857 {
858   bool undecided_members = false;
859   unsigned num;
860   tree arg;
861
862   for (num = 0; num < gimple_call_num_args (call); num++)
863     {
864       arg = gimple_call_arg (call, num);
865
866       if (type_like_member_ptr_p (TREE_TYPE (arg), NULL, NULL))
867         {
868           if (TREE_CODE (arg) == PARM_DECL)
869             {
870               int index = ipa_get_param_decl_index (info, arg);
871
872               gcc_assert (index >=0);
873               if (!is_parm_modified_before_call (&parms_info[index], call, arg))
874                 {
875                   functions[num].type = IPA_JF_PASS_THROUGH;
876                   functions[num].value.pass_through.formal_id = index;
877                   functions[num].value.pass_through.operation = NOP_EXPR;
878                 }
879               else
880                 undecided_members = true;
881             }
882           else
883             undecided_members = true;
884         }
885     }
886
887   return undecided_members;
888 }
889
890 /* Simple function filling in a member pointer constant jump function (with PFN
891    and DELTA as the constant value) into JFUNC.  */
892
893 static void
894 fill_member_ptr_cst_jump_function (struct ipa_jump_func *jfunc,
895                                    tree pfn, tree delta)
896 {
897   jfunc->type = IPA_JF_CONST_MEMBER_PTR;
898   jfunc->value.member_cst.pfn = pfn;
899   jfunc->value.member_cst.delta = delta;
900 }
901
902 /* If RHS is an SSA_NAME and it is defined by a simple copy assign statement,
903    return the rhs of its defining statement.  */
904
905 static inline tree
906 get_ssa_def_if_simple_copy (tree rhs)
907 {
908   while (TREE_CODE (rhs) == SSA_NAME && !SSA_NAME_IS_DEFAULT_DEF (rhs))
909     {
910       gimple def_stmt = SSA_NAME_DEF_STMT (rhs);
911
912       if (gimple_assign_single_p (def_stmt))
913         rhs = gimple_assign_rhs1 (def_stmt);
914       else
915         break;
916     }
917   return rhs;
918 }
919
920 /* Traverse statements from CALL backwards, scanning whether the argument ARG
921    which is a member pointer is filled in with constant values.  If it is, fill
922    the jump function JFUNC in appropriately.  METHOD_FIELD and DELTA_FIELD are
923    fields of the record type of the member pointer.  To give an example, we
924    look for a pattern looking like the following:
925
926      D.2515.__pfn ={v} printStuff;
927      D.2515.__delta ={v} 0;
928      i_1 = doprinting (D.2515);  */
929
930 static void
931 determine_cst_member_ptr (gimple call, tree arg, tree method_field,
932                           tree delta_field, struct ipa_jump_func *jfunc)
933 {
934   gimple_stmt_iterator gsi;
935   tree method = NULL_TREE;
936   tree delta = NULL_TREE;
937
938   gsi = gsi_for_stmt (call);
939
940   gsi_prev (&gsi);
941   for (; !gsi_end_p (gsi); gsi_prev (&gsi))
942     {
943       gimple stmt = gsi_stmt (gsi);
944       tree lhs, rhs, fld;
945
946       if (!stmt_may_clobber_ref_p (stmt, arg))
947         continue;
948       if (!gimple_assign_single_p (stmt))
949         return;
950
951       lhs = gimple_assign_lhs (stmt);
952       rhs = gimple_assign_rhs1 (stmt);
953
954       if (TREE_CODE (lhs) != COMPONENT_REF
955           || TREE_OPERAND (lhs, 0) != arg)
956         return;
957
958       fld = TREE_OPERAND (lhs, 1);
959       if (!method && fld == method_field)
960         {
961           rhs = get_ssa_def_if_simple_copy (rhs);
962           if (TREE_CODE (rhs) == ADDR_EXPR
963               && TREE_CODE (TREE_OPERAND (rhs, 0)) == FUNCTION_DECL
964               && TREE_CODE (TREE_TYPE (TREE_OPERAND (rhs, 0))) == METHOD_TYPE)
965             {
966               method = TREE_OPERAND (rhs, 0);
967               if (delta)
968                 {
969                   fill_member_ptr_cst_jump_function (jfunc, rhs, delta);
970                   return;
971                 }
972             }
973           else
974             return;
975         }
976
977       if (!delta && fld == delta_field)
978         {
979           rhs = get_ssa_def_if_simple_copy (rhs);
980           if (TREE_CODE (rhs) == INTEGER_CST)
981             {
982               delta = rhs;
983               if (method)
984                 {
985                   fill_member_ptr_cst_jump_function (jfunc, rhs, delta);
986                   return;
987                 }
988             }
989           else
990             return;
991         }
992     }
993
994   return;
995 }
996
997 /* Go through the arguments of the CALL and for every member pointer within
998    tries determine whether it is a constant.  If it is, create a corresponding
999    constant jump function in FUNCTIONS which is an array of jump functions
1000    associated with the call.  */
1001
1002 static void
1003 compute_cst_member_ptr_arguments (struct ipa_jump_func *functions,
1004                                   gimple call)
1005 {
1006   unsigned num;
1007   tree arg, method_field, delta_field;
1008
1009   for (num = 0; num < gimple_call_num_args (call); num++)
1010     {
1011       arg = gimple_call_arg (call, num);
1012
1013       if (functions[num].type == IPA_JF_UNKNOWN
1014           && type_like_member_ptr_p (TREE_TYPE (arg), &method_field,
1015                                      &delta_field))
1016         determine_cst_member_ptr (call, arg, method_field, delta_field,
1017                                   &functions[num]);
1018     }
1019 }
1020
1021 /* Compute jump function for all arguments of callsite CS and insert the
1022    information in the jump_functions array in the ipa_edge_args corresponding
1023    to this callsite.  */
1024
1025 static void
1026 ipa_compute_jump_functions_for_edge (struct param_analysis_info *parms_info,
1027                                      struct cgraph_edge *cs)
1028 {
1029   struct ipa_node_params *info = IPA_NODE_REF (cs->caller);
1030   struct ipa_edge_args *arguments = IPA_EDGE_REF (cs);
1031   gimple call;
1032
1033   if (ipa_get_cs_argument_count (arguments) == 0 || arguments->jump_functions)
1034     return;
1035   arguments->jump_functions = ggc_alloc_cleared_vec_ipa_jump_func
1036     (ipa_get_cs_argument_count (arguments));
1037
1038   call = cs->call_stmt;
1039   gcc_assert (is_gimple_call (call));
1040
1041   /* We will deal with constants and SSA scalars first:  */
1042   compute_scalar_jump_functions (info, arguments->jump_functions, call);
1043
1044   /* Let's check whether there are any potential member pointers and if so,
1045      whether we can determine their functions as pass_through.  */
1046   if (!compute_pass_through_member_ptrs (info, parms_info,
1047                                          arguments->jump_functions, call))
1048     return;
1049
1050   /* Finally, let's check whether we actually pass a new constant member
1051      pointer here...  */
1052   compute_cst_member_ptr_arguments (arguments->jump_functions, call);
1053 }
1054
1055 /* Compute jump functions for all edges - both direct and indirect - outgoing
1056    from NODE.  Also count the actual arguments in the process.  */
1057
1058 static void
1059 ipa_compute_jump_functions (struct cgraph_node *node,
1060                             struct param_analysis_info *parms_info)
1061 {
1062   struct cgraph_edge *cs;
1063
1064   for (cs = node->callees; cs; cs = cs->next_callee)
1065     {
1066       /* We do not need to bother analyzing calls to unknown
1067          functions unless they may become known during lto/whopr.  */
1068       if (!cs->callee->analyzed && !flag_lto)
1069         continue;
1070       ipa_count_arguments (cs);
1071       /* If the descriptor of the callee is not initialized yet, we have to do
1072          it now. */
1073       if (cs->callee->analyzed)
1074         ipa_initialize_node_params (cs->callee);
1075       if (ipa_get_cs_argument_count (IPA_EDGE_REF (cs))
1076           != ipa_get_param_count (IPA_NODE_REF (cs->callee)))
1077         ipa_set_called_with_variable_arg (IPA_NODE_REF (cs->callee));
1078       ipa_compute_jump_functions_for_edge (parms_info, cs);
1079     }
1080
1081   for (cs = node->indirect_calls; cs; cs = cs->next_callee)
1082     {
1083       ipa_count_arguments (cs);
1084       ipa_compute_jump_functions_for_edge (parms_info, cs);
1085     }
1086 }
1087
1088 /* If RHS looks like a rhs of a statement loading pfn from a member
1089    pointer formal parameter, return the parameter, otherwise return
1090    NULL.  If USE_DELTA, then we look for a use of the delta field
1091    rather than the pfn.  */
1092
1093 static tree
1094 ipa_get_member_ptr_load_param (tree rhs, bool use_delta)
1095 {
1096   tree rec, ref_field, ref_offset, fld, fld_offset, ptr_field, delta_field;
1097
1098   if (TREE_CODE (rhs) == COMPONENT_REF)
1099     {
1100       ref_field = TREE_OPERAND (rhs, 1);
1101       rhs = TREE_OPERAND (rhs, 0);
1102     }
1103   else
1104     ref_field = NULL_TREE;
1105   if (TREE_CODE (rhs) != MEM_REF)
1106     return NULL_TREE;
1107   rec = TREE_OPERAND (rhs, 0);
1108   if (TREE_CODE (rec) != ADDR_EXPR)
1109     return NULL_TREE;
1110   rec = TREE_OPERAND (rec, 0);
1111   if (TREE_CODE (rec) != PARM_DECL
1112       || !type_like_member_ptr_p (TREE_TYPE (rec), &ptr_field, &delta_field))
1113     return NULL_TREE;
1114
1115   ref_offset = TREE_OPERAND (rhs, 1);
1116
1117   if (ref_field)
1118     {
1119       if (integer_nonzerop (ref_offset))
1120         return NULL_TREE;
1121
1122       if (use_delta)
1123         fld = delta_field;
1124       else
1125         fld = ptr_field;
1126
1127       return ref_field == fld ? rec : NULL_TREE;
1128     }
1129
1130   if (use_delta)
1131     fld_offset = byte_position (delta_field);
1132   else
1133     fld_offset = byte_position (ptr_field);
1134
1135   return tree_int_cst_equal (ref_offset, fld_offset) ? rec : NULL_TREE;
1136 }
1137
1138 /* If STMT looks like a statement loading a value from a member pointer formal
1139    parameter, this function returns that parameter.  */
1140
1141 static tree
1142 ipa_get_stmt_member_ptr_load_param (gimple stmt, bool use_delta)
1143 {
1144   tree rhs;
1145
1146   if (!gimple_assign_single_p (stmt))
1147     return NULL_TREE;
1148
1149   rhs = gimple_assign_rhs1 (stmt);
1150   return ipa_get_member_ptr_load_param (rhs, use_delta);
1151 }
1152
1153 /* Returns true iff T is an SSA_NAME defined by a statement.  */
1154
1155 static bool
1156 ipa_is_ssa_with_stmt_def (tree t)
1157 {
1158   if (TREE_CODE (t) == SSA_NAME
1159       && !SSA_NAME_IS_DEFAULT_DEF (t))
1160     return true;
1161   else
1162     return false;
1163 }
1164
1165 /* Find the indirect call graph edge corresponding to STMT and add to it all
1166    information necessary to describe a call to a parameter number PARAM_INDEX.
1167    NODE is the caller.  POLYMORPHIC should be set to true iff the call is a
1168    virtual one.  */
1169
1170 static void
1171 ipa_note_param_call (struct cgraph_node *node, int param_index, gimple stmt,
1172                      bool polymorphic)
1173 {
1174   struct cgraph_edge *cs;
1175
1176   cs = cgraph_edge (node, stmt);
1177   cs->indirect_info->param_index = param_index;
1178   cs->indirect_info->anc_offset = 0;
1179   cs->indirect_info->polymorphic = polymorphic;
1180   if (polymorphic)
1181     {
1182       tree otr = gimple_call_fn (stmt);
1183       tree type, token = OBJ_TYPE_REF_TOKEN (otr);
1184       cs->indirect_info->otr_token = tree_low_cst (token, 1);
1185       type = TREE_TYPE (TREE_TYPE (OBJ_TYPE_REF_OBJECT (otr)));
1186       cs->indirect_info->otr_type = type;
1187     }
1188 }
1189
1190 /* Analyze the CALL and examine uses of formal parameters of the caller NODE
1191    (described by INFO).  PARMS_INFO is a pointer to a vector containing
1192    intermediate information about each formal parameter.  Currently it checks
1193    whether the call calls a pointer that is a formal parameter and if so, the
1194    parameter is marked with the called flag and an indirect call graph edge
1195    describing the call is created.  This is very simple for ordinary pointers
1196    represented in SSA but not-so-nice when it comes to member pointers.  The
1197    ugly part of this function does nothing more than trying to match the
1198    pattern of such a call.  An example of such a pattern is the gimple dump
1199    below, the call is on the last line:
1200
1201      <bb 2>:
1202        f$__delta_5 = f.__delta;
1203        f$__pfn_24 = f.__pfn;
1204
1205    or
1206      <bb 2>:
1207        f$__delta_5 = MEM[(struct  *)&f];
1208        f$__pfn_24 = MEM[(struct  *)&f + 4B];
1209
1210    and a few lines below:
1211
1212      <bb 5>
1213        D.2496_3 = (int) f$__pfn_24;
1214        D.2497_4 = D.2496_3 & 1;
1215        if (D.2497_4 != 0)
1216          goto <bb 3>;
1217        else
1218          goto <bb 4>;
1219
1220      <bb 6>:
1221        D.2500_7 = (unsigned int) f$__delta_5;
1222        D.2501_8 = &S + D.2500_7;
1223        D.2502_9 = (int (*__vtbl_ptr_type) (void) * *) D.2501_8;
1224        D.2503_10 = *D.2502_9;
1225        D.2504_12 = f$__pfn_24 + -1;
1226        D.2505_13 = (unsigned int) D.2504_12;
1227        D.2506_14 = D.2503_10 + D.2505_13;
1228        D.2507_15 = *D.2506_14;
1229        iftmp.11_16 = (String:: *) D.2507_15;
1230
1231      <bb 7>:
1232        # iftmp.11_1 = PHI <iftmp.11_16(3), f$__pfn_24(2)>
1233        D.2500_19 = (unsigned int) f$__delta_5;
1234        D.2508_20 = &S + D.2500_19;
1235        D.2493_21 = iftmp.11_1 (D.2508_20, 4);
1236
1237    Such patterns are results of simple calls to a member pointer:
1238
1239      int doprinting (int (MyString::* f)(int) const)
1240      {
1241        MyString S ("somestring");
1242
1243        return (S.*f)(4);
1244      }
1245 */
1246
1247 static void
1248 ipa_analyze_indirect_call_uses (struct cgraph_node *node,
1249                                 struct ipa_node_params *info,
1250                                 struct param_analysis_info *parms_info,
1251                                 gimple call, tree target)
1252 {
1253   gimple def;
1254   tree n1, n2;
1255   gimple d1, d2;
1256   tree rec, rec2, cond;
1257   gimple branch;
1258   int index;
1259   basic_block bb, virt_bb, join;
1260
1261   if (SSA_NAME_IS_DEFAULT_DEF (target))
1262     {
1263       tree var = SSA_NAME_VAR (target);
1264       index = ipa_get_param_decl_index (info, var);
1265       if (index >= 0)
1266         ipa_note_param_call (node, index, call, false);
1267       return;
1268     }
1269
1270   /* Now we need to try to match the complex pattern of calling a member
1271      pointer. */
1272
1273   if (!POINTER_TYPE_P (TREE_TYPE (target))
1274       || TREE_CODE (TREE_TYPE (TREE_TYPE (target))) != METHOD_TYPE)
1275     return;
1276
1277   def = SSA_NAME_DEF_STMT (target);
1278   if (gimple_code (def) != GIMPLE_PHI)
1279     return;
1280
1281   if (gimple_phi_num_args (def) != 2)
1282     return;
1283
1284   /* First, we need to check whether one of these is a load from a member
1285      pointer that is a parameter to this function. */
1286   n1 = PHI_ARG_DEF (def, 0);
1287   n2 = PHI_ARG_DEF (def, 1);
1288   if (!ipa_is_ssa_with_stmt_def (n1) || !ipa_is_ssa_with_stmt_def (n2))
1289     return;
1290   d1 = SSA_NAME_DEF_STMT (n1);
1291   d2 = SSA_NAME_DEF_STMT (n2);
1292
1293   join = gimple_bb (def);
1294   if ((rec = ipa_get_stmt_member_ptr_load_param (d1, false)))
1295     {
1296       if (ipa_get_stmt_member_ptr_load_param (d2, false))
1297         return;
1298
1299       bb = EDGE_PRED (join, 0)->src;
1300       virt_bb = gimple_bb (d2);
1301     }
1302   else if ((rec = ipa_get_stmt_member_ptr_load_param (d2, false)))
1303     {
1304       bb = EDGE_PRED (join, 1)->src;
1305       virt_bb = gimple_bb (d1);
1306     }
1307   else
1308     return;
1309
1310   /* Second, we need to check that the basic blocks are laid out in the way
1311      corresponding to the pattern. */
1312
1313   if (!single_pred_p (virt_bb) || !single_succ_p (virt_bb)
1314       || single_pred (virt_bb) != bb
1315       || single_succ (virt_bb) != join)
1316     return;
1317
1318   /* Third, let's see that the branching is done depending on the least
1319      significant bit of the pfn. */
1320
1321   branch = last_stmt (bb);
1322   if (!branch || gimple_code (branch) != GIMPLE_COND)
1323     return;
1324
1325   if (gimple_cond_code (branch) != NE_EXPR
1326       || !integer_zerop (gimple_cond_rhs (branch)))
1327     return;
1328
1329   cond = gimple_cond_lhs (branch);
1330   if (!ipa_is_ssa_with_stmt_def (cond))
1331     return;
1332
1333   def = SSA_NAME_DEF_STMT (cond);
1334   if (!is_gimple_assign (def)
1335       || gimple_assign_rhs_code (def) != BIT_AND_EXPR
1336       || !integer_onep (gimple_assign_rhs2 (def)))
1337     return;
1338
1339   cond = gimple_assign_rhs1 (def);
1340   if (!ipa_is_ssa_with_stmt_def (cond))
1341     return;
1342
1343   def = SSA_NAME_DEF_STMT (cond);
1344
1345   if (is_gimple_assign (def)
1346       && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)))
1347     {
1348       cond = gimple_assign_rhs1 (def);
1349       if (!ipa_is_ssa_with_stmt_def (cond))
1350         return;
1351       def = SSA_NAME_DEF_STMT (cond);
1352     }
1353
1354   rec2 = ipa_get_stmt_member_ptr_load_param (def,
1355                                              (TARGET_PTRMEMFUNC_VBIT_LOCATION
1356                                               == ptrmemfunc_vbit_in_delta));
1357
1358   if (rec != rec2)
1359     return;
1360
1361   index = ipa_get_param_decl_index (info, rec);
1362   if (index >= 0 && !is_parm_modified_before_call (&parms_info[index],
1363                                                    call, rec))
1364     ipa_note_param_call (node, index, call, false);
1365
1366   return;
1367 }
1368
1369 /* Analyze a CALL to an OBJ_TYPE_REF which is passed in TARGET and if the
1370    object referenced in the expression is a formal parameter of the caller
1371    (described by INFO), create a call note for the statement. */
1372
1373 static void
1374 ipa_analyze_virtual_call_uses (struct cgraph_node *node,
1375                                struct ipa_node_params *info, gimple call,
1376                                tree target)
1377 {
1378   struct ipa_jump_func jfunc;
1379   tree obj = OBJ_TYPE_REF_OBJECT (target);
1380   tree var;
1381   int index;
1382
1383   if (!flag_devirtualize)
1384     return;
1385
1386   if (TREE_CODE (obj) == ADDR_EXPR)
1387     {
1388       do
1389         {
1390           obj = TREE_OPERAND (obj, 0);
1391         }
1392       while (TREE_CODE (obj) == COMPONENT_REF);
1393       if (TREE_CODE (obj) != MEM_REF)
1394         return;
1395       obj = TREE_OPERAND (obj, 0);
1396     }
1397
1398   if (TREE_CODE (obj) != SSA_NAME
1399       || !SSA_NAME_IS_DEFAULT_DEF (obj))
1400     return;
1401
1402   var = SSA_NAME_VAR (obj);
1403   index = ipa_get_param_decl_index (info, var);
1404
1405   if (index >= 0
1406       && !detect_type_change_ssa (obj, call, &jfunc))
1407     ipa_note_param_call (node, index, call, true);
1408 }
1409
1410 /* Analyze a call statement CALL whether and how it utilizes formal parameters
1411    of the caller (described by INFO).  PARMS_INFO is a pointer to a vector
1412    containing intermediate information about each formal parameter.  */
1413
1414 static void
1415 ipa_analyze_call_uses (struct cgraph_node *node,
1416                        struct ipa_node_params *info,
1417                        struct param_analysis_info *parms_info, gimple call)
1418 {
1419   tree target = gimple_call_fn (call);
1420
1421   if (TREE_CODE (target) == SSA_NAME)
1422     ipa_analyze_indirect_call_uses (node, info, parms_info, call, target);
1423   else if (TREE_CODE (target) == OBJ_TYPE_REF)
1424     ipa_analyze_virtual_call_uses (node, info, call, target);
1425 }
1426
1427
1428 /* Analyze the call statement STMT with respect to formal parameters (described
1429    in INFO) of caller given by NODE.  Currently it only checks whether formal
1430    parameters are called.  PARMS_INFO is a pointer to a vector containing
1431    intermediate information about each formal parameter.  */
1432
1433 static void
1434 ipa_analyze_stmt_uses (struct cgraph_node *node, struct ipa_node_params *info,
1435                        struct param_analysis_info *parms_info, gimple stmt)
1436 {
1437   if (is_gimple_call (stmt))
1438     ipa_analyze_call_uses (node, info, parms_info, stmt);
1439 }
1440
1441 /* Callback of walk_stmt_load_store_addr_ops for the visit_load.
1442    If OP is a parameter declaration, mark it as used in the info structure
1443    passed in DATA.  */
1444
1445 static bool
1446 visit_ref_for_mod_analysis (gimple stmt ATTRIBUTE_UNUSED,
1447                              tree op, void *data)
1448 {
1449   struct ipa_node_params *info = (struct ipa_node_params *) data;
1450
1451   op = get_base_address (op);
1452   if (op
1453       && TREE_CODE (op) == PARM_DECL)
1454     {
1455       int index = ipa_get_param_decl_index (info, op);
1456       gcc_assert (index >= 0);
1457       info->params[index].used = true;
1458     }
1459
1460   return false;
1461 }
1462
1463 /* Scan the function body of NODE and inspect the uses of formal parameters.
1464    Store the findings in various structures of the associated ipa_node_params
1465    structure, such as parameter flags, notes etc.  PARMS_INFO is a pointer to a
1466    vector containing intermediate information about each formal parameter.   */
1467
1468 static void
1469 ipa_analyze_params_uses (struct cgraph_node *node,
1470                          struct param_analysis_info *parms_info)
1471 {
1472   tree decl = node->decl;
1473   basic_block bb;
1474   struct function *func;
1475   gimple_stmt_iterator gsi;
1476   struct ipa_node_params *info = IPA_NODE_REF (node);
1477   int i;
1478
1479   if (ipa_get_param_count (info) == 0 || info->uses_analysis_done)
1480     return;
1481
1482   for (i = 0; i < ipa_get_param_count (info); i++)
1483     {
1484       tree parm = ipa_get_param (info, i);
1485       /* For SSA regs see if parameter is used.  For non-SSA we compute
1486          the flag during modification analysis.  */
1487       if (is_gimple_reg (parm)
1488           && gimple_default_def (DECL_STRUCT_FUNCTION (node->decl), parm))
1489         info->params[i].used = true;
1490     }
1491
1492   func = DECL_STRUCT_FUNCTION (decl);
1493   FOR_EACH_BB_FN (bb, func)
1494     {
1495       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1496         {
1497           gimple stmt = gsi_stmt (gsi);
1498
1499           if (is_gimple_debug (stmt))
1500             continue;
1501
1502           ipa_analyze_stmt_uses (node, info, parms_info, stmt);
1503           walk_stmt_load_store_addr_ops (stmt, info,
1504                                          visit_ref_for_mod_analysis,
1505                                          visit_ref_for_mod_analysis,
1506                                          visit_ref_for_mod_analysis);
1507         }
1508       for (gsi = gsi_start (phi_nodes (bb)); !gsi_end_p (gsi); gsi_next (&gsi))
1509         walk_stmt_load_store_addr_ops (gsi_stmt (gsi), info,
1510                                        visit_ref_for_mod_analysis,
1511                                        visit_ref_for_mod_analysis,
1512                                        visit_ref_for_mod_analysis);
1513     }
1514
1515   info->uses_analysis_done = 1;
1516 }
1517
1518 /* Initialize the array describing properties of of formal parameters
1519    of NODE, analyze their uses and compute jump functions associated
1520    with actual arguments of calls from within NODE.  */
1521
1522 void
1523 ipa_analyze_node (struct cgraph_node *node)
1524 {
1525   struct ipa_node_params *info = IPA_NODE_REF (node);
1526   struct param_analysis_info *parms_info;
1527   int i, param_count;
1528
1529   push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1530   current_function_decl = node->decl;
1531   ipa_initialize_node_params (node);
1532
1533   param_count = ipa_get_param_count (info);
1534   parms_info = XALLOCAVEC (struct param_analysis_info, param_count);
1535   memset (parms_info, 0, sizeof (struct param_analysis_info) * param_count);
1536
1537   ipa_analyze_params_uses (node, parms_info);
1538   ipa_compute_jump_functions (node, parms_info);
1539
1540   for (i = 0; i < param_count; i++)
1541     if (parms_info[i].visited_statements)
1542       BITMAP_FREE (parms_info[i].visited_statements);
1543
1544   current_function_decl = NULL;
1545   pop_cfun ();
1546 }
1547
1548
1549 /* Update the jump function DST when the call graph edge corresponding to SRC is
1550    is being inlined, knowing that DST is of type ancestor and src of known
1551    type.  */
1552
1553 static void
1554 combine_known_type_and_ancestor_jfs (struct ipa_jump_func *src,
1555                                      struct ipa_jump_func *dst)
1556 {
1557   tree new_binfo;
1558
1559   new_binfo = get_binfo_at_offset (src->value.base_binfo,
1560                                    dst->value.ancestor.offset,
1561                                    dst->value.ancestor.type);
1562   if (new_binfo)
1563     {
1564       dst->type = IPA_JF_KNOWN_TYPE;
1565       dst->value.base_binfo = new_binfo;
1566     }
1567   else
1568     dst->type = IPA_JF_UNKNOWN;
1569 }
1570
1571 /* Update the jump functions associated with call graph edge E when the call
1572    graph edge CS is being inlined, assuming that E->caller is already (possibly
1573    indirectly) inlined into CS->callee and that E has not been inlined.  */
1574
1575 static void
1576 update_jump_functions_after_inlining (struct cgraph_edge *cs,
1577                                       struct cgraph_edge *e)
1578 {
1579   struct ipa_edge_args *top = IPA_EDGE_REF (cs);
1580   struct ipa_edge_args *args = IPA_EDGE_REF (e);
1581   int count = ipa_get_cs_argument_count (args);
1582   int i;
1583
1584   for (i = 0; i < count; i++)
1585     {
1586       struct ipa_jump_func *dst = ipa_get_ith_jump_func (args, i);
1587
1588       if (dst->type == IPA_JF_ANCESTOR)
1589         {
1590           struct ipa_jump_func *src;
1591
1592           /* Variable number of arguments can cause havoc if we try to access
1593              one that does not exist in the inlined edge.  So make sure we
1594              don't.  */
1595           if (dst->value.ancestor.formal_id >= ipa_get_cs_argument_count (top))
1596             {
1597               dst->type = IPA_JF_UNKNOWN;
1598               continue;
1599             }
1600
1601           src = ipa_get_ith_jump_func (top, dst->value.ancestor.formal_id);
1602           if (src->type == IPA_JF_KNOWN_TYPE)
1603             combine_known_type_and_ancestor_jfs (src, dst);
1604           else if (src->type == IPA_JF_PASS_THROUGH
1605                    && src->value.pass_through.operation == NOP_EXPR)
1606             dst->value.ancestor.formal_id = src->value.pass_through.formal_id;
1607           else if (src->type == IPA_JF_ANCESTOR)
1608             {
1609               dst->value.ancestor.formal_id = src->value.ancestor.formal_id;
1610               dst->value.ancestor.offset += src->value.ancestor.offset;
1611             }
1612           else
1613             dst->type = IPA_JF_UNKNOWN;
1614         }
1615       else if (dst->type == IPA_JF_PASS_THROUGH)
1616         {
1617           struct ipa_jump_func *src;
1618           /* We must check range due to calls with variable number of arguments
1619              and we cannot combine jump functions with operations.  */
1620           if (dst->value.pass_through.operation == NOP_EXPR
1621               && (dst->value.pass_through.formal_id
1622                   < ipa_get_cs_argument_count (top)))
1623             {
1624               src = ipa_get_ith_jump_func (top,
1625                                            dst->value.pass_through.formal_id);
1626               *dst = *src;
1627             }
1628           else
1629             dst->type = IPA_JF_UNKNOWN;
1630         }
1631     }
1632 }
1633
1634 /* If TARGET is an addr_expr of a function declaration, make it the destination
1635    of an indirect edge IE and return the edge.  Otherwise, return NULL.  Delta,
1636    if non-NULL, is an integer constant that must be added to this pointer
1637    (first parameter).  */
1638
1639 struct cgraph_edge *
1640 ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target, tree delta)
1641 {
1642   struct cgraph_node *callee;
1643
1644   if (TREE_CODE (target) == ADDR_EXPR)
1645     target = TREE_OPERAND (target, 0);
1646   if (TREE_CODE (target) != FUNCTION_DECL)
1647     return NULL;
1648   callee = cgraph_node (target);
1649   if (!callee)
1650     return NULL;
1651   ipa_check_create_node_params ();
1652
1653   /* We can not make edges to inline clones.  It is bug that someone removed the cgraph
1654      node too early.  */
1655   gcc_assert (!callee->global.inlined_to);
1656
1657   cgraph_make_edge_direct (ie, callee, delta ? tree_low_cst (delta, 0) : 0);
1658   if (dump_file)
1659     {
1660       fprintf (dump_file, "ipa-prop: Discovered %s call to a known target "
1661                "(%s/%i -> %s/%i), for stmt ",
1662                ie->indirect_info->polymorphic ? "a virtual" : "an indirect",
1663                cgraph_node_name (ie->caller), ie->caller->uid,
1664                cgraph_node_name (ie->callee), ie->callee->uid);
1665       if (ie->call_stmt)
1666         print_gimple_stmt (dump_file, ie->call_stmt, 2, TDF_SLIM);
1667       else
1668         fprintf (dump_file, "with uid %i\n", ie->lto_stmt_uid);
1669
1670       if (delta)
1671         {
1672           fprintf (dump_file, "          Thunk delta is ");
1673           print_generic_expr (dump_file, delta, 0);
1674           fprintf (dump_file, "\n");
1675         }
1676     }
1677
1678   if (ipa_get_cs_argument_count (IPA_EDGE_REF (ie))
1679       != ipa_get_param_count (IPA_NODE_REF (callee)))
1680     ipa_set_called_with_variable_arg (IPA_NODE_REF (callee));
1681
1682   return ie;
1683 }
1684
1685 /* Try to find a destination for indirect edge IE that corresponds to a simple
1686    call or a call of a member function pointer and where the destination is a
1687    pointer formal parameter described by jump function JFUNC.  If it can be
1688    determined, return the newly direct edge, otherwise return NULL.  */
1689
1690 static struct cgraph_edge *
1691 try_make_edge_direct_simple_call (struct cgraph_edge *ie,
1692                                   struct ipa_jump_func *jfunc)
1693 {
1694   tree target;
1695
1696   if (jfunc->type == IPA_JF_CONST)
1697     target = jfunc->value.constant;
1698   else if (jfunc->type == IPA_JF_CONST_MEMBER_PTR)
1699     target = jfunc->value.member_cst.pfn;
1700   else
1701     return NULL;
1702
1703   return ipa_make_edge_direct_to_target (ie, target, NULL_TREE);
1704 }
1705
1706 /* Try to find a destination for indirect edge IE that corresponds to a
1707    virtual call based on a formal parameter which is described by jump
1708    function JFUNC and if it can be determined, make it direct and return the
1709    direct edge.  Otherwise, return NULL.  */
1710
1711 static struct cgraph_edge *
1712 try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
1713                                    struct ipa_jump_func *jfunc)
1714 {
1715   tree binfo, type, target, delta;
1716   HOST_WIDE_INT token;
1717
1718   if (jfunc->type == IPA_JF_KNOWN_TYPE)
1719     binfo = jfunc->value.base_binfo;
1720   else
1721     return NULL;
1722
1723   if (!binfo)
1724     return NULL;
1725
1726   token = ie->indirect_info->otr_token;
1727   type = ie->indirect_info->otr_type;
1728   binfo = get_binfo_at_offset (binfo, ie->indirect_info->anc_offset, type);
1729   if (binfo)
1730     target = gimple_get_virt_mehtod_for_binfo (token, binfo, &delta, true);
1731   else
1732     return NULL;
1733
1734   if (target)
1735     return ipa_make_edge_direct_to_target (ie, target, delta);
1736   else
1737     return NULL;
1738 }
1739
1740 /* Update the param called notes associated with NODE when CS is being inlined,
1741    assuming NODE is (potentially indirectly) inlined into CS->callee.
1742    Moreover, if the callee is discovered to be constant, create a new cgraph
1743    edge for it.  Newly discovered indirect edges will be added to *NEW_EDGES,
1744    unless NEW_EDGES is NULL.  Return true iff a new edge(s) were created.  */
1745
1746 static bool
1747 update_indirect_edges_after_inlining (struct cgraph_edge *cs,
1748                                       struct cgraph_node *node,
1749                                       VEC (cgraph_edge_p, heap) **new_edges)
1750 {
1751   struct ipa_edge_args *top;
1752   struct cgraph_edge *ie, *next_ie, *new_direct_edge;
1753   bool res = false;
1754
1755   ipa_check_create_edge_args ();
1756   top = IPA_EDGE_REF (cs);
1757
1758   for (ie = node->indirect_calls; ie; ie = next_ie)
1759     {
1760       struct cgraph_indirect_call_info *ici = ie->indirect_info;
1761       struct ipa_jump_func *jfunc;
1762
1763       next_ie = ie->next_callee;
1764       if (bitmap_bit_p (iinlining_processed_edges, ie->uid))
1765         continue;
1766
1767       /* If we ever use indirect edges for anything other than indirect
1768          inlining, we will need to skip those with negative param_indices. */
1769       if (ici->param_index == -1)
1770         continue;
1771
1772       /* We must check range due to calls with variable number of arguments:  */
1773       if (ici->param_index >= ipa_get_cs_argument_count (top))
1774         {
1775           bitmap_set_bit (iinlining_processed_edges, ie->uid);
1776           continue;
1777         }
1778
1779       jfunc = ipa_get_ith_jump_func (top, ici->param_index);
1780       if (jfunc->type == IPA_JF_PASS_THROUGH
1781           && jfunc->value.pass_through.operation == NOP_EXPR)
1782         ici->param_index = jfunc->value.pass_through.formal_id;
1783       else if (jfunc->type == IPA_JF_ANCESTOR)
1784         {
1785           ici->param_index = jfunc->value.ancestor.formal_id;
1786           ici->anc_offset += jfunc->value.ancestor.offset;
1787         }
1788       else
1789         /* Either we can find a destination for this edge now or never. */
1790         bitmap_set_bit (iinlining_processed_edges, ie->uid);
1791
1792       if (ici->polymorphic)
1793         new_direct_edge = try_make_edge_direct_virtual_call (ie, jfunc);
1794       else
1795         new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc);
1796
1797       if (new_direct_edge)
1798         {
1799           new_direct_edge->indirect_inlining_edge = 1;
1800           if (new_edges)
1801             {
1802               VEC_safe_push (cgraph_edge_p, heap, *new_edges,
1803                              new_direct_edge);
1804               top = IPA_EDGE_REF (cs);
1805               res = true;
1806             }
1807         }
1808     }
1809
1810   return res;
1811 }
1812
1813 /* Recursively traverse subtree of NODE (including node) made of inlined
1814    cgraph_edges when CS has been inlined and invoke
1815    update_indirect_edges_after_inlining on all nodes and
1816    update_jump_functions_after_inlining on all non-inlined edges that lead out
1817    of this subtree.  Newly discovered indirect edges will be added to
1818    *NEW_EDGES, unless NEW_EDGES is NULL.  Return true iff a new edge(s) were
1819    created.  */
1820
1821 static bool
1822 propagate_info_to_inlined_callees (struct cgraph_edge *cs,
1823                                    struct cgraph_node *node,
1824                                    VEC (cgraph_edge_p, heap) **new_edges)
1825 {
1826   struct cgraph_edge *e;
1827   bool res;
1828
1829   res = update_indirect_edges_after_inlining (cs, node, new_edges);
1830
1831   for (e = node->callees; e; e = e->next_callee)
1832     if (!e->inline_failed)
1833       res |= propagate_info_to_inlined_callees (cs, e->callee, new_edges);
1834     else
1835       update_jump_functions_after_inlining (cs, e);
1836
1837   return res;
1838 }
1839
1840 /* Update jump functions and call note functions on inlining the call site CS.
1841    CS is expected to lead to a node already cloned by
1842    cgraph_clone_inline_nodes.  Newly discovered indirect edges will be added to
1843    *NEW_EDGES, unless NEW_EDGES is NULL.  Return true iff a new edge(s) were +
1844    created.  */
1845
1846 bool
1847 ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
1848                                    VEC (cgraph_edge_p, heap) **new_edges)
1849 {
1850   /* FIXME lto: We do not stream out indirect call information.  */
1851   if (flag_wpa)
1852     return false;
1853
1854   /* Do nothing if the preparation phase has not been carried out yet
1855      (i.e. during early inlining).  */
1856   if (!ipa_node_params_vector)
1857     return false;
1858   gcc_assert (ipa_edge_args_vector);
1859
1860   return propagate_info_to_inlined_callees (cs, cs->callee, new_edges);
1861 }
1862
1863 /* Frees all dynamically allocated structures that the argument info points
1864    to.  */
1865
1866 void
1867 ipa_free_edge_args_substructures (struct ipa_edge_args *args)
1868 {
1869   if (args->jump_functions)
1870     ggc_free (args->jump_functions);
1871
1872   memset (args, 0, sizeof (*args));
1873 }
1874
1875 /* Free all ipa_edge structures.  */
1876
1877 void
1878 ipa_free_all_edge_args (void)
1879 {
1880   int i;
1881   struct ipa_edge_args *args;
1882
1883   FOR_EACH_VEC_ELT (ipa_edge_args_t, ipa_edge_args_vector, i, args)
1884     ipa_free_edge_args_substructures (args);
1885
1886   VEC_free (ipa_edge_args_t, gc, ipa_edge_args_vector);
1887   ipa_edge_args_vector = NULL;
1888 }
1889
1890 /* Frees all dynamically allocated structures that the param info points
1891    to.  */
1892
1893 void
1894 ipa_free_node_params_substructures (struct ipa_node_params *info)
1895 {
1896   if (info->params)
1897     free (info->params);
1898
1899   memset (info, 0, sizeof (*info));
1900 }
1901
1902 /* Free all ipa_node_params structures.  */
1903
1904 void
1905 ipa_free_all_node_params (void)
1906 {
1907   int i;
1908   struct ipa_node_params *info;
1909
1910   FOR_EACH_VEC_ELT (ipa_node_params_t, ipa_node_params_vector, i, info)
1911     ipa_free_node_params_substructures (info);
1912
1913   VEC_free (ipa_node_params_t, heap, ipa_node_params_vector);
1914   ipa_node_params_vector = NULL;
1915 }
1916
1917 /* Hook that is called by cgraph.c when an edge is removed.  */
1918
1919 static void
1920 ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
1921 {
1922   /* During IPA-CP updating we can be called on not-yet analyze clones.  */
1923   if (VEC_length (ipa_edge_args_t, ipa_edge_args_vector)
1924       <= (unsigned)cs->uid)
1925     return;
1926   ipa_free_edge_args_substructures (IPA_EDGE_REF (cs));
1927 }
1928
1929 /* Hook that is called by cgraph.c when a node is removed.  */
1930
1931 static void
1932 ipa_node_removal_hook (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
1933 {
1934   /* During IPA-CP updating we can be called on not-yet analyze clones.  */
1935   if (VEC_length (ipa_node_params_t, ipa_node_params_vector)
1936       <= (unsigned)node->uid)
1937     return;
1938   ipa_free_node_params_substructures (IPA_NODE_REF (node));
1939 }
1940
1941 /* Helper function to duplicate an array of size N that is at SRC and store a
1942    pointer to it to DST.  Nothing is done if SRC is NULL.  */
1943
1944 static void *
1945 duplicate_array (void *src, size_t n)
1946 {
1947   void *p;
1948
1949   if (!src)
1950     return NULL;
1951
1952   p = xmalloc (n);
1953   memcpy (p, src, n);
1954   return p;
1955 }
1956
1957 static struct ipa_jump_func *
1958 duplicate_ipa_jump_func_array (const struct ipa_jump_func * src, size_t n)
1959 {
1960   struct ipa_jump_func *p;
1961
1962   if (!src)
1963     return NULL;
1964
1965   p = ggc_alloc_vec_ipa_jump_func (n);
1966   memcpy (p, src, n * sizeof (struct ipa_jump_func));
1967   return p;
1968 }
1969
1970 /* Hook that is called by cgraph.c when a node is duplicated.  */
1971
1972 static void
1973 ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
1974                            __attribute__((unused)) void *data)
1975 {
1976   struct ipa_edge_args *old_args, *new_args;
1977   int arg_count;
1978
1979   ipa_check_create_edge_args ();
1980
1981   old_args = IPA_EDGE_REF (src);
1982   new_args = IPA_EDGE_REF (dst);
1983
1984   arg_count = ipa_get_cs_argument_count (old_args);
1985   ipa_set_cs_argument_count (new_args, arg_count);
1986   new_args->jump_functions =
1987     duplicate_ipa_jump_func_array (old_args->jump_functions, arg_count);
1988
1989   if (iinlining_processed_edges
1990       && bitmap_bit_p (iinlining_processed_edges, src->uid))
1991     bitmap_set_bit (iinlining_processed_edges, dst->uid);
1992 }
1993
1994 /* Hook that is called by cgraph.c when a node is duplicated.  */
1995
1996 static void
1997 ipa_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
1998                            __attribute__((unused)) void *data)
1999 {
2000   struct ipa_node_params *old_info, *new_info;
2001   int param_count, i;
2002
2003   ipa_check_create_node_params ();
2004   old_info = IPA_NODE_REF (src);
2005   new_info = IPA_NODE_REF (dst);
2006   param_count = ipa_get_param_count (old_info);
2007
2008   ipa_set_param_count (new_info, param_count);
2009   new_info->params = (struct ipa_param_descriptor *)
2010     duplicate_array (old_info->params,
2011                      sizeof (struct ipa_param_descriptor) * param_count);
2012   for (i = 0; i < param_count; i++)
2013     new_info->params[i].types = VEC_copy (tree, heap,
2014                                           old_info->params[i].types);
2015   new_info->ipcp_orig_node = old_info->ipcp_orig_node;
2016   new_info->count_scale = old_info->count_scale;
2017
2018   new_info->called_with_var_arguments = old_info->called_with_var_arguments;
2019   new_info->uses_analysis_done = old_info->uses_analysis_done;
2020   new_info->node_enqueued = old_info->node_enqueued;
2021 }
2022
2023 /* Register our cgraph hooks if they are not already there.  */
2024
2025 void
2026 ipa_register_cgraph_hooks (void)
2027 {
2028   if (!edge_removal_hook_holder)
2029     edge_removal_hook_holder =
2030       cgraph_add_edge_removal_hook (&ipa_edge_removal_hook, NULL);
2031   if (!node_removal_hook_holder)
2032     node_removal_hook_holder =
2033       cgraph_add_node_removal_hook (&ipa_node_removal_hook, NULL);
2034   if (!edge_duplication_hook_holder)
2035     edge_duplication_hook_holder =
2036       cgraph_add_edge_duplication_hook (&ipa_edge_duplication_hook, NULL);
2037   if (!node_duplication_hook_holder)
2038     node_duplication_hook_holder =
2039       cgraph_add_node_duplication_hook (&ipa_node_duplication_hook, NULL);
2040 }
2041
2042 /* Unregister our cgraph hooks if they are not already there.  */
2043
2044 static void
2045 ipa_unregister_cgraph_hooks (void)
2046 {
2047   cgraph_remove_edge_removal_hook (edge_removal_hook_holder);
2048   edge_removal_hook_holder = NULL;
2049   cgraph_remove_node_removal_hook (node_removal_hook_holder);
2050   node_removal_hook_holder = NULL;
2051   cgraph_remove_edge_duplication_hook (edge_duplication_hook_holder);
2052   edge_duplication_hook_holder = NULL;
2053   cgraph_remove_node_duplication_hook (node_duplication_hook_holder);
2054   node_duplication_hook_holder = NULL;
2055 }
2056
2057 /* Allocate all necessary data structures necessary for indirect inlining.  */
2058
2059 void
2060 ipa_create_all_structures_for_iinln (void)
2061 {
2062   iinlining_processed_edges = BITMAP_ALLOC (NULL);
2063 }
2064
2065 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
2066    longer needed after ipa-cp.  */
2067
2068 void
2069 ipa_free_all_structures_after_ipa_cp (void)
2070 {
2071   if (!flag_indirect_inlining)
2072     {
2073       ipa_free_all_edge_args ();
2074       ipa_free_all_node_params ();
2075       ipa_unregister_cgraph_hooks ();
2076     }
2077 }
2078
2079 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
2080    longer needed after indirect inlining.  */
2081
2082 void
2083 ipa_free_all_structures_after_iinln (void)
2084 {
2085   BITMAP_FREE (iinlining_processed_edges);
2086
2087   ipa_free_all_edge_args ();
2088   ipa_free_all_node_params ();
2089   ipa_unregister_cgraph_hooks ();
2090 }
2091
2092 /* Print ipa_tree_map data structures of all functions in the
2093    callgraph to F.  */
2094
2095 void
2096 ipa_print_node_params (FILE * f, struct cgraph_node *node)
2097 {
2098   int i, count;
2099   tree temp;
2100   struct ipa_node_params *info;
2101
2102   if (!node->analyzed)
2103     return;
2104   info = IPA_NODE_REF (node);
2105   fprintf (f, "  function  %s parameter descriptors:\n",
2106            cgraph_node_name (node));
2107   count = ipa_get_param_count (info);
2108   for (i = 0; i < count; i++)
2109     {
2110       temp = ipa_get_param (info, i);
2111       if (TREE_CODE (temp) == PARM_DECL)
2112         fprintf (f, "    param %d : %s", i,
2113                  (DECL_NAME (temp)
2114                   ? (*lang_hooks.decl_printable_name) (temp, 2)
2115                   : "(unnamed)"));
2116       if (ipa_is_param_used (info, i))
2117         fprintf (f, " used");
2118       fprintf (f, "\n");
2119     }
2120 }
2121
2122 /* Print ipa_tree_map data structures of all functions in the
2123    callgraph to F.  */
2124
2125 void
2126 ipa_print_all_params (FILE * f)
2127 {
2128   struct cgraph_node *node;
2129
2130   fprintf (f, "\nFunction parameters:\n");
2131   for (node = cgraph_nodes; node; node = node->next)
2132     ipa_print_node_params (f, node);
2133 }
2134
2135 /* Return a heap allocated vector containing formal parameters of FNDECL.  */
2136
2137 VEC(tree, heap) *
2138 ipa_get_vector_of_formal_parms (tree fndecl)
2139 {
2140   VEC(tree, heap) *args;
2141   int count;
2142   tree parm;
2143
2144   count = count_formal_params_1 (fndecl);
2145   args = VEC_alloc (tree, heap, count);
2146   for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
2147     VEC_quick_push (tree, args, parm);
2148
2149   return args;
2150 }
2151
2152 /* Return a heap allocated vector containing types of formal parameters of
2153    function type FNTYPE.  */
2154
2155 static inline VEC(tree, heap) *
2156 get_vector_of_formal_parm_types (tree fntype)
2157 {
2158   VEC(tree, heap) *types;
2159   int count = 0;
2160   tree t;
2161
2162   for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
2163     count++;
2164
2165   types = VEC_alloc (tree, heap, count);
2166   for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
2167     VEC_quick_push (tree, types, TREE_VALUE (t));
2168
2169   return types;
2170 }
2171
2172 /* Modify the function declaration FNDECL and its type according to the plan in
2173    ADJUSTMENTS.  It also sets base fields of individual adjustments structures
2174    to reflect the actual parameters being modified which are determined by the
2175    base_index field.  */
2176
2177 void
2178 ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments,
2179                               const char *synth_parm_prefix)
2180 {
2181   VEC(tree, heap) *oparms, *otypes;
2182   tree orig_type, new_type = NULL;
2183   tree old_arg_types, t, new_arg_types = NULL;
2184   tree parm, *link = &DECL_ARGUMENTS (fndecl);
2185   int i, len = VEC_length (ipa_parm_adjustment_t, adjustments);
2186   tree new_reversed = NULL;
2187   bool care_for_types, last_parm_void;
2188
2189   if (!synth_parm_prefix)
2190     synth_parm_prefix = "SYNTH";
2191
2192   oparms = ipa_get_vector_of_formal_parms (fndecl);
2193   orig_type = TREE_TYPE (fndecl);
2194   old_arg_types = TYPE_ARG_TYPES (orig_type);
2195
2196   /* The following test is an ugly hack, some functions simply don't have any
2197      arguments in their type.  This is probably a bug but well... */
2198   care_for_types = (old_arg_types != NULL_TREE);
2199   if (care_for_types)
2200     {
2201       last_parm_void = (TREE_VALUE (tree_last (old_arg_types))
2202                         == void_type_node);
2203       otypes = get_vector_of_formal_parm_types (orig_type);
2204       if (last_parm_void)
2205         gcc_assert (VEC_length (tree, oparms) + 1 == VEC_length (tree, otypes));
2206       else
2207         gcc_assert (VEC_length (tree, oparms) == VEC_length (tree, otypes));
2208     }
2209   else
2210     {
2211       last_parm_void = false;
2212       otypes = NULL;
2213     }
2214
2215   for (i = 0; i < len; i++)
2216     {
2217       struct ipa_parm_adjustment *adj;
2218       gcc_assert (link);
2219
2220       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
2221       parm = VEC_index (tree, oparms, adj->base_index);
2222       adj->base = parm;
2223
2224       if (adj->copy_param)
2225         {
2226           if (care_for_types)
2227             new_arg_types = tree_cons (NULL_TREE, VEC_index (tree, otypes,
2228                                                              adj->base_index),
2229                                        new_arg_types);
2230           *link = parm;
2231           link = &DECL_CHAIN (parm);
2232         }
2233       else if (!adj->remove_param)
2234         {
2235           tree new_parm;
2236           tree ptype;
2237
2238           if (adj->by_ref)
2239             ptype = build_pointer_type (adj->type);
2240           else
2241             ptype = adj->type;
2242
2243           if (care_for_types)
2244             new_arg_types = tree_cons (NULL_TREE, ptype, new_arg_types);
2245
2246           new_parm = build_decl (UNKNOWN_LOCATION, PARM_DECL, NULL_TREE,
2247                                  ptype);
2248           DECL_NAME (new_parm) = create_tmp_var_name (synth_parm_prefix);
2249
2250           DECL_ARTIFICIAL (new_parm) = 1;
2251           DECL_ARG_TYPE (new_parm) = ptype;
2252           DECL_CONTEXT (new_parm) = fndecl;
2253           TREE_USED (new_parm) = 1;
2254           DECL_IGNORED_P (new_parm) = 1;
2255           layout_decl (new_parm, 0);
2256
2257           add_referenced_var (new_parm);
2258           mark_sym_for_renaming (new_parm);
2259           adj->base = parm;
2260           adj->reduction = new_parm;
2261
2262           *link = new_parm;
2263
2264           link = &DECL_CHAIN (new_parm);
2265         }
2266     }
2267
2268   *link = NULL_TREE;
2269
2270   if (care_for_types)
2271     {
2272       new_reversed = nreverse (new_arg_types);
2273       if (last_parm_void)
2274         {
2275           if (new_reversed)
2276             TREE_CHAIN (new_arg_types) = void_list_node;
2277           else
2278             new_reversed = void_list_node;
2279         }
2280     }
2281
2282   /* Use copy_node to preserve as much as possible from original type
2283      (debug info, attribute lists etc.)
2284      Exception is METHOD_TYPEs must have THIS argument.
2285      When we are asked to remove it, we need to build new FUNCTION_TYPE
2286      instead.  */
2287   if (TREE_CODE (orig_type) != METHOD_TYPE
2288        || (VEC_index (ipa_parm_adjustment_t, adjustments, 0)->copy_param
2289          && VEC_index (ipa_parm_adjustment_t, adjustments, 0)->base_index == 0))
2290     {
2291       new_type = build_distinct_type_copy (orig_type);
2292       TYPE_ARG_TYPES (new_type) = new_reversed;
2293     }
2294   else
2295     {
2296       new_type
2297         = build_distinct_type_copy (build_function_type (TREE_TYPE (orig_type),
2298                                                          new_reversed));
2299       TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
2300       DECL_VINDEX (fndecl) = NULL_TREE;
2301     }
2302
2303   /* When signature changes, we need to clear builtin info.  */
2304   if (DECL_BUILT_IN (fndecl))
2305     {
2306       DECL_BUILT_IN_CLASS (fndecl) = NOT_BUILT_IN;
2307       DECL_FUNCTION_CODE (fndecl) = (enum built_in_function) 0;
2308     }
2309
2310   /* This is a new type, not a copy of an old type.  Need to reassociate
2311      variants.  We can handle everything except the main variant lazily.  */
2312   t = TYPE_MAIN_VARIANT (orig_type);
2313   if (orig_type != t)
2314     {
2315       TYPE_MAIN_VARIANT (new_type) = t;
2316       TYPE_NEXT_VARIANT (new_type) = TYPE_NEXT_VARIANT (t);
2317       TYPE_NEXT_VARIANT (t) = new_type;
2318     }
2319   else
2320     {
2321       TYPE_MAIN_VARIANT (new_type) = new_type;
2322       TYPE_NEXT_VARIANT (new_type) = NULL;
2323     }
2324
2325   TREE_TYPE (fndecl) = new_type;
2326   DECL_VIRTUAL_P (fndecl) = 0;
2327   if (otypes)
2328     VEC_free (tree, heap, otypes);
2329   VEC_free (tree, heap, oparms);
2330 }
2331
2332 /* Modify actual arguments of a function call CS as indicated in ADJUSTMENTS.
2333    If this is a directly recursive call, CS must be NULL.  Otherwise it must
2334    contain the corresponding call graph edge.  */
2335
2336 void
2337 ipa_modify_call_arguments (struct cgraph_edge *cs, gimple stmt,
2338                            ipa_parm_adjustment_vec adjustments)
2339 {
2340   VEC(tree, heap) *vargs;
2341   gimple new_stmt;
2342   gimple_stmt_iterator gsi;
2343   tree callee_decl;
2344   int i, len;
2345
2346   len = VEC_length (ipa_parm_adjustment_t, adjustments);
2347   vargs = VEC_alloc (tree, heap, len);
2348
2349   gsi = gsi_for_stmt (stmt);
2350   for (i = 0; i < len; i++)
2351     {
2352       struct ipa_parm_adjustment *adj;
2353
2354       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
2355
2356       if (adj->copy_param)
2357         {
2358           tree arg = gimple_call_arg (stmt, adj->base_index);
2359
2360           VEC_quick_push (tree, vargs, arg);
2361         }
2362       else if (!adj->remove_param)
2363         {
2364           tree expr, base, off;
2365           location_t loc;
2366
2367           /* We create a new parameter out of the value of the old one, we can
2368              do the following kind of transformations:
2369
2370              - A scalar passed by reference is converted to a scalar passed by
2371                value.  (adj->by_ref is false and the type of the original
2372                actual argument is a pointer to a scalar).
2373
2374              - A part of an aggregate is passed instead of the whole aggregate.
2375                The part can be passed either by value or by reference, this is
2376                determined by value of adj->by_ref.  Moreover, the code below
2377                handles both situations when the original aggregate is passed by
2378                value (its type is not a pointer) and when it is passed by
2379                reference (it is a pointer to an aggregate).
2380
2381              When the new argument is passed by reference (adj->by_ref is true)
2382              it must be a part of an aggregate and therefore we form it by
2383              simply taking the address of a reference inside the original
2384              aggregate.  */
2385
2386           gcc_checking_assert (adj->offset % BITS_PER_UNIT == 0);
2387           base = gimple_call_arg (stmt, adj->base_index);
2388           loc = EXPR_LOCATION (base);
2389
2390           if (TREE_CODE (base) != ADDR_EXPR
2391               && POINTER_TYPE_P (TREE_TYPE (base)))
2392             off = build_int_cst (adj->alias_ptr_type,
2393                                  adj->offset / BITS_PER_UNIT);
2394           else
2395             {
2396               HOST_WIDE_INT base_offset;
2397               tree prev_base;
2398
2399               if (TREE_CODE (base) == ADDR_EXPR)
2400                 base = TREE_OPERAND (base, 0);
2401               prev_base = base;
2402               base = get_addr_base_and_unit_offset (base, &base_offset);
2403               /* Aggregate arguments can have non-invariant addresses.  */
2404               if (!base)
2405                 {
2406                   base = build_fold_addr_expr (prev_base);
2407                   off = build_int_cst (adj->alias_ptr_type,
2408                                        adj->offset / BITS_PER_UNIT);
2409                 }
2410               else if (TREE_CODE (base) == MEM_REF)
2411                 {
2412                   off = build_int_cst (adj->alias_ptr_type,
2413                                        base_offset
2414                                        + adj->offset / BITS_PER_UNIT);
2415                   off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1),
2416                                          off, 0);
2417                   base = TREE_OPERAND (base, 0);
2418                 }
2419               else
2420                 {
2421                   off = build_int_cst (adj->alias_ptr_type,
2422                                        base_offset
2423                                        + adj->offset / BITS_PER_UNIT);
2424                   base = build_fold_addr_expr (base);
2425                 }
2426             }
2427
2428           expr = fold_build2_loc (loc, MEM_REF, adj->type, base, off);
2429           if (adj->by_ref)
2430             expr = build_fold_addr_expr (expr);
2431
2432           expr = force_gimple_operand_gsi (&gsi, expr,
2433                                            adj->by_ref
2434                                            || is_gimple_reg_type (adj->type),
2435                                            NULL, true, GSI_SAME_STMT);
2436           VEC_quick_push (tree, vargs, expr);
2437         }
2438     }
2439
2440   if (dump_file && (dump_flags & TDF_DETAILS))
2441     {
2442       fprintf (dump_file, "replacing stmt:");
2443       print_gimple_stmt (dump_file, gsi_stmt (gsi), 0, 0);
2444     }
2445
2446   callee_decl = !cs ? gimple_call_fndecl (stmt) : cs->callee->decl;
2447   new_stmt = gimple_build_call_vec (callee_decl, vargs);
2448   VEC_free (tree, heap, vargs);
2449   if (gimple_call_lhs (stmt))
2450     gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt));
2451
2452   gimple_set_block (new_stmt, gimple_block (stmt));
2453   if (gimple_has_location (stmt))
2454     gimple_set_location (new_stmt, gimple_location (stmt));
2455   gimple_call_copy_flags (new_stmt, stmt);
2456   gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
2457
2458   if (dump_file && (dump_flags & TDF_DETAILS))
2459     {
2460       fprintf (dump_file, "with stmt:");
2461       print_gimple_stmt (dump_file, new_stmt, 0, 0);
2462       fprintf (dump_file, "\n");
2463     }
2464   gsi_replace (&gsi, new_stmt, true);
2465   if (cs)
2466     cgraph_set_call_stmt (cs, new_stmt);
2467   update_ssa (TODO_update_ssa);
2468   free_dominance_info (CDI_DOMINATORS);
2469 }
2470
2471 /* Return true iff BASE_INDEX is in ADJUSTMENTS more than once.  */
2472
2473 static bool
2474 index_in_adjustments_multiple_times_p (int base_index,
2475                                        ipa_parm_adjustment_vec adjustments)
2476 {
2477   int i, len = VEC_length (ipa_parm_adjustment_t, adjustments);
2478   bool one = false;
2479
2480   for (i = 0; i < len; i++)
2481     {
2482       struct ipa_parm_adjustment *adj;
2483       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
2484
2485       if (adj->base_index == base_index)
2486         {
2487           if (one)
2488             return true;
2489           else
2490             one = true;
2491         }
2492     }
2493   return false;
2494 }
2495
2496
2497 /* Return adjustments that should have the same effect on function parameters
2498    and call arguments as if they were first changed according to adjustments in
2499    INNER and then by adjustments in OUTER.  */
2500
2501 ipa_parm_adjustment_vec
2502 ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
2503                          ipa_parm_adjustment_vec outer)
2504 {
2505   int i, outlen = VEC_length (ipa_parm_adjustment_t, outer);
2506   int inlen = VEC_length (ipa_parm_adjustment_t, inner);
2507   int removals = 0;
2508   ipa_parm_adjustment_vec adjustments, tmp;
2509
2510   tmp = VEC_alloc (ipa_parm_adjustment_t, heap, inlen);
2511   for (i = 0; i < inlen; i++)
2512     {
2513       struct ipa_parm_adjustment *n;
2514       n = VEC_index (ipa_parm_adjustment_t, inner, i);
2515
2516       if (n->remove_param)
2517         removals++;
2518       else
2519         VEC_quick_push (ipa_parm_adjustment_t, tmp, n);
2520     }
2521
2522   adjustments = VEC_alloc (ipa_parm_adjustment_t, heap, outlen + removals);
2523   for (i = 0; i < outlen; i++)
2524     {
2525       struct ipa_parm_adjustment *r;
2526       struct ipa_parm_adjustment *out = VEC_index (ipa_parm_adjustment_t,
2527                                                    outer, i);
2528       struct ipa_parm_adjustment *in = VEC_index (ipa_parm_adjustment_t, tmp,
2529                                                   out->base_index);
2530
2531       gcc_assert (!in->remove_param);
2532       if (out->remove_param)
2533         {
2534           if (!index_in_adjustments_multiple_times_p (in->base_index, tmp))
2535             {
2536               r = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
2537               memset (r, 0, sizeof (*r));
2538               r->remove_param = true;
2539             }
2540           continue;
2541         }
2542
2543       r = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
2544       memset (r, 0, sizeof (*r));
2545       r->base_index = in->base_index;
2546       r->type = out->type;
2547
2548       /* FIXME:  Create nonlocal value too.  */
2549
2550       if (in->copy_param && out->copy_param)
2551         r->copy_param = true;
2552       else if (in->copy_param)
2553         r->offset = out->offset;
2554       else if (out->copy_param)
2555         r->offset = in->offset;
2556       else
2557         r->offset = in->offset + out->offset;
2558     }
2559
2560   for (i = 0; i < inlen; i++)
2561     {
2562       struct ipa_parm_adjustment *n = VEC_index (ipa_parm_adjustment_t,
2563                                                  inner, i);
2564
2565       if (n->remove_param)
2566         VEC_quick_push (ipa_parm_adjustment_t, adjustments, n);
2567     }
2568
2569   VEC_free (ipa_parm_adjustment_t, heap, tmp);
2570   return adjustments;
2571 }
2572
2573 /* Dump the adjustments in the vector ADJUSTMENTS to dump_file in a human
2574    friendly way, assuming they are meant to be applied to FNDECL.  */
2575
2576 void
2577 ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments,
2578                             tree fndecl)
2579 {
2580   int i, len = VEC_length (ipa_parm_adjustment_t, adjustments);
2581   bool first = true;
2582   VEC(tree, heap) *parms = ipa_get_vector_of_formal_parms (fndecl);
2583
2584   fprintf (file, "IPA param adjustments: ");
2585   for (i = 0; i < len; i++)
2586     {
2587       struct ipa_parm_adjustment *adj;
2588       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
2589
2590       if (!first)
2591         fprintf (file, "                 ");
2592       else
2593         first = false;
2594
2595       fprintf (file, "%i. base_index: %i - ", i, adj->base_index);
2596       print_generic_expr (file, VEC_index (tree, parms, adj->base_index), 0);
2597       if (adj->base)
2598         {
2599           fprintf (file, ", base: ");
2600           print_generic_expr (file, adj->base, 0);
2601         }
2602       if (adj->reduction)
2603         {
2604           fprintf (file, ", reduction: ");
2605           print_generic_expr (file, adj->reduction, 0);
2606         }
2607       if (adj->new_ssa_base)
2608         {
2609           fprintf (file, ", new_ssa_base: ");
2610           print_generic_expr (file, adj->new_ssa_base, 0);
2611         }
2612
2613       if (adj->copy_param)
2614         fprintf (file, ", copy_param");
2615       else if (adj->remove_param)
2616         fprintf (file, ", remove_param");
2617       else
2618         fprintf (file, ", offset %li", (long) adj->offset);
2619       if (adj->by_ref)
2620         fprintf (file, ", by_ref");
2621       print_node_brief (file, ", type: ", adj->type, 0);
2622       fprintf (file, "\n");
2623     }
2624   VEC_free (tree, heap, parms);
2625 }
2626
2627 /* Stream out jump function JUMP_FUNC to OB.  */
2628
2629 static void
2630 ipa_write_jump_function (struct output_block *ob,
2631                          struct ipa_jump_func *jump_func)
2632 {
2633   lto_output_uleb128_stream (ob->main_stream,
2634                              jump_func->type);
2635
2636   switch (jump_func->type)
2637     {
2638     case IPA_JF_UNKNOWN:
2639       break;
2640     case IPA_JF_KNOWN_TYPE:
2641       lto_output_tree (ob, jump_func->value.base_binfo, true);
2642       break;
2643     case IPA_JF_CONST:
2644       lto_output_tree (ob, jump_func->value.constant, true);
2645       break;
2646     case IPA_JF_PASS_THROUGH:
2647       lto_output_tree (ob, jump_func->value.pass_through.operand, true);
2648       lto_output_uleb128_stream (ob->main_stream,
2649                                  jump_func->value.pass_through.formal_id);
2650       lto_output_uleb128_stream (ob->main_stream,
2651                                  jump_func->value.pass_through.operation);
2652       break;
2653     case IPA_JF_ANCESTOR:
2654       lto_output_uleb128_stream (ob->main_stream,
2655                                  jump_func->value.ancestor.offset);
2656       lto_output_tree (ob, jump_func->value.ancestor.type, true);
2657       lto_output_uleb128_stream (ob->main_stream,
2658                                  jump_func->value.ancestor.formal_id);
2659       break;
2660     case IPA_JF_CONST_MEMBER_PTR:
2661       lto_output_tree (ob, jump_func->value.member_cst.pfn, true);
2662       lto_output_tree (ob, jump_func->value.member_cst.delta, false);
2663       break;
2664     }
2665 }
2666
2667 /* Read in jump function JUMP_FUNC from IB.  */
2668
2669 static void
2670 ipa_read_jump_function (struct lto_input_block *ib,
2671                         struct ipa_jump_func *jump_func,
2672                         struct data_in *data_in)
2673 {
2674   jump_func->type = (enum jump_func_type) lto_input_uleb128 (ib);
2675
2676   switch (jump_func->type)
2677     {
2678     case IPA_JF_UNKNOWN:
2679       break;
2680     case IPA_JF_KNOWN_TYPE:
2681       jump_func->value.base_binfo = lto_input_tree (ib, data_in);
2682       break;
2683     case IPA_JF_CONST:
2684       jump_func->value.constant = lto_input_tree (ib, data_in);
2685       break;
2686     case IPA_JF_PASS_THROUGH:
2687       jump_func->value.pass_through.operand = lto_input_tree (ib, data_in);
2688       jump_func->value.pass_through.formal_id = lto_input_uleb128 (ib);
2689       jump_func->value.pass_through.operation = (enum tree_code) lto_input_uleb128 (ib);
2690       break;
2691     case IPA_JF_ANCESTOR:
2692       jump_func->value.ancestor.offset = lto_input_uleb128 (ib);
2693       jump_func->value.ancestor.type = lto_input_tree (ib, data_in);
2694       jump_func->value.ancestor.formal_id = lto_input_uleb128 (ib);
2695       break;
2696     case IPA_JF_CONST_MEMBER_PTR:
2697       jump_func->value.member_cst.pfn = lto_input_tree (ib, data_in);
2698       jump_func->value.member_cst.delta = lto_input_tree (ib, data_in);
2699       break;
2700     }
2701 }
2702
2703 /* Stream out parts of cgraph_indirect_call_info corresponding to CS that are
2704    relevant to indirect inlining to OB.  */
2705
2706 static void
2707 ipa_write_indirect_edge_info (struct output_block *ob,
2708                               struct cgraph_edge *cs)
2709 {
2710   struct cgraph_indirect_call_info *ii = cs->indirect_info;
2711   struct bitpack_d bp;
2712
2713   lto_output_sleb128_stream (ob->main_stream, ii->param_index);
2714   lto_output_sleb128_stream (ob->main_stream, ii->anc_offset);
2715   bp = bitpack_create (ob->main_stream);
2716   bp_pack_value (&bp, ii->polymorphic, 1);
2717   lto_output_bitpack (&bp);
2718
2719   if (ii->polymorphic)
2720     {
2721       lto_output_sleb128_stream (ob->main_stream, ii->otr_token);
2722       lto_output_tree (ob, ii->otr_type, true);
2723     }
2724 }
2725
2726 /* Read in parts of cgraph_indirect_call_info corresponding to CS that are
2727    relevant to indirect inlining from IB.  */
2728
2729 static void
2730 ipa_read_indirect_edge_info (struct lto_input_block *ib,
2731                              struct data_in *data_in ATTRIBUTE_UNUSED,
2732                              struct cgraph_edge *cs)
2733 {
2734   struct cgraph_indirect_call_info *ii = cs->indirect_info;
2735   struct bitpack_d bp;
2736
2737   ii->param_index = (int) lto_input_sleb128 (ib);
2738   ii->anc_offset = (HOST_WIDE_INT) lto_input_sleb128 (ib);
2739   bp = lto_input_bitpack (ib);
2740   ii->polymorphic = bp_unpack_value (&bp, 1);
2741   if (ii->polymorphic)
2742     {
2743       ii->otr_token = (HOST_WIDE_INT) lto_input_sleb128 (ib);
2744       ii->otr_type = lto_input_tree (ib, data_in);
2745     }
2746 }
2747
2748 /* Stream out NODE info to OB.  */
2749
2750 static void
2751 ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
2752 {
2753   int node_ref;
2754   lto_cgraph_encoder_t encoder;
2755   struct ipa_node_params *info = IPA_NODE_REF (node);
2756   int j;
2757   struct cgraph_edge *e;
2758   struct bitpack_d bp;
2759
2760   encoder = ob->decl_state->cgraph_node_encoder;
2761   node_ref = lto_cgraph_encoder_encode (encoder, node);
2762   lto_output_uleb128_stream (ob->main_stream, node_ref);
2763
2764   bp = bitpack_create (ob->main_stream);
2765   bp_pack_value (&bp, info->called_with_var_arguments, 1);
2766   gcc_assert (info->uses_analysis_done
2767               || ipa_get_param_count (info) == 0);
2768   gcc_assert (!info->node_enqueued);
2769   gcc_assert (!info->ipcp_orig_node);
2770   for (j = 0; j < ipa_get_param_count (info); j++)
2771     bp_pack_value (&bp, info->params[j].used, 1);
2772   lto_output_bitpack (&bp);
2773   for (e = node->callees; e; e = e->next_callee)
2774     {
2775       struct ipa_edge_args *args = IPA_EDGE_REF (e);
2776
2777       lto_output_uleb128_stream (ob->main_stream,
2778                                  ipa_get_cs_argument_count (args));
2779       for (j = 0; j < ipa_get_cs_argument_count (args); j++)
2780         ipa_write_jump_function (ob, ipa_get_ith_jump_func (args, j));
2781     }
2782   for (e = node->indirect_calls; e; e = e->next_callee)
2783     ipa_write_indirect_edge_info (ob, e);
2784 }
2785
2786 /* Stream in NODE info from IB.  */
2787
2788 static void
2789 ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
2790                     struct data_in *data_in)
2791 {
2792   struct ipa_node_params *info = IPA_NODE_REF (node);
2793   int k;
2794   struct cgraph_edge *e;
2795   struct bitpack_d bp;
2796
2797   ipa_initialize_node_params (node);
2798
2799   bp = lto_input_bitpack (ib);
2800   info->called_with_var_arguments = bp_unpack_value (&bp, 1);
2801   if (ipa_get_param_count (info) != 0)
2802     info->uses_analysis_done = true;
2803   info->node_enqueued = false;
2804   for (k = 0; k < ipa_get_param_count (info); k++)
2805     info->params[k].used = bp_unpack_value (&bp, 1);
2806   for (e = node->callees; e; e = e->next_callee)
2807     {
2808       struct ipa_edge_args *args = IPA_EDGE_REF (e);
2809       int count = lto_input_uleb128 (ib);
2810
2811       ipa_set_cs_argument_count (args, count);
2812       if (!count)
2813         continue;
2814
2815       args->jump_functions = ggc_alloc_cleared_vec_ipa_jump_func
2816         (ipa_get_cs_argument_count (args));
2817       for (k = 0; k < ipa_get_cs_argument_count (args); k++)
2818         ipa_read_jump_function (ib, ipa_get_ith_jump_func (args, k), data_in);
2819     }
2820   for (e = node->indirect_calls; e; e = e->next_callee)
2821     ipa_read_indirect_edge_info (ib, data_in, e);
2822 }
2823
2824 /* Write jump functions for nodes in SET.  */
2825
2826 void
2827 ipa_prop_write_jump_functions (cgraph_node_set set)
2828 {
2829   struct cgraph_node *node;
2830   struct output_block *ob = create_output_block (LTO_section_jump_functions);
2831   unsigned int count = 0;
2832   cgraph_node_set_iterator csi;
2833
2834   ob->cgraph_node = NULL;
2835
2836   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
2837     {
2838       node = csi_node (csi);
2839       if (node->analyzed && IPA_NODE_REF (node) != NULL)
2840         count++;
2841     }
2842
2843   lto_output_uleb128_stream (ob->main_stream, count);
2844
2845   /* Process all of the functions.  */
2846   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
2847     {
2848       node = csi_node (csi);
2849       if (node->analyzed && IPA_NODE_REF (node) != NULL)
2850         ipa_write_node_info (ob, node);
2851     }
2852   lto_output_1_stream (ob->main_stream, 0);
2853   produce_asm (ob, NULL);
2854   destroy_output_block (ob);
2855 }
2856
2857 /* Read section in file FILE_DATA of length LEN with data DATA.  */
2858
2859 static void
2860 ipa_prop_read_section (struct lto_file_decl_data *file_data, const char *data,
2861                        size_t len)
2862 {
2863   const struct lto_function_header *header =
2864     (const struct lto_function_header *) data;
2865   const int32_t cfg_offset = sizeof (struct lto_function_header);
2866   const int32_t main_offset = cfg_offset + header->cfg_size;
2867   const int32_t string_offset = main_offset + header->main_size;
2868   struct data_in *data_in;
2869   struct lto_input_block ib_main;
2870   unsigned int i;
2871   unsigned int count;
2872
2873   LTO_INIT_INPUT_BLOCK (ib_main, (const char *) data + main_offset, 0,
2874                         header->main_size);
2875
2876   data_in =
2877     lto_data_in_create (file_data, (const char *) data + string_offset,
2878                         header->string_size, NULL);
2879   count = lto_input_uleb128 (&ib_main);
2880
2881   for (i = 0; i < count; i++)
2882     {
2883       unsigned int index;
2884       struct cgraph_node *node;
2885       lto_cgraph_encoder_t encoder;
2886
2887       index = lto_input_uleb128 (&ib_main);
2888       encoder = file_data->cgraph_node_encoder;
2889       node = lto_cgraph_encoder_deref (encoder, index);
2890       gcc_assert (node->analyzed);
2891       ipa_read_node_info (&ib_main, node, data_in);
2892     }
2893   lto_free_section_data (file_data, LTO_section_jump_functions, NULL, data,
2894                          len);
2895   lto_data_in_delete (data_in);
2896 }
2897
2898 /* Read ipcp jump functions.  */
2899
2900 void
2901 ipa_prop_read_jump_functions (void)
2902 {
2903   struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
2904   struct lto_file_decl_data *file_data;
2905   unsigned int j = 0;
2906
2907   ipa_check_create_node_params ();
2908   ipa_check_create_edge_args ();
2909   ipa_register_cgraph_hooks ();
2910
2911   while ((file_data = file_data_vec[j++]))
2912     {
2913       size_t len;
2914       const char *data = lto_get_section_data (file_data, LTO_section_jump_functions, NULL, &len);
2915
2916       if (data)
2917         ipa_prop_read_section (file_data, data, len);
2918     }
2919 }
2920
2921 /* After merging units, we can get mismatch in argument counts.
2922    Also decl merging might've rendered parameter lists obsolete.
2923    Also compute called_with_variable_arg info.  */
2924
2925 void
2926 ipa_update_after_lto_read (void)
2927 {
2928   struct cgraph_node *node;
2929   struct cgraph_edge *cs;
2930
2931   ipa_check_create_node_params ();
2932   ipa_check_create_edge_args ();
2933
2934   for (node = cgraph_nodes; node; node = node->next)
2935     if (node->analyzed)
2936       ipa_initialize_node_params (node);
2937
2938   for (node = cgraph_nodes; node; node = node->next)
2939     if (node->analyzed)
2940       for (cs = node->callees; cs; cs = cs->next_callee)
2941         {
2942           if (ipa_get_cs_argument_count (IPA_EDGE_REF (cs))
2943               != ipa_get_param_count (IPA_NODE_REF (cs->callee)))
2944             ipa_set_called_with_variable_arg (IPA_NODE_REF (cs->callee));
2945         }
2946 }