public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-3397] c/107305 - avoid ICEing with invalid GIMPLE input to the GIMPLE FE
@ 2022-10-20  9:29 Richard Biener
  0 siblings, 0 replies; only message in thread
From: Richard Biener @ 2022-10-20  9:29 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:8e2b5cf7cde999582d1b8fff021faa487c8e34b0

commit r13-3397-g8e2b5cf7cde999582d1b8fff021faa487c8e34b0
Author: Richard Biener <rguenther@suse.de>
Date:   Wed Oct 19 14:12:11 2022 +0200

    c/107305 - avoid ICEing with invalid GIMPLE input to the GIMPLE FE
    
    The GIMPLE FE was designed to defer semantic error checking to the
    GIMPLE IL verifier.  But that can end up causing spurious ICEs
    earlier and in fact it will report an internal error.  The following
    tries to improve the situation by explicitely calling into the
    verifier from the parser and intructing it to not ICE but instead
    zap the parsed body after an error is discovered.
    
            PR c/107305
            PR c/107306
    gcc/c/
            * gimple-parser.cc (c_parser_parse_gimple_body): Verify
            the parsed IL and zap the body on error.
    
    gcc/
            * tree-cfg.h (verify_gimple_in_seq): Add parameter to
            indicate whether to emit an ICE.  Add return value.
            (verify_gimple_in_cfg): Likewise.
            * tree-cfg.cc (verify_gimple_in_seq): Likewise.
            (verify_gimple_in_cfg): Likewise.
    
    gcc/testsuite/
            * gcc.dg/gimplefe-error-15.c: New testcase.

Diff:
---
 gcc/c/gimple-parser.cc                   | 10 ++++++++++
 gcc/testsuite/gcc.dg/gimplefe-error-15.c | 13 +++++++++++++
 gcc/tree-cfg.cc                          | 16 ++++++++++------
 gcc/tree-cfg.h                           |  4 ++--
 4 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/gcc/c/gimple-parser.cc b/gcc/c/gimple-parser.cc
index 5a2da2cfa0e..18ed4d4236d 100644
--- a/gcc/c/gimple-parser.cc
+++ b/gcc/c/gimple-parser.cc
@@ -364,6 +364,16 @@ c_parser_parse_gimple_body (c_parser *cparser, char *gimple_pass,
       cgraph_node::get_create (cfun->decl);
       cgraph_edge::rebuild_edges ();
     }
+
+  /* Perform IL validation and if any error is found abort compilation
+     of this function by zapping its body.  */
+  if ((cfun->curr_properties & PROP_cfg)
+      && verify_gimple_in_cfg (cfun, false, false))
+    init_empty_tree_cfg ();
+  else if (!(cfun->curr_properties & PROP_cfg)
+	   && verify_gimple_in_seq (gimple_body (current_function_decl), false))
+    gimple_set_body (current_function_decl, NULL);
+
   dump_function (TDI_gimple, current_function_decl);
 }
 
diff --git a/gcc/testsuite/gcc.dg/gimplefe-error-15.c b/gcc/testsuite/gcc.dg/gimplefe-error-15.c
new file mode 100644
index 00000000000..066cd845d31
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gimplefe-error-15.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-fgimple" } */
+
+unsigned a;
+static double *d;
+static _Bool b;
+__GIMPLE int
+foo (int n)
+{
+  b = __builtin_add_overflow (n, *d, &a);
+} /* { dg-error "invalid argument" } */
+
+/* { dg-message "" "" { target *-*-* } 0 } */
diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc
index 9b2c0f6956c..d982988048f 100644
--- a/gcc/tree-cfg.cc
+++ b/gcc/tree-cfg.cc
@@ -5300,13 +5300,15 @@ verify_gimple_transaction (gtransaction *stmt)
 
 /* Verify the GIMPLE statements inside the statement list STMTS.  */
 
-DEBUG_FUNCTION void
-verify_gimple_in_seq (gimple_seq stmts)
+DEBUG_FUNCTION bool
+verify_gimple_in_seq (gimple_seq stmts, bool ice)
 {
   timevar_push (TV_TREE_STMT_VERIFY);
-  if (verify_gimple_in_seq_2 (stmts))
+  bool res = verify_gimple_in_seq_2 (stmts);
+  if (res && ice)
     internal_error ("%<verify_gimple%> failed");
   timevar_pop (TV_TREE_STMT_VERIFY);
+  return res;
 }
 
 /* Return true when the T can be shared.  */
@@ -5496,8 +5498,8 @@ collect_subblocks (hash_set<tree> *blocks, tree block)
 
 /* Verify the GIMPLE statements in the CFG of FN.  */
 
-DEBUG_FUNCTION void
-verify_gimple_in_cfg (struct function *fn, bool verify_nothrow)
+DEBUG_FUNCTION bool
+verify_gimple_in_cfg (struct function *fn, bool verify_nothrow, bool ice)
 {
   basic_block bb;
   bool err = false;
@@ -5652,11 +5654,13 @@ verify_gimple_in_cfg (struct function *fn, bool verify_nothrow)
     eh_table->traverse<hash_set<gimple *> *, verify_eh_throw_stmt_node>
       (&visited_throwing_stmts);
 
-  if (err || eh_error_found)
+  if (ice && (err || eh_error_found))
     internal_error ("verify_gimple failed");
 
   verify_histograms ();
   timevar_pop (TV_TREE_STMT_VERIFY);
+
+  return (err || eh_error_found);
 }
 
 
diff --git a/gcc/tree-cfg.h b/gcc/tree-cfg.h
index 95ec93e3a91..8c22c3dbbe3 100644
--- a/gcc/tree-cfg.h
+++ b/gcc/tree-cfg.h
@@ -63,8 +63,8 @@ extern gphi *get_virtual_phi (basic_block);
 extern gimple *first_stmt (basic_block);
 extern gimple *last_stmt (basic_block);
 extern gimple *last_and_only_stmt (basic_block);
-extern void verify_gimple_in_seq (gimple_seq);
-extern void verify_gimple_in_cfg (struct function *, bool);
+extern bool verify_gimple_in_seq (gimple_seq, bool = true);
+extern bool verify_gimple_in_cfg (struct function *, bool, bool = true);
 extern tree gimple_block_label (basic_block);
 extern void add_phi_args_after_copy_bb (basic_block);
 extern void add_phi_args_after_copy (basic_block *, unsigned, edge);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-10-20  9:29 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-20  9:29 [gcc r13-3397] c/107305 - avoid ICEing with invalid GIMPLE input to the GIMPLE FE Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).