[amdgcn] Update CFI configuration

Currently we don't get any call frame information for the amdgcn target.
This patch makes necessary adjustments to generate CFI that can work with
ROCGDB (ROCm 3.8+).

gcc/

	* config/gcn/gcn.c (move_callee_saved_registers): Emit CFI notes for
	prologue register saves.
	(gcn_debug_unwind_info): Use UI_DWARF2.
	(gcn_dwarf_register_number): Map DWARF_LINK_REGISTER to DWARF PC.
	(gcn_dwarf_register_span): DWARF_LINK_REGISTER doesn't span.
	* config/gcn/gcn.h: (DWARF_FRAME_RETURN_COLUMN): New define.
	(DWARF_LINK_REGISTER): New define.
	(FIRST_PSEUDO_REGISTER): Increment.
	(FIXED_REGISTERS): Add entry for DWARF_LINK_REGISTER.
	(CALL_USED_REGISTERS): Likewise.
	(REGISTER_NAMES): Likewise.
This commit is contained in:
Hafiz Abid Qadeer 2021-05-28 17:49:46 +01:00
parent e66d0b7b87
commit 251697a64b
2 changed files with 81 additions and 11 deletions

View File

@ -2649,6 +2649,7 @@ move_callee_saved_registers (rtx sp, machine_function *offsets,
rtx as = gen_rtx_CONST_INT (VOIDmode, STACK_ADDR_SPACE);
HOST_WIDE_INT exec_set = 0;
int offreg_set = 0;
auto_vec<int> saved_sgprs;
start_sequence ();
@ -2665,7 +2666,10 @@ move_callee_saved_registers (rtx sp, machine_function *offsets,
int lane = saved_scalars % 64;
if (prologue)
emit_insn (gen_vec_setv64si (vreg, reg, GEN_INT (lane)));
{
emit_insn (gen_vec_setv64si (vreg, reg, GEN_INT (lane)));
saved_sgprs.safe_push (regno);
}
else
emit_insn (gen_vec_extractv64sisi (reg, vreg, GEN_INT (lane)));
@ -2698,7 +2702,7 @@ move_callee_saved_registers (rtx sp, machine_function *offsets,
gcn_gen_undef (V64SImode), exec));
/* Move vectors. */
for (regno = FIRST_VGPR_REG, offset = offsets->pretend_size;
for (regno = FIRST_VGPR_REG, offset = 0;
regno < FIRST_PSEUDO_REGISTER; regno++)
if ((df_regs_ever_live_p (regno) && !call_used_or_fixed_reg_p (regno))
|| (regno == VGPR_REGNO (6) && saved_scalars > 0)
@ -2719,8 +2723,67 @@ move_callee_saved_registers (rtx sp, machine_function *offsets,
}
if (prologue)
emit_insn (gen_scatterv64si_insn_1offset_exec (vsp, const0_rtx, reg,
as, const0_rtx, exec));
{
rtx insn = emit_insn (gen_scatterv64si_insn_1offset_exec
(vsp, const0_rtx, reg, as, const0_rtx,
exec));
/* Add CFI metadata. */
rtx note;
if (regno == VGPR_REGNO (6) || regno == VGPR_REGNO (7))
{
int start = (regno == VGPR_REGNO (7) ? 64 : 0);
int count = MIN (saved_scalars - start, 64);
int add_lr = (regno == VGPR_REGNO (6)
&& df_regs_ever_live_p (LINK_REGNUM));
int lrdest = -1;
rtvec seq = rtvec_alloc (count + add_lr);
/* Add an REG_FRAME_RELATED_EXPR entry for each scalar
register that was saved in this batch. */
for (int idx = 0; idx < count; idx++)
{
int stackaddr = offset + idx * 4;
rtx dest = gen_rtx_MEM (SImode,
gen_rtx_PLUS
(DImode, sp,
GEN_INT (stackaddr)));
rtx src = gen_rtx_REG (SImode, saved_sgprs[start + idx]);
rtx set = gen_rtx_SET (dest, src);
RTX_FRAME_RELATED_P (set) = 1;
RTVEC_ELT (seq, idx) = set;
if (saved_sgprs[start + idx] == LINK_REGNUM)
lrdest = stackaddr;
}
/* Add an additional expression for DWARF_LINK_REGISTER if
LINK_REGNUM was saved. */
if (lrdest != -1)
{
rtx dest = gen_rtx_MEM (DImode,
gen_rtx_PLUS
(DImode, sp,
GEN_INT (lrdest)));
rtx src = gen_rtx_REG (DImode, DWARF_LINK_REGISTER);
rtx set = gen_rtx_SET (dest, src);
RTX_FRAME_RELATED_P (set) = 1;
RTVEC_ELT (seq, count) = set;
}
note = gen_rtx_SEQUENCE (VOIDmode, seq);
}
else
{
rtx dest = gen_rtx_MEM (V64SImode,
gen_rtx_PLUS (DImode, sp,
GEN_INT (offset)));
rtx src = gen_rtx_REG (V64SImode, regno);
note = gen_rtx_SET (dest, src);
}
RTX_FRAME_RELATED_P (insn) = 1;
add_reg_note (insn, REG_FRAME_RELATED_EXPR, note);
}
else
emit_insn (gen_gatherv64si_insn_1offset_exec
(reg, vsp, const0_rtx, as, const0_rtx,
@ -3224,8 +3287,7 @@ gcn_cannot_copy_insn_p (rtx_insn *insn)
static enum unwind_info_type
gcn_debug_unwind_info ()
{
/* No support for debug info, yet. */
return UI_NONE;
return UI_DWARF2;
}
/* Determine if there is a suitable hardware conversion instruction.
@ -6251,6 +6313,8 @@ gcn_dwarf_register_number (unsigned int regno)
return 768; */
else if (regno == SCC_REG)
return 128;
else if (regno == DWARF_LINK_REGISTER)
return 16;
else if (SGPR_REGNO_P (regno))
{
if (regno - FIRST_SGPR_REG < 64)
@ -6280,8 +6344,12 @@ gcn_dwarf_register_span (rtx rtl)
if (GET_MODE_SIZE (mode) != 8)
return NULL_RTX;
rtx p = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2));
unsigned regno = REGNO (rtl);
if (regno == DWARF_LINK_REGISTER)
return NULL_RTX;
rtx p = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2));
XVECEXP (p, 0, 0) = gen_rtx_REG (SImode, regno);
XVECEXP (p, 0, 1) = gen_rtx_REG (SImode, regno + 1);

View File

@ -88,6 +88,7 @@
#define FIRST_PARM_OFFSET(FNDECL) 0
#define DYNAMIC_CHAIN_ADDRESS(FP) plus_constant (Pmode, (FP), -16)
#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, LINK_REGNUM)
#define DWARF_FRAME_RETURN_COLUMN 16
#define STACK_DYNAMIC_OFFSET(FNDECL) (-crtl->outgoing_args_size)
#define ACCUMULATE_OUTGOING_ARGS 1
#define RETURN_ADDR_RTX(COUNT,FRAMEADDR) \
@ -138,7 +139,8 @@
#define WORK_ITEM_ID_Z_REG 162
#define SOFT_ARG_REG 416
#define FRAME_POINTER_REGNUM 418
#define FIRST_PSEUDO_REGISTER 420
#define DWARF_LINK_REGISTER 420
#define FIRST_PSEUDO_REGISTER 421
#define FIRST_PARM_REG 24
#define NUM_PARM_REGS 6
@ -200,7 +202,7 @@
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
/* Other registers. */ \
1, 1, 1, 1 \
1, 1, 1, 1, 1 \
}
#define CALL_USED_REGISTERS { \
@ -238,7 +240,7 @@
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
/* Other registers. */ \
1, 1, 1, 1 \
1, 1, 1, 1, 1 \
}
@ -517,7 +519,7 @@ enum gcn_address_spaces
"v236", "v237", "v238", "v239", "v240", "v241", "v242", "v243", "v244", \
"v245", "v246", "v247", "v248", "v249", "v250", "v251", "v252", "v253", \
"v254", "v255", \
"?ap0", "?ap1", "?fp0", "?fp1" }
"?ap0", "?ap1", "?fp0", "?fp1", "?dwlr" }
#define PRINT_OPERAND(FILE, X, CODE) print_operand(FILE, X, CODE)
#define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR)