aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2021-01-07 15:45:29 -0500
committerDavid Malcolm <dmalcolm@redhat.com>2021-01-07 15:45:29 -0500
commit0677759f753d321bde52d7343227f842b7e759d2 (patch)
treea5bc16fb608f00a04d1ce29219a08454ba454340
parentb87ec922c4090fcacf802c73b6bfd59a8632f8a5 (diff)
downloadgcc-0677759f753d321bde52d7343227f842b7e759d2.zip
gcc-0677759f753d321bde52d7343227f842b7e759d2.tar.gz
gcc-0677759f753d321bde52d7343227f842b7e759d2.tar.bz2
analyzer: fix ICE when DECL_INITIAL is error_mark_node [PR98580]
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. 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.
-rw-r--r--gcc/analyzer/region.cc5
-rw-r--r--gcc/testsuite/gcc.dg/analyzer/pr98580-a.c9
-rw-r--r--gcc/testsuite/gcc.dg/analyzer/pr98580-b.c2
3 files changed, 16 insertions, 0 deletions
diff --git a/gcc/analyzer/region.cc b/gcc/analyzer/region.cc
index aefc389..6db1fc9 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 0000000..d2b10d6
--- /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 0000000..629ebce
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/analyzer/pr98580-b.c
@@ -0,0 +1,2 @@
+extern int *p;
+int foo() { return *p; }