+ /* Now post-process solutions to handle locals from different
+ runtime instantiations coming in through recursive invocations. */
+ unsigned shadow_var_cnt = 0;
+ for (unsigned i = 1; i < varmap.length (); ++i)
+ {
+ varinfo_t fi = get_varinfo (i);
+ if (fi->is_fn_info
+ && fi->decl)
+ /* Automatic variables pointed to by their containing functions
+ parameters need this treatment. */
+ for (varinfo_t ai = first_vi_for_offset (fi, fi_parm_base);
+ ai; ai = vi_next (ai))
+ {
+ varinfo_t vi = get_varinfo (find (ai->id));
+ bitmap_iterator bi;
+ unsigned j;
+ EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, j, bi)
+ {
+ varinfo_t pt = get_varinfo (j);
+ if (pt->shadow_var_uid == 0
+ && pt->decl
+ && auto_var_in_fn_p (pt->decl, fi->decl))
+ {
+ pt->shadow_var_uid = allocate_decl_uid ();
+ shadow_var_cnt++;
+ }
+ }
+ }
+ /* As well as global variables which are another way of passing
+ arguments to recursive invocations. */
+ else if (fi->is_global_var)
+ {
+ for (varinfo_t ai = fi; ai; ai = vi_next (ai))
+ {
+ varinfo_t vi = get_varinfo (find (ai->id));
+ bitmap_iterator bi;
+ unsigned j;
+ EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, j, bi)
+ {
+ varinfo_t pt = get_varinfo (j);
+ if (pt->shadow_var_uid == 0
+ && pt->decl
+ && auto_var_p (pt->decl))
+ {
+ pt->shadow_var_uid = allocate_decl_uid ();
+ shadow_var_cnt++;
+ }
+ }
+ }
+ }
+ }
+ if (shadow_var_cnt && dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, "Allocated %u shadow variables for locals "
+ "maybe leaking into recursive invocations of their containing "
+ "functions\n", shadow_var_cnt);
+