On Wed, Aug 22, 2012 at 3:04 PM, Martin Jambor <mjam...@suse.cz> wrote:
> Hi,
>
> On Tue, Aug 21, 2012 at 01:30:47PM +0200, Richard Guenther wrote:
>> On Tue, Aug 21, 2012 at 1:27 PM, Martin Jambor <mjam...@suse.cz> wrote:
>> > On Wed, Aug 15, 2012 at 05:21:04PM +0200, Martin Jambor wrote:
>> >> Hi,
>> >>
>> >> On Fri, Aug 10, 2012 at 04:57:41PM +0200, Eric Botcazou wrote:
>> >> > > - ada/gcc-interface/utils.c:rest_of_subprog_body_compilation calls
>> >> > >   dump_function which in turns calls dump_function_to_file which calls
>> >> > >   push_cfun.  But Ada front end has its idea of the
>> >> > >   current_function_decl and there is no cfun which is an inconsistency
>> >> > >   which makes push_cfun assert fail.  I "solved" it by temporarily
>> >> > >   setting current_function_decl to NULL_TREE.  It's just dumping and I
>> >> > >   thought that dump_function should be considered middle-end and thus
>> >> > >   middle-end invariants should apply.
>> >> >
>> >> > If you think that calling dump_function from 
>> >> > rest_of_subprog_body_compilation
>> >> > is a layering violation, I don't have a problem with replacing it with 
>> >> > a more
>> >> > "manual" scheme like the one in c-family/c-gimplify.c:c_genericize, 
>> >> > provided
>> >> > that this yields roughly the same output.
>> >>
>> >> Richi suggested on IRC that I remove the push/pop_cfun calls from
>> >> dump_function_to_file.  The only problem seems to be
>> >> dump_histograms_for_stmt
>> >
>> > Yesterday I actually tried and it is not the only problem.  Another
>> > one is dump_function_to_file->dump_bb->maybe_hot_bb_p which uses cfun
>> > to read profile_status.  There may be others, this one just blew up
>> > first when I set cfun to NULL.  And in future someone is quite likely
>> > to need cfun to dump something new too.
>> >
>> > At the same time, re-implementing dumping
>> > c-family/c-gimplify.c:c_genericize when dump_function suffices seems
>> > ugly to me.
>> >
>> > So I am going to declare dump_function a front-end interface and use
>> > set_cfun in my original patch in dump_function_to_file like we do in
>> > other such functions.
>> >
>> > I hope that will be OK.  Thanks,
>>
>> Setting cfun has side-effects of switching target stuff which might have
>> code-generation side-effects because of implementation issues we have
>> with target/optimize attributes.  So I don't think cfun should be changed
>> just for dumping.
>>
>> Can you instead just set current_function_decl and access
>> struct function via DECL_STRUCT_FUNCTION in the dumpers then?
>> After all, it it is a front-end interface, the frontend way of saying
>> "this is the current function" is to set current_function_decl, not the
>> middle-end cfun.
>>
>
> Like the following?  Tested and bootstrapped on x86_64-linux, it does
> help avoid the ada hunk in my previous patch.  OK for trunk?

Ok if nobody complains - btw, I think you miss to restore current_function_decl
here:


> *** /tmp/HcgoTd_tree-cfg.c      Wed Aug 22 15:02:30 2012
> --- gcc/tree-cfg.c      Wed Aug 22 11:53:02 2012
> *************** move_sese_region_to_fn (struct function
> *** 6632,6650 ****
>      */
>
>   void
> ! dump_function_to_file (tree fn, FILE *file, int flags)
>   {
> !   tree arg, var;
>     struct function *dsf;
>     bool ignore_topmost_bind = false, any_var = false;
>     basic_block bb;
>     tree chain;
> !   bool tmclone = TREE_CODE (fn) == FUNCTION_DECL && decl_is_tm_clone (fn);
>
> !   fprintf (file, "%s %s(", current_function_name (),
> !          tmclone ? "[tm-clone] " : "");
>
> !   arg = DECL_ARGUMENTS (fn);
>     while (arg)
>       {
>         print_generic_expr (file, TREE_TYPE (arg), dump_flags);
> --- 6632,6652 ----
>      */
>
>   void
> ! dump_function_to_file (tree fndecl, FILE *file, int flags)
>   {
> !   tree arg, var, old_current_fndecl = current_function_decl;
>     struct function *dsf;
>     bool ignore_topmost_bind = false, any_var = false;
>     basic_block bb;
>     tree chain;
> !   bool tmclone = (TREE_CODE (fndecl) == FUNCTION_DECL
> !                 && decl_is_tm_clone (fndecl));
> !   struct function *fun = DECL_STRUCT_FUNCTION (fndecl);
>
> !   current_function_decl = fndecl;
> !   fprintf (file, "%s %s(", function_name (fun), tmclone ? "[tm-clone] " : 
> "");
>
> !   arg = DECL_ARGUMENTS (fndecl);
>     while (arg)
>       {
>         print_generic_expr (file, TREE_TYPE (arg), dump_flags);
> *************** dump_function_to_file (tree fn, FILE *fi
> *** 6659,6689 ****
>     fprintf (file, ")\n");
>
>     if (flags & TDF_VERBOSE)
> !     print_node (file, "", fn, 2);
>
> !   dsf = DECL_STRUCT_FUNCTION (fn);
>     if (dsf && (flags & TDF_EH))
>       dump_eh_tree (file, dsf);
>
> !   if (flags & TDF_RAW && !gimple_has_body_p (fn))
>       {
> !       dump_node (fn, TDF_SLIM | flags, file);
>         return;
>       }
>
> -   /* Switch CFUN to point to FN.  */
> -   push_cfun (DECL_STRUCT_FUNCTION (fn));
> -
>     /* When GIMPLE is lowered, the variables are no longer available in
>        BIND_EXPRs, so display them separately.  */
> !   if (cfun && cfun->decl == fn && (cfun->curr_properties & PROP_gimple_lcf))
>       {
>         unsigned ix;
>         ignore_topmost_bind = true;
>
>         fprintf (file, "{\n");
> !       if (!VEC_empty (tree, cfun->local_decls))
> !       FOR_EACH_LOCAL_DECL (cfun, ix, var)
>           {
>             print_generic_decl (file, var, flags);
>             if (flags & TDF_VERBOSE)
> --- 6661,6688 ----
>     fprintf (file, ")\n");
>
>     if (flags & TDF_VERBOSE)
> !     print_node (file, "", fndecl, 2);
>
> !   dsf = DECL_STRUCT_FUNCTION (fndecl);
>     if (dsf && (flags & TDF_EH))
>       dump_eh_tree (file, dsf);
>
> !   if (flags & TDF_RAW && !gimple_has_body_p (fndecl))
>       {
> !       dump_node (fndecl, TDF_SLIM | flags, file);
>         return;

^^^^

and maybe other early exits from dump_function_to_file.

Also as said on IRC when you switch current_function_decl you should be
able to set cfun to NULL (and restore it afterwards, without invoking the
target hook for cfun switching).  Thus, encapsulating this into a
push/pop_current_function_decl would be nice.

Thanks,
Richard.

Reply via email to