This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: unwind info for epilogues


On Sat, May 30, 2009 at 6:21 AM, H.J. Lu<hjl.tools@gmail.com> wrote:
> On Fri, May 29, 2009 at 5:42 PM, Richard Henderson <rth@redhat.com> wrote:
>> Joseph S. Myers wrote:
>>>
>>> On Wed, 6 May 2009, Richard Henderson wrote:
>>>
>>>> Since the beginning, -fasynchronous-unwind-tables has not held correct
>>>> information for function epilogues. ?This is an attempt at adding that.
>>>
>>> See also Nathan Froyd's patch (doing this for x86_64) described in his
>>> 2006 Summit paper. ?I haven't compared the approaches (but fully support
>>> adding this feature).
>>>
>>> http://gcc.gnu.org/ml/gcc-patches/2006-03/msg00426.html
>>> http://gcc.gnu.org/ml/gcc-patches/2006-02/msg01091.html
>>>
>>
>> Thanks for the pointers. ?I did incorporate a few of Nathan's ideas into
>> this version of the patch -- primarily, when duplicating the epilogue,
>> make sure the duplicated insns are also recorded as epilogue insns.
>>
>> The other large change from the previous patch is the ability to have
>> the eh_return epilogue from _Unwind_Resume (and friends) marked
>> properly. ?This required the addition of an EH_RETURN rtx, so that
>> the middle-end could recognize when epilogue expansion should happen,
>> rather than the add-hoc unspecs that ports had been using. ?As it
>> happens, only i386 and bfin implement eh_return via special epilogues;
>> most ports only need to overwrite one or more registers before using
>> a normal epilogue.
>>
>> Tested on x86_64, i686; committed.
>>
>> r~
>>
>> ? ? ? ?* cfgcleanup.c (try_crossjump_to_edge): Only skip past
>> ? ? ? ?NOTE_INSN_BASIC_BLOCK.
>> ? ? ? ?* cfglayout.c (duplicate_insn_chain): Copy epilogue insn marks.
>> ? ? ? ?Duplicate NOTE_INSN_EPILOGUE_BEG notes.
>> ? ? ? ?* cfgrtl.c (can_delete_note_p): Allow NOTE_INSN_EPILOGUE_BEG
>> ? ? ? ?to be deleted.
>> ? ? ? ?* dwarf2out.c (struct cfa_loc): Change indirect field to bitfield,
>> ? ? ? ?add in_use field.
>> ? ? ? ?(add_cfi): Disable check redefining cfa away from drap.
>> ? ? ? ?(lookup_cfa_1): Add remember argument; handle remember/restore.
>> ? ? ? ?(lookup_cfa): Pass remember argument.
>> ? ? ? ?(cfa_remember): New.
>> ? ? ? ?(compute_barrier_args_size_1): Remove sibcall check.
>> ? ? ? ?(dwarf2out_frame_debug_def_cfa): New.
>> ? ? ? ?(dwarf2out_frame_debug_adjust_cfa): New.
>> ? ? ? ?(dwarf2out_frame_debug_cfa_offset): New.
>> ? ? ? ?(dwarf2out_frame_debug_cfa_register): New.
>> ? ? ? ?(dwarf2out_frame_debug_cfa_restore): New.
>> ? ? ? ?(dwarf2out_frame_debug): Handle REG_CFA_* notes.
>> ? ? ? ?(dwarf2out_begin_epilogue): New.
>> ? ? ? ?(dwarf2out_frame_debug_restore_state): New.
>> ? ? ? ?(dw_cfi_oprnd1_desc): Handle DW_CFA_remember_state,
>> ? ? ? ?DW_CFA_restore_state.
>> ? ? ? ?(output_cfi_directive): Likewise.
>> ? ? ? ?(convert_cfa_to_fb_loc_list): Likewise.
>> ? ? ? ?(dw_cfi_oprnd1_desc): Handle DW_CFA_restore.
>> ? ? ? ?* dwarf2out.h: Update.
>> ? ? ? ?* emit-rtl.c (try_split): Don't split RTX_FRAME_RELATED_P.
>> ? ? ? ?(copy_insn_1): Early out for null.
>> ? ? ? ?* final.c (final_scan_insn): Call dwarf2out_begin_epilogue
>> ? ? ? ?and dwarf2out_frame_debug_restore_state.
>> ? ? ? ?* function.c (prologue, epilogue, sibcall_epilogue): Remove.
>> ? ? ? ?(prologue_insn_hash, epilogue_insn_hash): New.
>> ? ? ? ?(free_after_compilation): Adjust freeing accordingly.
>> ? ? ? ?(record_insns): Create hash table if needed; push insns into
>> ? ? ? ?hash instead of array.
>> ? ? ? ?(maybe_copy_epilogue_insn): New.
>> ? ? ? ?(contains): Search hash table instead of array.
>> ? ? ? ?(sibcall_epilogue_contains): Remove.
>> ? ? ? ?(thread_prologue_and_epilogue_insns): Split eh_return insns
>> ? ? ? ?and mark them as epilogues.
>> ? ? ? ?(reposition_prologue_and_epilogue_notes): Rewrite epilogue
>> ? ? ? ?scanning in terms of basic blocks.
>> ? ? ? ?* insn-notes.def (CFA_RESTORE_STATE): New.
>> ? ? ? ?* jump.c (returnjump_p_1): Accept EH_RETURN.
>> ? ? ? ?(eh_returnjump_p_1, eh_returnjump_p): New.
>> ? ? ? ?* reg-notes.def (CFA_DEF_CFA, CFA_ADJUST_CFA, CFA_OFFSET,
>> ? ? ? ?CFA_REGISTER, CFA_RESTORE): New.
>> ? ? ? ?* rtl.def (EH_RETURN): New.
>> ? ? ? ?* rtl.h (eh_returnjump_p, maybe_copy_epilogue_insn): Declare.
>>
>> ? ? ? ?* config/bfin/bfin.md (UNSPEC_VOLATILE_EH_RETURN): Remove.
>> ? ? ? ?(eh_return_internal): Use eh_return rtx; split w/ epilogue.
>>
>> ? ? ? ?* config/i386/i386.c (gen_push): Update cfa state.
>> ? ? ? ?(pro_epilogue_adjust_stack): Add set_cfa argument. ?When true,
>> ? ? ? ?add a CFA_ADJUST_CFA note.
>> ? ? ? ?(ix86_dwarf_handle_frame_unspec): Remove.
>> ? ? ? ?(ix86_expand_prologue): Update cfa state.
>> ? ? ? ?(ix86_emit_restore_reg_using_pop): New.
>> ? ? ? ?(ix86_emit_restore_regs_using_pop): New.
>> ? ? ? ?(ix86_emit_leave): New.
>> ? ? ? ?(ix86_emit_restore_regs_using_mov): Add CFA_RESTORE notes.
>> ? ? ? ?(ix86_expand_epilogue): Add notes for unwinding the epilogue.
>> ? ? ? ?* config/i386/i386.h (struct machine_cfa_state): New.
>> ? ? ? ?(ix86_cfa_state): New.
>> ? ? ? ?* config/i386/i386.md (UNSPEC_EH_RETURN): Remove.
>> ? ? ? ?(eh_return_internal): Merge from eh_return_<mode>,
>> ? ? ? ?use eh_return rtx, split w/ epilogue.
>>
>
> This breaks stack unwind on Linux/ia32:
>
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40304
>
>

This also breaks debug info for local variable on Linux/ia32:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40596


-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]