diff mbox series

[committed] analyzer: fix ICE when DECL_INITIAL is error_mark_node [PR98580]

Message ID 20210107204804.3225215-1-dmalcolm@redhat.com
State New
Headers show
Series [committed] analyzer: fix ICE when DECL_INITIAL is error_mark_node [PR98580] | expand

Commit Message

David Malcolm Jan. 7, 2021, 8:48 p.m. UTC
lto-streamer-out.c's get_symbol_initial_value can return error_mark_node
rather than DECL_INITIAL as an optimization to avoid extra sections for
simple scalar values.

Add a check to the analyzer to handle such cases gracefully.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to master as r11-6527-g0677759f753d321bde52d7343227f842b7e759d2.

gcc/analyzer/ChangeLog:
	PR analyzer/98580
	* region.cc (decl_region::get_svalue_for_initializer): Gracefully
	handle when LTO writes out DECL_INITIAL as error_mark_node.

gcc/testsuite/ChangeLog:
	PR analyzer/98580
	* gcc.dg/analyzer/pr98580-a.c: New test.
	* gcc.dg/analyzer/pr98580-b.c: New test.
---
 gcc/analyzer/region.cc                    | 5 +++++
 gcc/testsuite/gcc.dg/analyzer/pr98580-a.c | 9 +++++++++
 gcc/testsuite/gcc.dg/analyzer/pr98580-b.c | 2 ++
 3 files changed, 16 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/analyzer/pr98580-a.c
 create mode 100644 gcc/testsuite/gcc.dg/analyzer/pr98580-b.c
diff mbox series

Patch

diff --git a/gcc/analyzer/region.cc b/gcc/analyzer/region.cc
index aefc389edd3..6db1fc91afd 100644
--- a/gcc/analyzer/region.cc
+++ b/gcc/analyzer/region.cc
@@ -969,6 +969,11 @@  decl_region::get_svalue_for_initializer (region_model_manager *mgr) const
 						 c.get_map ());
     }
 
+  /* LTO can write out error_mark_node as the DECL_INITIAL for simple scalar
+     values (to avoid writing out an extra section).  */
+  if (init == error_mark_node)
+    return NULL;
+
   if (TREE_CODE (init) == CONSTRUCTOR)
     return get_svalue_for_constructor (init, mgr);
 
diff --git a/gcc/testsuite/gcc.dg/analyzer/pr98580-a.c b/gcc/testsuite/gcc.dg/analyzer/pr98580-a.c
new file mode 100644
index 00000000000..d2b10d6df2f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/analyzer/pr98580-a.c
@@ -0,0 +1,9 @@ 
+/* { dg-do link } */
+/* { dg-require-effective-target lto } */
+/* { dg-additional-options "-flto" } */
+/* { dg-additional-sources pr98580-b.c } */
+
+int a;
+int *p = &a;
+int foo();
+int main() { return foo(); }
diff --git a/gcc/testsuite/gcc.dg/analyzer/pr98580-b.c b/gcc/testsuite/gcc.dg/analyzer/pr98580-b.c
new file mode 100644
index 00000000000..629ebcec3c8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/analyzer/pr98580-b.c
@@ -0,0 +1,2 @@ 
+extern int *p;
+int foo() { return *p; }