Commit b0aba46c by Tom de Vries Committed by Tom de Vries

[offloading] Error on missing symbols

When compiling an OpenMP or OpenACC program containing a reference in the
offloaded code to a symbol that has not been included in the offloaded code,
the offloading compiler may ICE in lto1.

Fix this by erroring out instead, mentioning the problematic symbol:
...
error: variable 'var' has been referenced in offloaded code but hasn't
  been marked to be included in the offloaded code
lto1: fatal error: errors during merging of translation units
compilation terminated.
...

Build x86_64 with nvptx accelerator and reg-tested libgomp.

Build x86_64 and reg-tested libgomp.

2018-12-14  Tom de Vries  <tdevries@suse.de>

	* lto-cgraph.c (verify_node_partition): New function.
	(input_overwrite_node, input_varpool_node): Use verify_node_partition.

	* testsuite/libgomp.c-c++-common/function-not-offloaded-aux.c: New test.
	* testsuite/libgomp.c-c++-common/function-not-offloaded.c: New test.
	* testsuite/libgomp.c-c++-common/variable-not-offloaded.c: New test.
	* testsuite/libgomp.oacc-c-c++-common/function-not-offloaded.c: New test.
	* testsuite/libgomp.oacc-c-c++-common/variable-not-offloaded.c: New test.

From-SVN: r267134
parent 4f472e63
2018-12-14 Tom de Vries <tdevries@suse.de>
* lto-cgraph.c (verify_node_partition): New function.
(input_overwrite_node, input_varpool_node): Use verify_node_partition.
2018-12-14 H.J. Lu <hongjiu.lu@intel.com> 2018-12-14 H.J. Lu <hongjiu.lu@intel.com>
PR target/88483 PR target/88483
...@@ -1091,6 +1091,36 @@ output_offload_tables (void) ...@@ -1091,6 +1091,36 @@ output_offload_tables (void)
} }
} }
/* Verify the partitioning of NODE. */
static inline void
verify_node_partition (symtab_node *node)
{
if (flag_ltrans)
return;
#ifdef ACCEL_COMPILER
if (node->in_other_partition)
{
if (TREE_CODE (node->decl) == FUNCTION_DECL)
error_at (DECL_SOURCE_LOCATION (node->decl),
"function %qs has been referenced in offloaded code but"
" hasn%'t been marked to be included in the offloaded code",
node->name ());
else if (VAR_P (node->decl))
error_at (DECL_SOURCE_LOCATION (node->decl),
"variable %qs has been referenced in offloaded code but"
" hasn%'t been marked to be included in the offloaded code",
node->name ());
else
gcc_unreachable ();
}
#else
gcc_assert (!node->in_other_partition
&& !node->used_from_other_partition);
#endif
}
/* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS, /* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS,
STACK_SIZE, SELF_TIME and SELF_SIZE. This is called either to initialize STACK_SIZE, SELF_TIME and SELF_SIZE. This is called either to initialize
NODE or to replace the values in it, for instance because the first NODE or to replace the values in it, for instance because the first
...@@ -1153,9 +1183,7 @@ input_overwrite_node (struct lto_file_decl_data *file_data, ...@@ -1153,9 +1183,7 @@ input_overwrite_node (struct lto_file_decl_data *file_data,
node->resolution = bp_unpack_enum (bp, ld_plugin_symbol_resolution, node->resolution = bp_unpack_enum (bp, ld_plugin_symbol_resolution,
LDPR_NUM_KNOWN); LDPR_NUM_KNOWN);
node->split_part = bp_unpack_value (bp, 1); node->split_part = bp_unpack_value (bp, 1);
gcc_assert (flag_ltrans verify_node_partition (node);
|| (!node->in_other_partition
&& !node->used_from_other_partition));
} }
/* Return string alias is alias of. */ /* Return string alias is alias of. */
...@@ -1366,10 +1394,7 @@ input_varpool_node (struct lto_file_decl_data *file_data, ...@@ -1366,10 +1394,7 @@ input_varpool_node (struct lto_file_decl_data *file_data,
node->set_section_for_node (section); node->set_section_for_node (section);
node->resolution = streamer_read_enum (ib, ld_plugin_symbol_resolution, node->resolution = streamer_read_enum (ib, ld_plugin_symbol_resolution,
LDPR_NUM_KNOWN); LDPR_NUM_KNOWN);
gcc_assert (flag_ltrans verify_node_partition (node);
|| (!node->in_other_partition
&& !node->used_from_other_partition));
return node; return node;
} }
......
2018-12-14 Tom de Vries <tdevries@suse.de>
* testsuite/libgomp.c-c++-common/function-not-offloaded-aux.c: New test.
* testsuite/libgomp.c-c++-common/function-not-offloaded.c: New test.
* testsuite/libgomp.c-c++-common/variable-not-offloaded.c: New test.
* testsuite/libgomp.oacc-c-c++-common/function-not-offloaded.c: New test.
* testsuite/libgomp.oacc-c-c++-common/variable-not-offloaded.c: New test.
2018-12-13 Tom de Vries <tdevries@suse.de> 2018-12-13 Tom de Vries <tdevries@suse.de>
* affinity-fmt.c (gomp_print_string): New function, factored out of ... * affinity-fmt.c (gomp_print_string): New function, factored out of ...
......
/* { dg-skip-if "" { *-*-* } } */
#pragma omp declare target
extern int var;
#pragma omp end declare target
void __attribute__((noinline, noclone))
foo (void)
{
var++;
}
/* { dg-do link } */
/* { dg-excess-errors "unresolved symbol foo, lto1, mkoffload and lto-wrapper fatal errors" { target offload_device_nonshared_as } } */
/* { dg-additional-sources "function-not-offloaded-aux.c" } */
#pragma omp declare target
int var;
#pragma omp end declare target
extern void foo ();
int
main ()
{
#pragma omp target
foo ();
}
/* { dg-do link } */
/* { dg-excess-errors "lto1, mkoffload and lto-wrapper fatal errors" { target offload_device_nonshared_as } } */
int var; /* { dg-error "variable 'var' has been referenced in offloaded code but hasn't been marked to be included in the offloaded code" "" { target offload_device_nonshared_as } } */
#pragma omp declare target
void __attribute__((noinline, noclone))
foo (void)
{
var++;
}
#pragma omp end declare target
int
main ()
{
#pragma omp target
foo ();
}
/* { dg-do link } */
/* { dg-excess-errors "lto1, mkoffload and lto-wrapper fatal errors" { target openacc_nvidia_accel_configured } } */
int var;
#pragma acc declare create (var)
void __attribute__((noinline, noclone))
foo () /* { dg-error "function 'foo' has been referenced in offloaded code but hasn't been marked to be included in the offloaded code" "" { target openacc_nvidia_accel_configured } } */
{
var++;
}
int
main ()
{
#pragma acc parallel
foo ();
}
/* { dg-do link } */
int var; /* { dg-error "'var' requires a 'declare' directive for use in a 'routine' function" } */
#pragma acc routine
void __attribute__((noinline, noclone))
foo (void)
{
var++;
}
int
main ()
{
#pragma acc parallel
foo ();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment