OSDN Git Service

AArch64: support SwiftCC properly on AAPCS64
authorSaleem Abdulrasool <compnerd@compnerd.org>
Fri, 22 Sep 2017 04:31:44 +0000 (04:31 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Fri, 22 Sep 2017 04:31:44 +0000 (04:31 +0000)
The previous SwiftCC support for AAPCS64 was partially correct.  It
setup swiftself parameters in the proper register but failed to setup
swifterror in the correct register.  This would break compilation of
swift code for non-Darwin AAPCS64 conforming environments.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313956 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AArch64/AArch64CallingConvention.td
test/CodeGen/AArch64/swift-error.ll [new file with mode: 0644]

index 291bc5e..93a6844 100644 (file)
@@ -49,6 +49,9 @@ def CC_AArch64_AAPCS : CallingConv<[
   // Pass SwiftSelf in a callee saved register.
   CCIfSwiftSelf<CCIfType<[i64], CCAssignToRegWithShadow<[X20], [W20]>>>,
 
+  // A SwiftError is passed in X21.
+  CCIfSwiftError<CCIfType<[i64], CCAssignToRegWithShadow<[X21], [W21]>>>,
+
   CCIfConsecutiveRegs<CCCustom<"CC_AArch64_Custom_Block">>,
 
   // Handle i1, i8, i16, i32, i64, f32, f64 and v2f64 by passing in registers,
diff --git a/test/CodeGen/AArch64/swift-error.ll b/test/CodeGen/AArch64/swift-error.ll
new file mode 100644 (file)
index 0000000..79a31c1
--- /dev/null
@@ -0,0 +1,18 @@
+; RUN: llc -mtriple aarch64-unknown-linux-gnu -filetype asm -o - %s | FileCheck %s
+
+%swift.error = type opaque
+
+declare swiftcc void @f(%swift.error** swifterror)
+
+define swiftcc void @g(i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %swift.error** swifterror %error) {
+entry:
+  call swiftcc void @f(%swift.error** nonnull nocapture swifterror %error)
+  ret void
+}
+
+; CHEECK-LABEL: g
+; CHECK: str x30, [sp, #-16]!
+; CHECK: bl f
+; CHECK: ldr x30, [sp], #16
+; CHECK: ret
+