Trampolines work just fine on GCN3 devices, but GCN5 devices have execute permission hardware, and the driver sets permission off for the private segment allocation in which the stacks are located.

It may be possible to implement indirect calls to nested functions another way, but for now this will prevent unexplained crashes or hangs on unsupported devices.

--
Andrew Stubbs
Mentor Graphics / CodeSourcery
Fix trampoline execution failures on GCN5.

2019-05-22  Andrew Stubbs  <a...@codesourcery.com>

	gcc/
	* config/gcn/gcn.c (gcn_trampoline_init): Call "sorry" on GCN5.

diff --git a/gcc/config/gcn/gcn.c b/gcc/config/gcn/gcn.c
index 1dd2ff2d4f0..6820837c763 100644
--- a/gcc/config/gcn/gcn.c
+++ b/gcc/config/gcn/gcn.c
@@ -3062,6 +3062,10 @@ gcn_asm_trampoline_template (FILE *f)
 static void
 gcn_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
 {
+  if (TARGET_GCN5_PLUS)
+    sorry ("nested function trampolines not supported on GCN5 due to"
+           " non-executable stacks");
+
   emit_block_move (m_tramp, assemble_trampoline_template (),
 		   GEN_INT (TRAMPOLINE_SIZE), BLOCK_OP_NORMAL);
 

Reply via email to