https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97106

--- Comment #4 from Tom de Vries <vries at gcc dot gnu.org> ---
This:
...
$ cat alias.c
void __f ()
{
  __builtin_printf ("hello\n");
}

void f () __attribute__ ((alias ("__f")));

int
main (void)
{
  f ();
  return 0;
}
...
works fine at -O0 and -O1:
...
$ ./gcc.sh -O0 ./alias.c
$ ./install/bin/nvptx-none-run a.out
hello
$ ./gcc.sh -O1 ./alias.c
$ ./install/bin/nvptx-none-run a.out
hello
...
but at -O2 we have:
...
$ ./gcc.sh -O2 ./alias.c
$ ./install/bin/nvptx-none-run a.out
fatal   : Internal error: reference to deleted section
nvptx-run: cuLinkComplete failed: unknown error (CUDA_ERROR_UNKNOWN, 999)
...

This seems to be due to f/__f being inlined into main, after which we have an
alias declaration which is unused:
...
.visible .func f;
.alias f,__f;
...
Removing these two lines make the executable run fine again.

Note: same thing when using nvptx-none-run -O0.

Fixed by:
...
diff --git a/gcc/config/nvptx/nvptx.cc b/gcc/config/nvptx/nvptx.cc
index ab1f62359d4b..3e51bf15776c 100644
--- a/gcc/config/nvptx/nvptx.cc
+++ b/gcc/config/nvptx/nvptx.cc
@@ -77,6 +77,7 @@
 #include "opts.h"
 #include "tree-pretty-print.h"
 #include "rtl-iter.h"
+#include "cgraph.h"

 /* This file should be included last.  */
 #include "target-def.h"
@@ -7396,6 +7397,10 @@ nvptx_mem_local_p (rtx mem)
 void
 nvptx_asm_output_def_from_decls (FILE *stream, tree name, tree value)
 {
+  if (!cgraph_node::get (name)->referred_to_p ())
+    /* Prevent "Internal error: reference to deleted section".  */
+    return;
+
   std::stringstream s;
   write_fn_proto (s, false, get_fnname_from_decl (name), name);
   fputs (s.str().c_str(), stream);
...

Reply via email to