Both OpenMP and OpenACC allow the user to call functions and access global variables. Usually, the user needs to explicitly mark those functions and variables as offloadable. However, for certain functions, such as those in libc, libm, etc., it makes sense to allow the user call functions and use variables that haven't been marked as offloadable. This patch teaches the lto streamer how to treat missing symbols as errors instead of assertion failures.
Is this patch OK for trunk and gcc6? Or should we keep the assertion failure when -fopenacc, -fopenmp, or -fopenmp-simd isn't set? This patch was originally posted last year: <https://gcc.gnu.org/ml/gcc-patches/2015-07/msg02076.html>. I was trying to avoid it for OpenACC, but making non-acc routine calls errors would complicate library functions. Cesar
2016-07-01 Cesar Philippidis <ce...@codesourcery.com> gcc/ * lto-cgraph.c (input_overwrite_node): Change the assertion to an error for missing symbols. (input_varpool_node): Likewise. diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index 5cef2ba..552ea6b 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -1201,9 +1201,11 @@ input_overwrite_node (struct lto_file_decl_data *file_data, LDPR_NUM_KNOWN); node->instrumentation_clone = bp_unpack_value (bp, 1); node->split_part = bp_unpack_value (bp, 1); - gcc_assert (flag_ltrans - || (!node->in_other_partition - && !node->used_from_other_partition)); + + int success = flag_ltrans || (!node->in_other_partition + && !node->used_from_other_partition); + if (!success) + error ("Missing %<%s%>", node->name ()); } /* Return string alias is alias of. */ @@ -1416,9 +1418,11 @@ input_varpool_node (struct lto_file_decl_data *file_data, node->set_section_for_node (section); node->resolution = streamer_read_enum (ib, ld_plugin_symbol_resolution, LDPR_NUM_KNOWN); - gcc_assert (flag_ltrans - || (!node->in_other_partition - && !node->used_from_other_partition)); + + int success = flag_ltrans || (!node->in_other_partition + && !node->used_from_other_partition); + if (!success) + error ("Missing %<%s%>", node->name ()); return node; }