Patchwork Call free_after_parsing earlier

login
register
mail settings
Submitter Steven Bosscher
Date July 13, 2012, 2:33 p.m.
Message ID <CABu31nMC-B7zi8atdudejdnCCdYbxiGf=8tm=Oxu8G32Eaif7w@mail.gmail.com>
Download mbox | patch
Permalink /patch/170903/
State New
Headers show

Comments

Steven Bosscher - July 13, 2012, 2:33 p.m.
On Thu, Jul 12, 2012 at 9:21 AM, Richard Guenther
<richard.guenther@gmail.com> wrote:
> On Wed, Jul 11, 2012 at 9:39 PM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
>> Hello,
>>
>> GCC calls free_after_parsing in rest_of_clean_state.
>> That's way too late, it can be done in free_lang_data_in_cgraph instead.
>
> But that's only called with -flto ... I think it should be called in
> cgraph_finalize_function instead (being optimistic here - heh).

Quite optimistic, indeed...

I choose for free_lang_data_in_cgraph (which, BTW, doesn't belong in
tree.c, but that aside) because I thought the C++ front end might need
its function->language after cgraph_finalize_function. And indeed
so...

Ciao!
Steven


$ cat t.C
#line 14971 "configure"
struct S { ~S(); };
void bar();
void foo()
{
  S s;
  bar();
}

$ gdb --args ./cc1plus t.C
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu"...
Breakpoint 1 at 0x38a80b5: file ../../trunk/gcc/diagnostic.c, line 1011.
Breakpoint 2 at 0x38a7ed6: file ../../trunk/gcc/diagnostic.c, line 955.
Function "exit" not defined.
Make breakpoint pending on future shared library load? (y or [n])
[answered N; input not from terminal]
Function "abort" not defined.
Make breakpoint pending on future shared library load? (y or [n])
[answered N; input not from terminal]
(gdb) run
Starting program: /home/stevenb/devel/build-test/gcc/cc1plus t.C
 void foo()
Analyzing compilation unit

Program received signal SIGSEGV, Segmentation fault.
0x000000000096b93a in stmts_are_full_exprs_p () at
../../trunk/gcc/cp/semantics.c:370
370       return current_stmt_tree ()->stmts_are_full_exprs_p;
(gdb) bt
#0  0x000000000096b93a in stmts_are_full_exprs_p () at
../../trunk/gcc/cp/semantics.c:370
#1  0x0000000000b1f294 in cp_gimplify_expr (expr_p=0x7ffff7232a20,
pre_p=0x7fffffff97a8, post_p=0x7fffffff8ba8) at
../../trunk/gcc/cp/cp-gimplify.c:530
#2  0x000000000156fb44 in gimplify_expr (expr_p=0x7ffff7232a20,
pre_p=0x7fffffff97a8, post_p=0x7fffffff8ba8, gimple_test_f=0x155d16c
<is_gimple_stmt>, fallback=0)
    at ../../trunk/gcc/gimplify.c:7064
#3  0x0000000001563bb7 in gimplify_stmt (stmt_p=0x7ffff7232a20,
seq_p=0x7fffffff97a8) at ../../trunk/gcc/gimplify.c:5678
#4  0x0000000001562d43 in gimplify_cleanup_point_expr
(expr_p=0x7ffff7245ad8, pre_p=0x7fffffffb3b0) at
../../trunk/gcc/gimplify.c:5455
#5  0x0000000001572c33 in gimplify_expr (expr_p=0x7ffff7245ad8,
pre_p=0x7fffffffb3b0, post_p=0x7fffffff9998, gimple_test_f=0x155d16c
<is_gimple_stmt>, fallback=0)
    at ../../trunk/gcc/gimplify.c:7479
#6  0x0000000001563bb7 in gimplify_stmt (stmt_p=0x7ffff7245ad8,
seq_p=0x7fffffffb3b0) at ../../trunk/gcc/gimplify.c:5678
#7  0x0000000001543e69 in gimplify_statement_list
(expr_p=0x7fffffffb288, pre_p=0x7fffffffb3b0) at
../../trunk/gcc/gimplify.c:1527
#8  0x000000000157352f in gimplify_expr (expr_p=0x7fffffffb288,
pre_p=0x7fffffffb3b0, post_p=0x7fffffffa6e8, gimple_test_f=0x155d16c
<is_gimple_stmt>, fallback=0)
    at ../../trunk/gcc/gimplify.c:7531
#9  0x0000000001563bb7 in gimplify_stmt (stmt_p=0x7fffffffb288,
seq_p=0x7fffffffb3b0) at ../../trunk/gcc/gimplify.c:5678
#10 0x000000000153eb49 in gimplify_and_add (t=0x7ffff7247600,
seq_p=0x7fffffffb3b0) at ../../trunk/gcc/gimplify.c:358
#11 0x0000000001572a22 in gimplify_expr (expr_p=0x7ffff7245ac0,
pre_p=0x7fffffffcd40, post_p=0x7fffffffb3f8, gimple_test_f=0x155d16c
<is_gimple_stmt>, fallback=0)
    at ../../trunk/gcc/gimplify.c:7457
#12 0x0000000001563bb7 in gimplify_stmt (stmt_p=0x7ffff7245ac0,
seq_p=0x7fffffffcd40) at ../../trunk/gcc/gimplify.c:5678
#13 0x0000000001543e69 in gimplify_statement_list
(expr_p=0x7ffff724c098, pre_p=0x7fffffffcd40) at
../../trunk/gcc/gimplify.c:1527
#14 0x000000000157352f in gimplify_expr (expr_p=0x7ffff724c098,
pre_p=0x7fffffffcd40, post_p=0x7fffffffc148, gimple_test_f=0x155d16c
<is_gimple_stmt>, fallback=0)
    at ../../trunk/gcc/gimplify.c:7531
#15 0x0000000001563bb7 in gimplify_stmt (stmt_p=0x7ffff724c098,
seq_p=0x7fffffffcd40) at ../../trunk/gcc/gimplify.c:5678
#16 0x0000000001542106 in gimplify_bind_expr (expr_p=0x7ffff723c898,
pre_p=0x7fffffffdc80) at ../../trunk/gcc/gimplify.c:1220
#17 0x0000000001571446 in gimplify_expr (expr_p=0x7ffff723c898,
pre_p=0x7fffffffdc80, post_p=0x7fffffffd068, gimple_test_f=0x155d16c
<is_gimple_stmt>, fallback=0)
    at ../../trunk/gcc/gimplify.c:7316
#18 0x0000000001563bb7 in gimplify_stmt (stmt_p=0x7ffff723c898,
seq_p=0x7fffffffdc80) at ../../trunk/gcc/gimplify.c:5678
#19 0x0000000001577766 in gimplify_body (fndecl=0x7ffff723c800,
do_parms=1 '\001') at ../../trunk/gcc/gimplify.c:8177
#20 0x0000000001578d36 in gimplify_function_tree
(fndecl=0x7ffff723c800) at ../../trunk/gcc/gimplify.c:8311
#21 0x0000000000fc490c in cgraph_analyze_function
(node=0x7ffff70d5750) at ../../trunk/gcc/cgraphunit.c:658
#22 0x0000000000fc5c13 in cgraph_analyze_functions () at
../../trunk/gcc/cgraphunit.c:944
#23 0x0000000000fc9a19 in finalize_compilation_unit () at
../../trunk/gcc/cgraphunit.c:2092
#24 0x0000000000748909 in cp_write_global_declarations () at
../../trunk/gcc/cp/decl2.c:4024
#25 0x0000000001eace3e in compile_file () at ../../trunk/gcc/toplev.c:560
#26 0x0000000001eaecff in do_compile () at ../../trunk/gcc/toplev.c:1863
#27 0x0000000001eaee54 in toplev_main (argc=2, argv=0x7fffffffe2b8) at
../../trunk/gcc/toplev.c:1939
#28 0x00000000038889a1 in main (argc=2, argv=0x7fffffffe2b8) at
../../trunk/gcc/main.c:36
Richard Guenther - July 16, 2012, 9:07 a.m.
On Fri, Jul 13, 2012 at 4:33 PM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
> On Thu, Jul 12, 2012 at 9:21 AM, Richard Guenther
> <richard.guenther@gmail.com> wrote:
>> On Wed, Jul 11, 2012 at 9:39 PM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
>>> Hello,
>>>
>>> GCC calls free_after_parsing in rest_of_clean_state.
>>> That's way too late, it can be done in free_lang_data_in_cgraph instead.
>>
>> But that's only called with -flto ... I think it should be called in
>> cgraph_finalize_function instead (being optimistic here - heh).
>
> Quite optimistic, indeed...

;)

Btw, the

* final.c (final): Don't loop to find max_uid.

part is ok if you want to commit it separately.

> I choose for free_lang_data_in_cgraph (which, BTW, doesn't belong in
> tree.c, but that aside) because I thought the C++ front end might need
> its function->language after cgraph_finalize_function. And indeed
> so...

Ok, so how about doing it at the end of cgraph_analyze_function?

Thanks,
Richard.

> Ciao!
> Steven
>
>
> $ cat t.C
> #line 14971 "configure"
> struct S { ~S(); };
> void bar();
> void foo()
> {
>   S s;
>   bar();
> }
>
> $ gdb --args ./cc1plus t.C
> GNU gdb 6.8-debian
> Copyright (C) 2008 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "x86_64-linux-gnu"...
> Breakpoint 1 at 0x38a80b5: file ../../trunk/gcc/diagnostic.c, line 1011.
> Breakpoint 2 at 0x38a7ed6: file ../../trunk/gcc/diagnostic.c, line 955.
> Function "exit" not defined.
> Make breakpoint pending on future shared library load? (y or [n])
> [answered N; input not from terminal]
> Function "abort" not defined.
> Make breakpoint pending on future shared library load? (y or [n])
> [answered N; input not from terminal]
> (gdb) run
> Starting program: /home/stevenb/devel/build-test/gcc/cc1plus t.C
>  void foo()
> Analyzing compilation unit
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x000000000096b93a in stmts_are_full_exprs_p () at
> ../../trunk/gcc/cp/semantics.c:370
> 370       return current_stmt_tree ()->stmts_are_full_exprs_p;
> (gdb) bt
> #0  0x000000000096b93a in stmts_are_full_exprs_p () at
> ../../trunk/gcc/cp/semantics.c:370
> #1  0x0000000000b1f294 in cp_gimplify_expr (expr_p=0x7ffff7232a20,
> pre_p=0x7fffffff97a8, post_p=0x7fffffff8ba8) at
> ../../trunk/gcc/cp/cp-gimplify.c:530
> #2  0x000000000156fb44 in gimplify_expr (expr_p=0x7ffff7232a20,
> pre_p=0x7fffffff97a8, post_p=0x7fffffff8ba8, gimple_test_f=0x155d16c
> <is_gimple_stmt>, fallback=0)
>     at ../../trunk/gcc/gimplify.c:7064
> #3  0x0000000001563bb7 in gimplify_stmt (stmt_p=0x7ffff7232a20,
> seq_p=0x7fffffff97a8) at ../../trunk/gcc/gimplify.c:5678
> #4  0x0000000001562d43 in gimplify_cleanup_point_expr
> (expr_p=0x7ffff7245ad8, pre_p=0x7fffffffb3b0) at
> ../../trunk/gcc/gimplify.c:5455
> #5  0x0000000001572c33 in gimplify_expr (expr_p=0x7ffff7245ad8,
> pre_p=0x7fffffffb3b0, post_p=0x7fffffff9998, gimple_test_f=0x155d16c
> <is_gimple_stmt>, fallback=0)
>     at ../../trunk/gcc/gimplify.c:7479
> #6  0x0000000001563bb7 in gimplify_stmt (stmt_p=0x7ffff7245ad8,
> seq_p=0x7fffffffb3b0) at ../../trunk/gcc/gimplify.c:5678
> #7  0x0000000001543e69 in gimplify_statement_list
> (expr_p=0x7fffffffb288, pre_p=0x7fffffffb3b0) at
> ../../trunk/gcc/gimplify.c:1527
> #8  0x000000000157352f in gimplify_expr (expr_p=0x7fffffffb288,
> pre_p=0x7fffffffb3b0, post_p=0x7fffffffa6e8, gimple_test_f=0x155d16c
> <is_gimple_stmt>, fallback=0)
>     at ../../trunk/gcc/gimplify.c:7531
> #9  0x0000000001563bb7 in gimplify_stmt (stmt_p=0x7fffffffb288,
> seq_p=0x7fffffffb3b0) at ../../trunk/gcc/gimplify.c:5678
> #10 0x000000000153eb49 in gimplify_and_add (t=0x7ffff7247600,
> seq_p=0x7fffffffb3b0) at ../../trunk/gcc/gimplify.c:358
> #11 0x0000000001572a22 in gimplify_expr (expr_p=0x7ffff7245ac0,
> pre_p=0x7fffffffcd40, post_p=0x7fffffffb3f8, gimple_test_f=0x155d16c
> <is_gimple_stmt>, fallback=0)
>     at ../../trunk/gcc/gimplify.c:7457
> #12 0x0000000001563bb7 in gimplify_stmt (stmt_p=0x7ffff7245ac0,
> seq_p=0x7fffffffcd40) at ../../trunk/gcc/gimplify.c:5678
> #13 0x0000000001543e69 in gimplify_statement_list
> (expr_p=0x7ffff724c098, pre_p=0x7fffffffcd40) at
> ../../trunk/gcc/gimplify.c:1527
> #14 0x000000000157352f in gimplify_expr (expr_p=0x7ffff724c098,
> pre_p=0x7fffffffcd40, post_p=0x7fffffffc148, gimple_test_f=0x155d16c
> <is_gimple_stmt>, fallback=0)
>     at ../../trunk/gcc/gimplify.c:7531
> #15 0x0000000001563bb7 in gimplify_stmt (stmt_p=0x7ffff724c098,
> seq_p=0x7fffffffcd40) at ../../trunk/gcc/gimplify.c:5678
> #16 0x0000000001542106 in gimplify_bind_expr (expr_p=0x7ffff723c898,
> pre_p=0x7fffffffdc80) at ../../trunk/gcc/gimplify.c:1220
> #17 0x0000000001571446 in gimplify_expr (expr_p=0x7ffff723c898,
> pre_p=0x7fffffffdc80, post_p=0x7fffffffd068, gimple_test_f=0x155d16c
> <is_gimple_stmt>, fallback=0)
>     at ../../trunk/gcc/gimplify.c:7316
> #18 0x0000000001563bb7 in gimplify_stmt (stmt_p=0x7ffff723c898,
> seq_p=0x7fffffffdc80) at ../../trunk/gcc/gimplify.c:5678
> #19 0x0000000001577766 in gimplify_body (fndecl=0x7ffff723c800,
> do_parms=1 '\001') at ../../trunk/gcc/gimplify.c:8177
> #20 0x0000000001578d36 in gimplify_function_tree
> (fndecl=0x7ffff723c800) at ../../trunk/gcc/gimplify.c:8311
> #21 0x0000000000fc490c in cgraph_analyze_function
> (node=0x7ffff70d5750) at ../../trunk/gcc/cgraphunit.c:658
> #22 0x0000000000fc5c13 in cgraph_analyze_functions () at
> ../../trunk/gcc/cgraphunit.c:944
> #23 0x0000000000fc9a19 in finalize_compilation_unit () at
> ../../trunk/gcc/cgraphunit.c:2092
> #24 0x0000000000748909 in cp_write_global_declarations () at
> ../../trunk/gcc/cp/decl2.c:4024
> #25 0x0000000001eace3e in compile_file () at ../../trunk/gcc/toplev.c:560
> #26 0x0000000001eaecff in do_compile () at ../../trunk/gcc/toplev.c:1863
> #27 0x0000000001eaee54 in toplev_main (argc=2, argv=0x7fffffffe2b8) at
> ../../trunk/gcc/toplev.c:1939
> #28 0x00000000038889a1 in main (argc=2, argv=0x7fffffffe2b8) at
> ../../trunk/gcc/main.c:36
>
>
>
> Index: final.c
> ===================================================================
> --- final.c     (revision 189459)
> +++ final.c     (working copy)
> @@ -1826,7 +1826,6 @@ void
>  final (rtx first, FILE *file, int optimize_p)
>  {
>    rtx insn, next;
> -  int max_uid = 0;
>    int seen = 0;
>
>    /* Used for -dA dump.  */
> @@ -1837,11 +1836,9 @@ final (rtx first, FILE *file, int optimi
>
>    last_ignored_compare = 0;
>
> +#ifdef HAVE_cc0
>    for (insn = first; insn; insn = NEXT_INSN (insn))
>      {
> -      if (INSN_UID (insn) > max_uid)       /* Find largest UID.  */
> -       max_uid = INSN_UID (insn);
> -#ifdef HAVE_cc0
>        /* If CC tracking across branches is enabled, record the insn which
>          jumps to each branch only reached from one place.  */
>        if (optimize_p && JUMP_P (insn))
> @@ -1852,8 +1849,8 @@ final (rtx first, FILE *file, int optimi
>               LABEL_REFS (lab) = insn;
>             }
>         }
> -#endif
>      }
> +#endif
>
>    init_recog ();
>
> @@ -4500,7 +4497,6 @@ rest_of_clean_state (void)
>    init_recog_no_volatile ();
>
>    /* We're done with this function.  Free up memory if we can.  */
> -  free_after_parsing (cfun);
>    free_after_compilation (cfun);
>    return 0;
>  }
> Index: cgraphunit.c
> ===================================================================
> --- cgraphunit.c        (revision 189459)
> +++ cgraphunit.c        (working copy)
> @@ -404,6 +404,12 @@ cgraph_finalize_function (tree decl, boo
>  {
>    struct cgraph_node *node = cgraph_get_create_node (decl);
>
> +  /* The front end is done with this function.  Free up memory if we can.  */
> +  if (DECL_STRUCT_FUNCTION (decl))
> +    free_after_parsing (DECL_STRUCT_FUNCTION (decl));
> +
> +  /* If this node was finalized before, this must be a re-definition for
> +     an extern inline.  */
>    if (node->local.finalized)
>      {
>        cgraph_reset_node (node);

Patch

Index: final.c
===================================================================
--- final.c     (revision 189459)
+++ final.c     (working copy)
@@ -1826,7 +1826,6 @@  void
 final (rtx first, FILE *file, int optimize_p)
 {
   rtx insn, next;
-  int max_uid = 0;
   int seen = 0;

   /* Used for -dA dump.  */
@@ -1837,11 +1836,9 @@  final (rtx first, FILE *file, int optimi

   last_ignored_compare = 0;

+#ifdef HAVE_cc0
   for (insn = first; insn; insn = NEXT_INSN (insn))
     {
-      if (INSN_UID (insn) > max_uid)       /* Find largest UID.  */
-       max_uid = INSN_UID (insn);
-#ifdef HAVE_cc0
       /* If CC tracking across branches is enabled, record the insn which
         jumps to each branch only reached from one place.  */
       if (optimize_p && JUMP_P (insn))
@@ -1852,8 +1849,8 @@  final (rtx first, FILE *file, int optimi
              LABEL_REFS (lab) = insn;
            }
        }
-#endif
     }
+#endif

   init_recog ();

@@ -4500,7 +4497,6 @@  rest_of_clean_state (void)
   init_recog_no_volatile ();

   /* We're done with this function.  Free up memory if we can.  */
-  free_after_parsing (cfun);
   free_after_compilation (cfun);
   return 0;
 }
Index: cgraphunit.c
===================================================================
--- cgraphunit.c        (revision 189459)
+++ cgraphunit.c        (working copy)
@@ -404,6 +404,12 @@  cgraph_finalize_function (tree decl, boo
 {
   struct cgraph_node *node = cgraph_get_create_node (decl);

+  /* The front end is done with this function.  Free up memory if we can.  */
+  if (DECL_STRUCT_FUNCTION (decl))
+    free_after_parsing (DECL_STRUCT_FUNCTION (decl));
+
+  /* If this node was finalized before, this must be a re-definition for
+     an extern inline.  */
   if (node->local.finalized)
     {
       cgraph_reset_node (node);