[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