summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorTimur Iskhodzhanov <timurrrr@google.com>2012-07-12 09:50:54 +0000
committerTimur Iskhodzhanov <timurrrr@google.com>2012-07-12 09:50:54 +0000
commitc5098ad371f7f771d5d3f4f6a939035d7ce9f14d (patch)
tree9aad988803a223a433b8062fbedaa76041f159e2 /clang/test
parentcbac2f3bc9f75843712d127279ec77825317a63c (diff)
downloadbcm5719-llvm-c5098ad371f7f771d5d3f4f6a939035d7ce9f14d.tar.gz
bcm5719-llvm-c5098ad371f7f771d5d3f4f6a939035d7ce9f14d.zip
[Windows] Use thiscall as the default calling convention for class methods. PR12785
llvm-svn: 160121
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/CodeGenCXX/microsoft-abi-methods.cpp89
-rw-r--r--clang/test/CodeGenCXX/microsoft-abi-static-initializers.cpp12
2 files changed, 95 insertions, 6 deletions
diff --git a/clang/test/CodeGenCXX/microsoft-abi-methods.cpp b/clang/test/CodeGenCXX/microsoft-abi-methods.cpp
new file mode 100644
index 00000000000..6b7f00495d2
--- /dev/null
+++ b/clang/test/CodeGenCXX/microsoft-abi-methods.cpp
@@ -0,0 +1,89 @@
+// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s
+
+class C {
+ public:
+ void simple_method() {}
+
+ void __cdecl cdecl_method() {}
+
+ void vararg_method(const char *fmt, ...) {}
+
+ static void static_method() {}
+
+ int a;
+};
+
+void call_simple_method() {
+ C instance;
+
+ instance.simple_method();
+// Make sure that the call uses the right calling convention:
+// CHECK: call x86_thiscallcc void @"\01?simple_method@C@@QAEXXZ"
+// CHECK: ret
+
+// Make sure that the definition uses the right calling convention:
+// CHECK: define linkonce_odr x86_thiscallcc void @"\01?simple_method@C@@QAEXXZ"
+// CHECK: ret
+}
+
+void call_cdecl_method() {
+ C instance;
+ instance.cdecl_method();
+// Make sure that the call uses the right calling convention:
+// CHECK: call void @"\01?cdecl_method@C@@QAAXXZ"
+// CHECK: ret
+
+// Make sure that the definition uses the right calling convention:
+// CHECK: define linkonce_odr void @"\01?cdecl_method@C@@QAAXXZ"
+// CHECK: ret
+}
+
+void call_vararg_method() {
+ C instance;
+ instance.vararg_method("Hello");
+// Make sure that the call uses the right calling convention:
+// CHECK: call void (%class.C*, i8*, ...)* @"\01?vararg_method@C@@QAAXPBDZZ"
+// CHECK: ret
+
+// Make sure that the definition uses the right calling convention:
+// CHECK: define linkonce_odr void @"\01?vararg_method@C@@QAAXPBDZZ"
+}
+
+void call_static_method() {
+ C::static_method();
+// Make sure that the call uses the right calling convention:
+// CHECK: call void @"\01?static_method@C@@SAXXZ"
+// CHECK: ret
+
+// Make sure that the definition uses the right calling convention:
+// CHECK: define linkonce_odr void @"\01?static_method@C@@SAXXZ"
+}
+
+class Base {
+ public:
+ Base() {}
+ ~Base() {}
+};
+
+class Child: public Base { };
+
+void constructors() {
+ Child c;
+// Make sure that the Base constructor call in the Child constructor uses
+// the right calling convention:
+// CHECK: define linkonce_odr x86_thiscallcc void @"\01??0Child@@QAE@XZ"
+// CHECK: call x86_thiscallcc void @"\01??0Base@@QAE@XZ"
+// CHECK: ret
+
+// Make sure that the Base destructor call in the Child denstructor uses
+// the right calling convention:
+// CHECK: define linkonce_odr x86_thiscallcc void @"\01??1Child@@QAE@XZ"
+// CHECK: call x86_thiscallcc void @"\01??1Base@@QAE@XZ"
+// CHECK: ret
+
+// Make sure that the Base destructor definition uses the right CC:
+// CHECK: define linkonce_odr x86_thiscallcc void @"\01??1Base@@QAE@XZ"
+
+// Make sure that the Base constructor definition uses the right CC:
+// CHECK: define linkonce_odr x86_thiscallcc void @"\01??0Base@@QAE@XZ"
+}
diff --git a/clang/test/CodeGenCXX/microsoft-abi-static-initializers.cpp b/clang/test/CodeGenCXX/microsoft-abi-static-initializers.cpp
index 4ccd6bafecf..d8b789943a4 100644
--- a/clang/test/CodeGenCXX/microsoft-abi-static-initializers.cpp
+++ b/clang/test/CodeGenCXX/microsoft-abi-static-initializers.cpp
@@ -6,12 +6,12 @@ struct S {
} s;
// CHECK: define internal void [[INIT_s:@.*global_var.*]] nounwind
-// CHECK: call void @"\01??0S@@QAE@XZ"
+// CHECK: call x86_thiscallcc void @"\01??0S@@QAE@XZ"
// CHECK: call i32 @atexit(void ()* @"__dtor_\01?s@@3US@@A")
// CHECK: ret void
// CHECK: define internal void @"__dtor_\01?s@@3US@@A"() nounwind {
-// CHECK: call void @"\01??1S@@QAE@XZ"
+// CHECK: call x86_thiscallcc void @"\01??1S@@QAE@XZ"
// CHECK: ret void
// Force WeakODRLinkage by using templates
@@ -34,16 +34,16 @@ void force_usage() {
}
// CHECK: define internal void [[INIT_foo:@.*global_var.*]] nounwind
-// CHECK: call void @"\01??0A@@QAE@XZ"
+// CHECK: call x86_thiscallcc void @"\01??0A@@QAE@XZ"
// CHECK: call i32 @atexit(void ()* [[FOO_DTOR:@"__dtor_.*foo@.*]])
// CHECK: ret void
-// CHECK: define linkonce_odr void @"\01??0A@@QAE@XZ"
+// CHECK: define linkonce_odr x86_thiscallcc void @"\01??0A@@QAE@XZ"
-// CHECK: define linkonce_odr void @"\01??1A@@QAE@XZ"
+// CHECK: define linkonce_odr x86_thiscallcc void @"\01??1A@@QAE@XZ"
// CHECK: define internal void [[FOO_DTOR]]
-// CHECK: call void @"\01??1A@@QAE@XZ"{{.*}}foo
+// CHECK: call x86_thiscallcc void @"\01??1A@@QAE@XZ"{{.*}}foo
// CHECK: ret void
// CHECK: define internal void @_GLOBAL__I_a() nounwind {
OpenPOWER on IntegriCloud