diff options
author | David Malcolm <dmalcolm@redhat.com> | 2021-01-07 15:45:29 -0500 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2021-01-07 15:45:29 -0500 |
commit | 0677759f753d321bde52d7343227f842b7e759d2 (patch) | |
tree | a5bc16fb608f00a04d1ce29219a08454ba454340 | |
parent | b87ec922c4090fcacf802c73b6bfd59a8632f8a5 (diff) | |
download | gcc-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.cc | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/pr98580-a.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/pr98580-b.c | 2 |
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; } |