summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/AArch64
diff options
context:
space:
mode:
authorMandeep Singh Grang <mgrang@codeaurora.org>2018-10-30 20:46:10 +0000
committerMandeep Singh Grang <mgrang@codeaurora.org>2018-10-30 20:46:10 +0000
commit71e0cc2a0ba78e4809125160836b92e2a6c5f0a8 (patch)
treeb159343888b21798b6040ff52cc1201f9ba8df08 /llvm/test/CodeGen/AArch64
parent00935bc1ba22bb8c0078059e3c93bbd3b4483215 (diff)
downloadbcm5719-llvm-71e0cc2a0ba78e4809125160836b92e2a6c5f0a8.tar.gz
bcm5719-llvm-71e0cc2a0ba78e4809125160836b92e2a6c5f0a8.zip
[COFF, ARM64] Make sure to forward arguments from vararg to musttail vararg
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
Diffstat (limited to 'llvm/test/CodeGen/AArch64')
-rw-r--r--llvm/test/CodeGen/AArch64/vararg-tallcall.ll34
1 files changed, 34 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AArch64/vararg-tallcall.ll b/llvm/test/CodeGen/AArch64/vararg-tallcall.ll
new file mode 100644
index 00000000000..28182226803
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/vararg-tallcall.ll
@@ -0,0 +1,34 @@
+; 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
OpenPOWER on IntegriCloud