[PATCH] D125418: [Arm64EC 6/?] Implement C/C++ mangling for Arm64EC function definitions.

chenglin.bi via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 29 00:15:42 PDT 2022


bcl5980 added a comment.

Another thing we need consider here is this case:

  #pragma pack(push, 1)
      struct b64 {
          char a[64];
      };
  #pragma pack(pop)
  
      typedef b64 (fptrtype)(int a);
  
      b64 f(void* p, int a) {
          return ((fptrtype*)p)(a);
      }

For now we generate exit_thunk with type void f(void* sret(b64) ret, int a)

  $iexit_thunk$cdecl$v$i8i8:              // @"$iexit_thunk$cdecl$v$i8i8"
  .seh_proc $iexit_thunk$cdecl$v$i8i8
  // %bb.0:
  	sub	sp, sp, #48
  	.seh_stackalloc	48
  	stp	x29, x30, [sp, #32]             // 16-byte Folded Spill
  	.seh_save_fplr	32
  	add	x29, sp, #32
  	.seh_add_fp	32
  	.seh_endprologue
  	mov	w1, w0
  	mov	x0, x8
  	adrp	x8, __os_arm64x_dispatch_call_no_redirect
  	ldr	x8, [x8, :lo12:__os_arm64x_dispatch_call_no_redirect]
  	blr	x8
  	.seh_startepilogue
  	ldp	x29, x30, [sp, #32]             // 16-byte Folded Reload
  	.seh_save_fplr	32
  	add	sp, sp, #48
  	.seh_stackalloc	48
  	.seh_endepilogue
  	ret
  	.seh_endfunclet
  	.seh_endproc
                                          // -- End function
  	.globl	f
  	.def	f;
  	.scl	2;
  	.type	32;
  	.endef

But it looks Microsoft generate exit thunk with type void* f(int a)

  |$iexit_thunk$cdecl$i8$i8| PROC
  |$LN2|
  	pacibsp
  	stp         fp,lr,[sp,#-0x10]!
  	mov         fp,sp
  	sub         sp,sp,#0x20
  	adrp        x8,__os_arm64x_dispatch_call_no_redirect
  	ldr         xip0,[x8,__os_arm64x_dispatch_call_no_redirect]
  	blr         xip0
  	mov         x0,x8
  	add         sp,sp,#0x20
  	ldp         fp,lr,[sp],#0x10
  	autibsp
  	ret
  
  	ENDP  ; |$iexit_thunk$cdecl$i8$i8|

But based on clang x86 on Windows, we also generate the function type with void f(void* sret(b64) ret, int a).
It looks clang is different from MSVC even in x86 ABI.
Do we need to follow MSVC to generate $iexit_thunk$cdecl$i8$i8 ? Or just follow clang's ABI and ignore the difference?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D125418/new/

https://reviews.llvm.org/D125418



More information about the cfe-commits mailing list