mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-05 02:07:56 +00:00
597f80e768
Summary: Thunk functions in Windows are varag functions that call a musttail function to pass the arguments after the fixup is done. We need to make sure that we forward the arguments from the caller vararg to the callee vararg function. This is the same mechanism that is used for Windows on X86. Reviewers: ssijaric, eli.friedman, TomTan, mgrang, mstorsjo, rnk, compnerd, efriedma Reviewed By: efriedma Subscribers: efriedma, kristof.beyls, chrib, javed.absar, llvm-commits Differential Revision: https://reviews.llvm.org/D53843 llvm-svn: 345641
35 lines
1.2 KiB
LLVM
35 lines
1.2 KiB
LLVM
; RUN: llc -mtriple=aarch64-windows-msvc %s -o - | FileCheck %s
|
|
; RUN: llc -mtriple=aarch64-linux-gnu %s -o - | FileCheck %s
|
|
|
|
target datalayout = "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128"
|
|
|
|
%class.X = type { i8 }
|
|
%struct.B = type { i32 (...)** }
|
|
|
|
$"??_9B@@$BA@AA" = comdat any
|
|
|
|
; Function Attrs: noinline optnone
|
|
define linkonce_odr void @"??_9B@@$BA@AA"(%struct.B* %this, ...) #1 comdat align 2 {
|
|
entry:
|
|
%this.addr = alloca %struct.B*, align 8
|
|
store %struct.B* %this, %struct.B** %this.addr, align 8
|
|
%this1 = load %struct.B*, %struct.B** %this.addr, align 8
|
|
call void asm sideeffect "", "~{d0}"()
|
|
%0 = bitcast %struct.B* %this1 to void (%struct.B*, ...)***
|
|
%vtable = load void (%struct.B*, ...)**, void (%struct.B*, ...)*** %0, align 8
|
|
%vfn = getelementptr inbounds void (%struct.B*, ...)*, void (%struct.B*, ...)** %vtable, i64 0
|
|
%1 = load void (%struct.B*, ...)*, void (%struct.B*, ...)** %vfn, align 8
|
|
musttail call void (%struct.B*, ...) %1(%struct.B* %this1, ...)
|
|
ret void
|
|
; No predecessors!
|
|
ret void
|
|
}
|
|
|
|
attributes #1 = { noinline optnone "thunk" }
|
|
|
|
; CHECK: mov v16.16b, v0.16b
|
|
; CHECK: ldr x8, [x0]
|
|
; CHECK: ldr x8, [x8]
|
|
; CHECK: mov v0.16b, v16.16b
|
|
; CHECK: br x8
|