diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/CodeGenCXX/member-function-pointer-calls.cpp | 5 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp | 24 |
2 files changed, 29 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/member-function-pointer-calls.cpp b/clang/test/CodeGenCXX/member-function-pointer-calls.cpp index 99162ebd586..67417ef0469 100644 --- a/clang/test/CodeGenCXX/member-function-pointer-calls.cpp +++ b/clang/test/CodeGenCXX/member-function-pointer-calls.cpp @@ -1,4 +1,5 @@ // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -O3 -o - | FileCheck %s +// RUN: %clang_cc1 %s -triple=x86_64-windows-gnu -emit-llvm -o - | FileCheck %s -check-prefix MINGW64 struct A { virtual int vf1() { return 1; } virtual int vf2() { return 2; } @@ -10,6 +11,8 @@ int f(A* a, int (A::*fp)()) { // CHECK-LABEL: define i32 @_Z2g1v() // CHECK: ret i32 1 +// MINGW64-LABEL: define i32 @_Z2g1v() +// MINGW64: call i32 @_Z1fP1AMS_FivE(%struct.A* %{{.*}}, { i64, i64 }* %{{.*}}) int g1() { A a; return f(&a, &A::vf1); @@ -17,6 +20,8 @@ int g1() { // CHECK-LABEL: define i32 @_Z2g2v() // CHECK: ret i32 2 +// MINGW64-LABEL: define i32 @_Z2g2v() +// MINGW64: call i32 @_Z1fP1AMS_FivE(%struct.A* %{{.*}}, { i64, i64 }* %{{.*}}) int g2() { A a; return f(&a, &A::vf2); diff --git a/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp b/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp index c5eeb4ef492..4ce8a02dcb0 100644 --- a/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp +++ b/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -fno-rtti -emit-llvm %s -o - -triple=i386-pc-win32 | FileCheck %s +// RUN: %clang_cc1 -fno-rtti -emit-llvm %s -o - -triple=x86_64-pc-win32 | FileCheck %s -check-prefix=X64 // RUN: %clang_cc1 -fno-rtti -emit-llvm %s -o - -triple=i386-pc-win32 -DINCOMPLETE_VIRTUAL -fms-extensions -verify // RUN: %clang_cc1 -fno-rtti -emit-llvm %s -o - -triple=i386-pc-win32 -DINCOMPLETE_VIRTUAL -DMEMFUN -fms-extensions -verify // FIXME: Test x86_64 member pointers when codegen no longer asserts on records @@ -235,6 +236,10 @@ bool nullTestDataUnspecified(int Unspecified::*mp) { // CHECK: %[[and1:.*]] = or i1 %[[and0]], %[[cmp2]] // CHECK: ret i1 %[[and1]] // CHECK: } + +// Pass this large type indirectly. +// X64-LABEL: define zeroext i1 @"\01?nullTestDataUnspecified@@ +// X64: ({ i32, i32, i32 }*) } bool nullTestFunctionUnspecified(void (Unspecified::*mp)()) { @@ -271,6 +276,11 @@ int loadDataMemberPointerVirtual(Virtual *o, int Virtual::*memptr) { // CHECK: %[[v12:.*]] = load i32* %[[v11]] // CHECK: ret i32 %[[v12]] // CHECK: } + +// A two-field data memptr on x64 gets coerced to i64 and is passed in a +// register or memory. +// X64-LABEL: define i32 @"\01?loadDataMemberPointerVirtual@@YAHPEAUVirtual@@PEQ1@H@Z" +// X64: (%struct.Virtual* %o, i64 %memptr.coerce) } int loadDataMemberPointerUnspecified(Unspecified *o, int Unspecified::*memptr) { @@ -312,6 +322,11 @@ void callMemberPointerSingle(Single *o, void (Single::*memptr)()) { // CHECK: call x86_thiscallcc void %{{.*}}(%{{.*}} %{{.*}}) // CHECK: ret void // CHECK: } + +// X64-LABEL: define void @"\01?callMemberPointerSingle@@ +// X64: (%struct.Single* %o, i8* %memptr) +// X64: bitcast i8* %{{[^ ]*}} to void (%struct.Single*)* +// X64: ret void } void callMemberPointerMultiple(Multiple *o, void (Multiple::*memptr)()) { @@ -358,6 +373,9 @@ bool compareSingleFunctionMemptr(void (Single::*l)(), void (Single::*r)()) { // CHECK-NOT: icmp // CHECK: ret i1 %[[r]] // CHECK: } + +// X64-LABEL: define zeroext i1 @"\01?compareSingleFunctionMemptr@@ +// X64: (i8* %{{[^,]*}}, i8* %{{[^)]*}}) } bool compareNeqSingleFunctionMemptr(void (Single::*l)(), void (Single::*r)()) { @@ -393,6 +411,9 @@ bool unspecFuncMemptrEq(void (Unspecified::*l)(), void (Unspecified::*r)()) { // CHECK: %{{.*}} = and i1 %[[bits_or_null]], %[[cmp0]] // CHECK: ret i1 %{{.*}} // CHECK: } + +// X64-LABEL: define zeroext i1 @"\01?unspecFuncMemptrEq@@ +// X64: ({ i8*, i32, i32, i32 }*, { i8*, i32, i32, i32 }*) } bool unspecFuncMemptrNeq(void (Unspecified::*l)(), void (Unspecified::*r)()) { @@ -435,6 +456,9 @@ bool unspecDataMemptrEq(int Unspecified::*l, int Unspecified::*r) { // CHECK: and i1 // CHECK: ret i1 // CHECK: } + +// X64-LABEL: define zeroext i1 @"\01?unspecDataMemptrEq@@ +// X64: ({ i32, i32, i32 }*, { i32, i32, i32 }*) } void (Multiple::*convertB2FuncToMultiple(void (B2::*mp)()))() { |