[PATCH] D143248: Emit CFI directives in epilogue and enable CFIFixup pass for RISC-V.
Varun Kumar E via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 8 04:26:55 PST 2023
varunkumare99 added a comment.
In D143248#4131555 <https://reviews.llvm.org/D143248#4131555>, @shiva0217 wrote:
> Hi Varun,
>
> It might be good to have a simple case to illustrate that cfi_remember_state and cfi_restore_state can be generated properly with epilogue CFI.
> For examle, could the following case generated with cfi_remember_state and cfi_restore_state as GCC?
>
> extern void foo(void);
> void f(int *i) {
> if (*i == 0) {
> *i = 1;
> foo();
> return;
> } else {
> __builtin_printf("Hi");
> *i=0;
> }
> }
Hi Shiva, the following is the assembly emitted.
f:
.Lfunc_begin0:
.loc 0 2 0
.cfi_startproc
addi sp, sp, -16
.cfi_def_cfa_offset 16
sd ra, 8(sp)
sd s0, 0(sp)
.cfi_offset ra, -8
.cfi_offset s0, -16
.cfi_remember_state
mv s0, a0
.Ltmp0:
.loc 0 3 6 prologue_end
lw a0, 0(a0)
.Ltmp1:
.loc 0 3 6 is_stmt 0
beqz a0, .LBB0_2
.Ltmp2:
.loc 0 8 3 is_stmt 1
lui a0, %hi(.L.str)
addi a0, a0, %lo(.L.str)
call printf
.Ltmp3:
.loc 0 9 5
sw zero, 0(s0)
.Ltmp4:
.loc 0 11 1
ld ra, 8(sp)
ld s0, 0(sp)
.Ltmp5:
.cfi_restore ra
.cfi_restore s0
.loc 0 11 1 epilogue_begin is_stmt 0
addi sp, sp, 16
.cfi_def_cfa_offset 0
ret
.LBB0_2:
.cfi_restore_state
.Ltmp6:
.loc 0 0 1
li a0, 1
.Ltmp7:
.loc 0 4 6 is_stmt 1
sw a0, 0(s0)
.loc 0 5 3
ld ra, 8(sp)
ld s0, 0(sp)
.Ltmp8:
.cfi_restore ra
.cfi_restore s0
.loc 0 5 3 epilogue_begin is_stmt 0
addi sp, sp, 16
.cfi_def_cfa_offset 0
.Ltmp9:
tail foo
.Ltmp10:
.Lfunc_end0:
.size f, .Lfunc_end0-f
.cfi_endproc
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D143248/new/
https://reviews.llvm.org/D143248
More information about the llvm-commits
mailing list