alpha.c (alpha_reorg): If trap is the last active insn in the function, emit NOP...
authorUros Bizjak <ubizjak@gmail.com>
Sun, 6 Aug 2017 15:48:37 +0000 (17:48 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Sun, 6 Aug 2017 15:48:37 +0000 (17:48 +0200)
* config/alpha/alpha.c (alpha_reorg): If trap is the last active
insn in the function, emit NOP after the insn.

From-SVN: r250901

gcc/ChangeLog
gcc/config/alpha/alpha.c

index 51ed7c9916231b39522bc6f07b9d2db86d911e2f..4ed00a29bb025f35ba63cb2b6a30b5018544713a 100644 (file)
@@ -1,3 +1,8 @@
+2017-08-06  Uros Bizjak  <ubizjak@gmail.com>
+
+       * config/alpha/alpha.c (alpha_reorg): If trap is the last active
+       insn in the function, emit NOP after the insn.
+
 2017-08-06  Tom de Vries  <tom@codesourcery.com>
 
        * omp-expand.c (expand_oacc_for): Add missing edge probability for tile
index 9f5dae290546e9c8550bf3411210dabf2c134459..341ec20d340f849edd129d64a59cc1bb023541e4 100644 (file)
@@ -9456,6 +9456,25 @@ And in the noreturn case:
 
   if (current_function_has_exception_handlers ())
     alpha_pad_function_end ();
+
+  /* CALL_PAL that implements trap insn, updates program counter to point
+     after the insn.  In case trap is the last insn in the function,
+     emit NOP to guarantee that PC remains inside function boundaries.
+     This workaround is needed to get reliable backtraces.  */
+  
+  rtx_insn *insn = prev_active_insn (get_last_insn ());
+
+  if (insn && NONJUMP_INSN_P (insn))
+    {
+      rtx pat = PATTERN (insn);
+      if (GET_CODE (pat) == PARALLEL)
+       {
+         rtx vec = XVECEXP (pat, 0, 0);
+         if (GET_CODE (vec) == TRAP_IF
+             && XEXP (vec, 0) == const1_rtx)
+           emit_insn_after (gen_unop (), insn);
+       }
+    }
 }
 \f
 static void