Hi, I got an ICE while building libstdc++ of a cross compiler x86 to aarch64. I have a testcase that ICEs on current GCC trunk. I was trying to painfully reduce it with creduce, and it is still several thousand lines of c++. Frustrated that it does not reduce anymore, I decided to have a look with gdb at why the compiler was iceing: the code dereferences a NULL pointer that we get by looking up the value of a symbol in a map. Around that place, there is another pattern that first makes sure that the pointer we get from the map is non NULL: I copied that code around and that seemed to have solved the ICE.
Regtested on x86-64-linux, and also checked that my aarch64 cross compilers are now building correctly libstdc++. Ok to commit? Thanks, Sebastian >From f5934ecdee5d7e8e143310c21906d5099b9e7d23 Mon Sep 17 00:00:00 2001 From: Sebastian Pop <s....@samsung.com> Date: Wed, 17 Sep 2014 14:04:20 -0500 Subject: [PATCH] avoid dereferencing a NULL pointer 2014-09-17 Sebastian Pop <s....@samsung.com> * ipa-comdats.c (ipa_comdats): Check that the value in the map is non NULL before dereferencing it. --- gcc/ipa-comdats.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gcc/ipa-comdats.c b/gcc/ipa-comdats.c index b270d97..57e8239 100644 --- a/gcc/ipa-comdats.c +++ b/gcc/ipa-comdats.c @@ -317,7 +317,13 @@ ipa_comdats (void) && !symbol->alias && symbol->real_symbol_p ()) { - tree group = *map.get (symbol); + tree group = NULL; + /* Get current lattice value of SYMBOL. */ + tree *val = map.get (symbol); + if (val) + group = *val; + else + continue; if (group == error_mark_node) continue; -- 1.9.1