Fix sigsegv on -fdump-tree-all-enumerate_locals

Message ID 20180706133026.7ue6songbxnx3i3m@delia
State New
Headers show
Series
  • Fix sigsegv on -fdump-tree-all-enumerate_locals
Related show

Commit Message

Tom de Vries July 6, 2018, 1:30 p.m.
Hi,

this patch fixes a sigsegv when using -fdump-tree-all-enumerate_locals, by
handling cfun->cfg == NULL conservatively in dump_enumerated_decls.

OK for trunk?

Thanks,
- Tom

Fix sigsegv on -fdump-tree-all-enumerate_locals

2018-07-06  Tom de Vries  <tdevries@suse.de>

	* tree-dfa.c (dump_enumerated_decls): Handle cfun->cfg == NULL.

	* gcc.misc-tests/options.exp (check_for_all_options): Clean up dump
	files.
	(get_dump_flags): New proc.
	(toplevel): Test all dump flags.

---
 gcc/testsuite/gcc.misc-tests/options.exp | 38 ++++++++++++++++++++++++++++++++
 gcc/tree-dfa.c                           |  3 +++
 2 files changed, 41 insertions(+)

Comments

Richard Biener July 6, 2018, 2:41 p.m. | #1
On Fri, Jul 6, 2018 at 3:30 PM Tom de Vries <tdevries@suse.de> wrote:
>
> Hi,
>
> this patch fixes a sigsegv when using -fdump-tree-all-enumerate_locals, by
> handling cfun->cfg == NULL conservatively in dump_enumerated_decls.
>
> OK for trunk?

Ok for the tree-dfa.c part.

Richard.

> Thanks,
> - Tom
>
> Fix sigsegv on -fdump-tree-all-enumerate_locals
>
> 2018-07-06  Tom de Vries  <tdevries@suse.de>
>
>         * tree-dfa.c (dump_enumerated_decls): Handle cfun->cfg == NULL.
>
>         * gcc.misc-tests/options.exp (check_for_all_options): Clean up dump
>         files.
>         (get_dump_flags): New proc.
>         (toplevel): Test all dump flags.
>
> ---
>  gcc/testsuite/gcc.misc-tests/options.exp | 38 ++++++++++++++++++++++++++++++++
>  gcc/tree-dfa.c                           |  3 +++
>  2 files changed, 41 insertions(+)
>
> diff --git a/gcc/testsuite/gcc.misc-tests/options.exp b/gcc/testsuite/gcc.misc-tests/options.exp
> index 693b40df1fd..faeae705c08 100644
> --- a/gcc/testsuite/gcc.misc-tests/options.exp
> +++ b/gcc/testsuite/gcc.misc-tests/options.exp
> @@ -52,6 +52,10 @@ proc check_for_all_options {language gcc_options compiler_pattern as_pattern ld_
>      }
>      set gcc_output [gcc_target_compile $filename.c $filename.x executable $gcc_options]
>      remote_file build delete $filename.c $filename.x $filename.gcno
> +    set dumpfiles [glob -nocomplain $filename.c.*]
> +    foreach dumpfile $dumpfiles {
> +       remote_file build delete $dumpfile
> +    }
>
>      if {![regexp -- "/${compiler}(\\.exe)? -quiet.*$compiler_pattern" $gcc_output]} {
>         fail "$test (compiler options)"
> @@ -70,4 +74,38 @@ proc check_for_all_options {language gcc_options compiler_pattern as_pattern ld_
>
>  check_for_all_options c {--coverage} {-fprofile-arcs -ftest-coverage} {} {-lgcov}
>
> +proc get_dump_flags {} {
> +    set res [list]
> +
> +    global srcdir
> +    set file "$srcdir/../dumpfile.c"
> +
> +    set a [open $file]
> +    set lines [split [read $a] "\n"]
> +    close $a
> +
> +    set domatch 0
> +    foreach line $lines {
> +       if { [regexp "dump_options.* =" $line] } {
> +           set domatch 1
> +       } elseif { [regexp "^\};" $line] } {
> +           set domatch 0
> +       }
> +       if { $domatch } {
> +           if { [regexp "\"(.*)\"" $line match submatch] } {
> +               lappend res $submatch
> +           }
> +       }
> +    }
> +
> +    return $res
> +}
> +
> +foreach flag [get_dump_flags] {
> +    check_for_all_options c -fdump-tree-all-$flag {} {} {}
> +    check_for_all_options c -fdump-ipa-all-$flag {} {} {}
> +    check_for_all_options c -fdump-rtl-all-$flag {} {} {}
> +    check_for_all_options c -fdump-lang-all-$flag {} {} {}
> +}
> +
>  gcc_parallel_test_enable 1
> diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
> index 00aa75f47ab..ee2ff2958db 100644
> --- a/gcc/tree-dfa.c
> +++ b/gcc/tree-dfa.c
> @@ -992,6 +992,9 @@ dump_enumerated_decls_push (tree *tp, int *walk_subtrees, void *data)
>  void
>  dump_enumerated_decls (FILE *file, dump_flags_t flags)
>  {
> +  if (!cfun->cfg)
> +    return;
> +
>    basic_block bb;
>    struct walk_stmt_info wi;
>    auto_vec<numbered_tree, 40> decl_list;
Jeff Law July 6, 2018, 3:07 p.m. | #2
On 07/06/2018 08:41 AM, Richard Biener wrote:
> On Fri, Jul 6, 2018 at 3:30 PM Tom de Vries <tdevries@suse.de> wrote:
>>
>> Hi,
>>
>> this patch fixes a sigsegv when using -fdump-tree-all-enumerate_locals, by
>> handling cfun->cfg == NULL conservatively in dump_enumerated_decls.
>>
>> OK for trunk?
> 
> Ok for the tree-dfa.c part.
OK on the testsuite part.

jeff

Patch

diff --git a/gcc/testsuite/gcc.misc-tests/options.exp b/gcc/testsuite/gcc.misc-tests/options.exp
index 693b40df1fd..faeae705c08 100644
--- a/gcc/testsuite/gcc.misc-tests/options.exp
+++ b/gcc/testsuite/gcc.misc-tests/options.exp
@@ -52,6 +52,10 @@  proc check_for_all_options {language gcc_options compiler_pattern as_pattern ld_
     }
     set gcc_output [gcc_target_compile $filename.c $filename.x executable $gcc_options]
     remote_file build delete $filename.c $filename.x $filename.gcno
+    set dumpfiles [glob -nocomplain $filename.c.*]
+    foreach dumpfile $dumpfiles {
+	remote_file build delete $dumpfile
+    }   
 
     if {![regexp -- "/${compiler}(\\.exe)? -quiet.*$compiler_pattern" $gcc_output]} {
 	fail "$test (compiler options)"
@@ -70,4 +74,38 @@  proc check_for_all_options {language gcc_options compiler_pattern as_pattern ld_
 
 check_for_all_options c {--coverage} {-fprofile-arcs -ftest-coverage} {} {-lgcov}
 
+proc get_dump_flags {} {
+    set res [list]
+
+    global srcdir
+    set file "$srcdir/../dumpfile.c"
+    
+    set a [open $file]
+    set lines [split [read $a] "\n"]
+    close $a
+
+    set domatch 0
+    foreach line $lines {
+	if { [regexp "dump_options.* =" $line] } {
+	    set domatch 1
+	} elseif { [regexp "^\};" $line] } {
+	    set domatch 0
+	}
+	if { $domatch } {
+	    if { [regexp "\"(.*)\"" $line match submatch] } {
+		lappend res $submatch
+	    }
+	}
+    }
+
+    return $res
+}
+
+foreach flag [get_dump_flags] {
+    check_for_all_options c -fdump-tree-all-$flag {} {} {}
+    check_for_all_options c -fdump-ipa-all-$flag {} {} {}
+    check_for_all_options c -fdump-rtl-all-$flag {} {} {}
+    check_for_all_options c -fdump-lang-all-$flag {} {} {}
+}
+
 gcc_parallel_test_enable 1
diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
index 00aa75f47ab..ee2ff2958db 100644
--- a/gcc/tree-dfa.c
+++ b/gcc/tree-dfa.c
@@ -992,6 +992,9 @@  dump_enumerated_decls_push (tree *tp, int *walk_subtrees, void *data)
 void
 dump_enumerated_decls (FILE *file, dump_flags_t flags)
 {
+  if (!cfun->cfg)
+    return;
+
   basic_block bb;
   struct walk_stmt_info wi;
   auto_vec<numbered_tree, 40> decl_list;