[PATCH] PR debug/81570: dwarf2cfi.c: Update cfa.offset in create_pseudo_cfg

H.J. Lu hjl.tools@gmail.com
Tue Oct 31 18:00:00 GMT 2017


On Tue, Oct 24, 2017 at 8:26 PM, Jason Merrill <jason@redhat.com> wrote:
> On Thu, Jul 27, 2017 at 3:50 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>> execute_dwarf2_frame is called for each funtion.  But create_cie_data
>> is called only once to initialize cie_cfi_row for all functions.  Since
>> INCOMING_FRAME_SP_OFFSET may be different for each function, we can't
>> use the same INCOMING_FRAME_SP_OFFSET in cie_cfi_row for all functions.
>> This patch sets cie_cfi_row->cfa.offset to INCOMING_FRAME_SP_OFFSET in
>> create_pseudo_cfg which is called for each function.
>>
>> Tested on x86-64.  OK for trunk?
>
> This looks wrong.  cie_cfi_row is the state produced by the
> instructions in the CIE, which don't vary between functions.  If

/* The state of the first row of the FDE table, which includes the
   state provided by the CIE.  */
static GTY(()) dw_cfi_row *cie_cfi_row;

cie_cfi_row is created by

  cie_cfi_row = cur_row = new_cfi_row ();

  /* On entry, the Canonical Frame Address is at SP.  */
  memset (&loc, 0, sizeof (loc));
  loc.reg = dw_stack_pointer_regnum;
  loc.offset = INCOMING_FRAME_SP_OFFSET;
  def_cfa_1 (&loc);

and used by create_pseudo_cfg

  ti.beg_row = cie_cfi_row;
  ti.cfa_store = cie_cfi_row->cfa;

The problem is that the offset field in cie_cfi_row->cfa may not be the same for
all functions.  cie_cfi_row does change in this case.  My patch simply corrects
the offset in CFA of the first row of the FDE table.

> INCOMING_FRAME_SP_OFFSET varies, we need to add actual FDE
> instructions to reflect that, not just clobber our current model of
> what the CIE means.
>
> Jason



-- 
H.J.



More information about the Gcc-patches mailing list