&& cfi_insn->u.rr.reg1 == SFRAME_CFA_RA_REG)
sframe_fre_set_ra_track (cur_fre,
SFRAME_V2_S390X_OFFSET_ENCODE_REGNUM (cfi_insn->u.rr.reg2));
+ /* SFrame does not track SP explicitly. */
+ else if (cfi_insn->u.rr.reg1 == SFRAME_CFA_SP_REG)
+ {
+ as_warn (_("no SFrame FDE emitted; %s register %u in .cfi_register"),
+ sframe_register_name (cfi_insn->u.rr.reg1), cfi_insn->u.rr.reg1);
+ return SFRAME_XLATE_ERR_NOTREPRESENTED; /* Not represented. */
+ }
return SFRAME_XLATE_OK;
}
cur_fre->fp_deref_p = false;
cur_fre->merge_candidate = false;
xlate_ctx->flex_p = true;
+ return SFRAME_XLATE_OK;
}
else if (cfi_insn->u.rr.reg1 == SFRAME_CFA_RA_REG)
{
cur_fre->ra_deref_p = false;
cur_fre->merge_candidate = false;
xlate_ctx->flex_p = true;
+ return SFRAME_XLATE_OK;
}
+ /* Recovering REG_SP from an alternate register is not represented in
+ SFrame. Fallthrough if SFRAME_CFA_SP_REG and error out. */
}
- else if (cfi_insn->u.rr.reg1 == SFRAME_CFA_RA_REG
- /* Ignore SP reg, as it can be recovered from the CFA tracking
- info. */
- || cfi_insn->u.rr.reg1 == SFRAME_CFA_FP_REG)
+
+ if (cfi_insn->u.rr.reg1 == SFRAME_CFA_RA_REG
+ /* SFrame does not track SP explicitly. */
+ || cfi_insn->u.rr.reg1 == SFRAME_CFA_SP_REG
+ || cfi_insn->u.rr.reg1 == SFRAME_CFA_FP_REG)
{
as_warn (_("no SFrame FDE emitted; %s register %u in .cfi_register"),
sframe_register_name (cfi_insn->u.rr.reg1), cfi_insn->u.rr.reg1);
--- /dev/null
+#name: SFrame generation on s390x - .cfi_register with SP
+#as: --gsframe
+#warning: SP register 15 in \.cfi\_register
+#objdump: --sframe=.sframe
+#...
+Contents of the SFrame section .sframe:
+
+ Header :
+
+ Version: SFRAME_VERSION_3
+ Flags: SFRAME_F_FDE_FUNC_START_PCREL
+ Num FDEs: 0
+ Num FREs: 0
+
+#pass
--- /dev/null
+#as: --gsframe
+#warning: SP register 7 in \.cfi\_register
+#objdump: --sframe=.sframe
+#name: SP register 7 in .cfi_register
+#...
+Contents of the SFrame section .sframe:
+
+ Header :
+
+ Version: SFRAME_VERSION_3
+ Flags: SFRAME_F_FDE_FUNC_START_PCREL
+#? CFA fixed FP offset: \-?\d+
+#? CFA fixed RA offset: \-?\d+
+ Num FDEs: 0
+ Num FREs: 0
+
+#pass
run_dump_test "cfi-sframe-x86_64-empty-2"
run_dump_test "cfi-sframe-x86_64-empty-3"
run_dump_test "cfi-sframe-x86_64-empty-4"
+ run_dump_test "cfi-sframe-x86_64-empty-5"
run_dump_test "cfi-sframe-x86_64-empty-pr33277"
run_dump_test "cfi-sframe-x86_64-ra-undefined-1"
run_dump_test "cfi-sframe-x86_64-ra-undefined-flex-1"
run_dump_test "cfi-sframe-s390x-err-1"
run_dump_test "cfi-sframe-s390x-err-2"
run_dump_test "cfi-sframe-s390x-err-3"
+ run_dump_test "cfi-sframe-s390x-err-4"
run_dump_test "cfi-sframe-s390x-fpra-offset-1"
run_dump_test "cfi-sframe-s390x-fpra-offset-2"
run_dump_test "cfi-sframe-s390x-fpra-register-1"