diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/lto-streamer-in.c | 9 |
2 files changed, 12 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1fe28e52da5..b7548b91ba4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2010-02-05 Richard Guenther <rguenther@suse.de> + PR lto/42762 + * lto-streamer-in.c (get_resolution): Deal with references + to undefined functions. + +2010-02-05 Richard Guenther <rguenther@suse.de> + * tree-ssa-ccp.c (get_symbol_constant_value): Strip all conversions. (fold_const_aggregate_ref): Likewise. diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index e41917702f1..095591484db 100644 --- a/gcc/lto-streamer-in.c +++ b/gcc/lto-streamer-in.c @@ -1515,12 +1515,15 @@ get_resolution (struct data_in *data_in, unsigned index) if (data_in->globals_resolution) { ld_plugin_symbol_resolution_t ret; - gcc_assert (index < VEC_length (ld_plugin_symbol_resolution_t, - data_in->globals_resolution)); + /* We can have references to not emitted functions in + DECL_FUNCTION_PERSONALITY at least. So we can and have + to indeed return LDPR_UNKNOWN in some cases. */ + if (VEC_length (ld_plugin_symbol_resolution_t, + data_in->globals_resolution) <= index) + return LDPR_UNKNOWN; ret = VEC_index (ld_plugin_symbol_resolution_t, data_in->globals_resolution, index); - gcc_assert (ret != LDPR_UNKNOWN); return ret; } else |