From: Jakub Jelinek Date: Wed, 26 Sep 2018 17:00:49 +0000 (+0200) Subject: re PR target/87414 (-mindirect-branch=thunk produces thunk with incorrect CFI on... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0974b794c104f403c335a7e6b2376b487ab17659;p=gcc.git re PR target/87414 (-mindirect-branch=thunk produces thunk with incorrect CFI on x86_64) 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c77532799b1..e134f91d2ba 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-09-26 Jakub Jelinek + + 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 * builtins.c (get_builtin_sync_mem): Force address mode conversion. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index a79cfb5f0e2..ef72219f165 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -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 (); + 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 (); + 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. */