DWARF: Allow hard frame pointer even if frame pointer isn't used

r251028

commit cd557ff63f388ad27c376d0a225e74d3594a6f9d
Author: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Thu Aug 10 15:29:05 2017 +0000

    i386: Don't use frame pointer without stack access

    When there is no stack access, there is no need to use frame pointer
    even if -fno-omit-frame-pointer is used and caller's frame pointer is
    unchanged.

frame pointer may not be available even if -fno-omit-frame-pointer is
used.  When this happened, arg pointer may be eliminated by hard frame
pointer.  Since hard frame pointer is encoded with DW_OP_fbreg which
uses the DW_AT_frame_base attribute, not hard frame pointer directly,
we should allow hard frame pointer when generating DWARF info even if
frame pointer isn't used.

gcc/

	PR debug/86593
	* dwarf2out.c (based_loc_descr): Allow hard frame pointer even
	if frame pointer isn't used.
	(compute_frame_pointer_to_fb_displacement): Likewise.

gcc/testsuite/

	PR debug/86593
	* g++.dg/pr86593.C: New test.

From-SVN: r264096
This commit is contained in:
H.J. Lu 2018-09-04 20:42:06 +00:00 committed by H.J. Lu
parent 8f93810d3b
commit 6bc088ca0e
4 changed files with 35 additions and 13 deletions

View File

@ -1,3 +1,10 @@
2018-09-04 H.J. Lu <hongjiu.lu@intel.com>
PR debug/86593
* dwarf2out.c (based_loc_descr): Allow hard frame pointer even
if frame pointer isn't used.
(compute_frame_pointer_to_fb_displacement): Likewise.
2018-09-04 Jakub Jelinek <jakub@redhat.com>
PR target/87198

View File

@ -14325,13 +14325,13 @@ based_loc_descr (rtx reg, poly_int64 offset,
if (elim != reg)
{
/* Allow hard frame pointer here even if frame pointer
isn't used since hard frame pointer is encoded with
DW_OP_fbreg which uses the DW_AT_frame_base attribute,
not hard frame pointer directly. */
elim = strip_offset_and_add (elim, &offset);
gcc_assert ((SUPPORTS_STACK_ALIGNMENT
&& (elim == hard_frame_pointer_rtx
|| elim == stack_pointer_rtx))
|| elim == (frame_pointer_needed
? hard_frame_pointer_rtx
: stack_pointer_rtx));
gcc_assert (elim == hard_frame_pointer_rtx
|| elim == stack_pointer_rtx);
/* If drap register is used to align stack, use frame
pointer + offset to access stack variables. If stack
@ -20512,14 +20512,13 @@ compute_frame_pointer_to_fb_displacement (poly_int64 offset)
in which to eliminate. This is because it's stack pointer isn't
directly accessible as a register within the ISA. To work around
this, assume that while we cannot provide a proper value for
frame_pointer_fb_offset, we won't need one either. */
frame_pointer_fb_offset, we won't need one either. We can use
hard frame pointer in debug info even if frame pointer isn't used
since hard frame pointer in debug info is encoded with DW_OP_fbreg
which uses the DW_AT_frame_base attribute, not hard frame pointer
directly. */
frame_pointer_fb_offset_valid
= ((SUPPORTS_STACK_ALIGNMENT
&& (elim == hard_frame_pointer_rtx
|| elim == stack_pointer_rtx))
|| elim == (frame_pointer_needed
? hard_frame_pointer_rtx
: stack_pointer_rtx));
= (elim == hard_frame_pointer_rtx || elim == stack_pointer_rtx);
}
/* Generate a DW_AT_name attribute given some string value to be included as

View File

@ -1,3 +1,8 @@
2018-09-04 H.J. Lu <hongjiu.lu@intel.com>
PR debug/86593
* g++.dg/pr86593.C: New test.
2018-09-04 Jakub Jelinek <jakub@redhat.com>
PR target/87198

View File

@ -0,0 +1,11 @@
// { dg-options "-O -g -fno-omit-frame-pointer" }
struct Foo
{
int bar(int a, int b, int c, int i1, int i2, int i3, int d);
};
int Foo::bar(int a, int b, int c, int i1, int i2, int i3, int d)
{
return 0;
}