re PR target/87414 (-mindirect-branch=thunk produces thunk with incorrect CFI on...
authorJakub Jelinek <jakub@redhat.com>
Wed, 26 Sep 2018 17:00:49 +0000 (19:00 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 26 Sep 2018 17:00:49 +0000 (19:00 +0200)
PR target/87414
* config/i386/i386.c: Include debug.h and dwarf2out.h.
(output_indirect_thunk): Emit DW_CFA_def_cfa_offset after the
call.

From-SVN: r264651

gcc/ChangeLog
gcc/config/i386/i386.c

index c77532799b1b997d382385fade6b95a5571e3dad..e134f91d2ba96c7412aa0f118c223ea8b7216f6e 100644 (file)
@@ -1,3 +1,10 @@
+2018-09-26  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/87414
+       * config/i386/i386.c: Include debug.h and dwarf2out.h.
+       (output_indirect_thunk): Emit DW_CFA_def_cfa_offset after the
+       call.
+
 2018-09-25  Andrew Stubbs  <ams@codesourcery.com>
 
        * builtins.c (get_builtin_sync_mem): Force address mode conversion.
index a79cfb5f0e29bb530747f871e9e2db16890ce185..ef72219f16574b6c6ae344481a1ab7a7aa555195 100644 (file)
@@ -89,6 +89,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "ipa-fnsummary.h"
 #include "wide-int-bitmask.h"
 #include "tree-vector-builder.h"
+#include "debug.h"
+#include "dwarf2out.h"
 
 /* This file should be included last.  */
 #include "target-def.h"
@@ -10470,6 +10472,23 @@ output_indirect_thunk (unsigned int regno)
 
   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2);
 
+  /* The above call insn pushed a word to stack.  Adjust CFI info.  */
+  if (flag_asynchronous_unwind_tables && dwarf2out_do_frame ())
+    {
+      if (! dwarf2out_do_cfi_asm ())
+       {
+         dw_cfi_ref xcfi = ggc_cleared_alloc<dw_cfi_node> ();
+         xcfi->dw_cfi_opc = DW_CFA_advance_loc4;
+         xcfi->dw_cfi_oprnd1.dw_cfi_addr = ggc_strdup (indirectlabel2);
+         vec_safe_push (cfun->fde->dw_fde_cfi, xcfi);
+       }
+      dw_cfi_ref xcfi = ggc_cleared_alloc<dw_cfi_node> ();
+      xcfi->dw_cfi_opc = DW_CFA_def_cfa_offset;
+      xcfi->dw_cfi_oprnd1.dw_cfi_offset = 2 * UNITS_PER_WORD;
+      vec_safe_push (cfun->fde->dw_fde_cfi, xcfi);
+      dwarf2out_emit_cfi (xcfi);
+    }
+
   if (regno != INVALID_REGNUM)
     {
       /* MOV.  */