diff options
| author | Arnold Schwaighofer <aschwaighofer@apple.com> | 2016-09-10 14:16:55 +0000 |
|---|---|---|
| committer | Arnold Schwaighofer <aschwaighofer@apple.com> | 2016-09-10 14:16:55 +0000 |
| commit | 112ff66505c9102fedf0a40fb2f44ce97afaabb0 (patch) | |
| tree | a7422fcd167839e4f5d1051962819db38c9c690c | |
| parent | b66e5eb612f394987cc63d5c1cbdb4c0f82f356d (diff) | |
| download | bcm5719-llvm-112ff66505c9102fedf0a40fb2f44ce97afaabb0.tar.gz bcm5719-llvm-112ff66505c9102fedf0a40fb2f44ce97afaabb0.zip | |
We also need to pass swifterror in R12 under swiftcc not only under ccc
rdar://28190687
llvm-svn: 281138
| -rw-r--r-- | llvm/lib/Target/X86/X86CallingConv.td | 3 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/swifterror.ll | 22 |
2 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86CallingConv.td b/llvm/lib/Target/X86/X86CallingConv.td index 4cb62b56bce..d38145e5519 100644 --- a/llvm/lib/Target/X86/X86CallingConv.td +++ b/llvm/lib/Target/X86/X86CallingConv.td @@ -196,6 +196,9 @@ def RetCC_X86_64_WebKit_JS : CallingConv<[ ]>; def RetCC_X86_64_Swift : CallingConv<[ + + CCIfSwiftError<CCIfType<[i64], CCAssignToReg<[R12]>>>, + // For integers, ECX, R8D can be used as extra return registers. CCIfType<[i1], CCPromoteToType<i8>>, CCIfType<[i8] , CCAssignToReg<[AL, DL, CL, R8B]>>, diff --git a/llvm/test/CodeGen/X86/swifterror.ll b/llvm/test/CodeGen/X86/swifterror.ll index 46dc1778bdc..21695cbc003 100644 --- a/llvm/test/CodeGen/X86/swifterror.ll +++ b/llvm/test/CodeGen/X86/swifterror.ll @@ -376,3 +376,25 @@ entry: ret void } + +; This tests the basic usage of a swifterror parameter with swiftcc. +define swiftcc float @foo_swiftcc(%swift_error** swifterror %error_ptr_ref) { +; CHECK-APPLE-LABEL: foo_swiftcc: +; CHECK-APPLE: movl $16, %edi +; CHECK-APPLE: malloc +; CHECK-APPLE: movb $1, 8(%rax) +; CHECK-APPLE: movq %rax, %r12 + +; CHECK-O0-LABEL: foo_swiftcc: +; CHECK-O0: movl $16 +; CHECK-O0: malloc +; CHECK-O0: movb $1, 8(%rax) +; CHECK-O0: movq %{{.*}}, %r12 +entry: + %call = call i8* @malloc(i64 16) + %call.0 = bitcast i8* %call to %swift_error* + store %swift_error* %call.0, %swift_error** %error_ptr_ref + %tmp = getelementptr inbounds i8, i8* %call, i64 8 + store i8 1, i8* %tmp + ret float 1.0 +} |

