diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-10-16 01:40:34 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-10-16 01:40:34 +0000 |
| commit | 002667c32ba09940b899edf78bbb93d8137a87e3 (patch) | |
| tree | 6240e5cf8a1ccaff21ead0e85bd837bee78eae37 /clang/test | |
| parent | d2b497b522c3b2524518aac1283da508e88d7700 (diff) | |
| download | bcm5719-llvm-002667c32ba09940b899edf78bbb93d8137a87e3.tar.gz bcm5719-llvm-002667c32ba09940b899edf78bbb93d8137a87e3.zip | |
On 32 bit windows, mangle stdcall and fastcall decls in clang.
This removes the dependency on the llvm mangler doing it for us. In isolation,
the benefit is that the testing of what mangling is applied is all in one place:
(C, C++) X (Itanium, Microsoft) are all handled by clang.
This also gives me hope that in the future the llvm mangler (and llvm-ar) will
not depend on TargetMachine.
llvm-svn: 192762
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/CodeGen/mangle-windows-rtd.c | 10 | ||||
| -rw-r--r-- | clang/test/CodeGen/mangle-windows.c | 34 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/mangle-windows.cpp | 42 |
3 files changed, 86 insertions, 0 deletions
diff --git a/clang/test/CodeGen/mangle-windows-rtd.c b/clang/test/CodeGen/mangle-windows-rtd.c new file mode 100644 index 00000000000..fc6f309eaf5 --- /dev/null +++ b/clang/test/CodeGen/mangle-windows-rtd.c @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -emit-llvm -mrtd %s -o - -triple=i386-mingw32 | FileCheck %s + +void f1(void) {} +// CHECK: define x86_stdcallcc void @"\01_f1@0" + +void __stdcall f2(void) {} +// CHECK: define x86_stdcallcc void @"\01_f2@0" + +void __fastcall f3(void) {} +// CHECK: define x86_fastcallcc void @"\01@f3@0" diff --git a/clang/test/CodeGen/mangle-windows.c b/clang/test/CodeGen/mangle-windows.c new file mode 100644 index 00000000000..670649216dd --- /dev/null +++ b/clang/test/CodeGen/mangle-windows.c @@ -0,0 +1,34 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft \ +// RUN: -triple=i386-pc-win32 | FileCheck %s +// RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-mingw32 | FileCheck %s + +void __stdcall f1(void) {} +// CHECK: define x86_stdcallcc void @"\01_f1@0" + +void __fastcall f2(void) {} +// CHECK: define x86_fastcallcc void @"\01@f2@0" + +void __stdcall f3() {} +// CHECK: define x86_stdcallcc void @"\01_f3@0" + +void __fastcall f4(char a) {} +// CHECK: define x86_fastcallcc void @"\01@f4@4" + +void __fastcall f5(short a) {} +// CHECK: define x86_fastcallcc void @"\01@f5@4" + +void __fastcall f6(int a) {} +// CHECK: define x86_fastcallcc void @"\01@f6@4" + +void __fastcall f7(long a) {} +// CHECK: define x86_fastcallcc void @"\01@f7@4" + +void __fastcall f8(long long a) {} +// CHECK: define x86_fastcallcc void @"\01@f8@8" + +void __fastcall f9(long long a, char b, char c, short d) {} +// CHECK: define x86_fastcallcc void @"\01@f9@20"(i64 %a, i8 signext %b, i8 +// signext %c, i16 signext %d) + +void f12(void) {} +// CHECK: define void @f12( diff --git a/clang/test/CodeGenCXX/mangle-windows.cpp b/clang/test/CodeGenCXX/mangle-windows.cpp new file mode 100644 index 00000000000..c087616875c --- /dev/null +++ b/clang/test/CodeGenCXX/mangle-windows.cpp @@ -0,0 +1,42 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft \ +// RUN: -triple=i386-pc-win32 | FileCheck --check-prefix=WIN %s +// +// RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-mingw32 | \ +// RUN: FileCheck --check-prefix=ITANIUM %s + +void __stdcall f1(void) {} +// WIN: define x86_stdcallcc void @"\01?f1@@YGXXZ" +// ITANIUM: define x86_stdcallcc void @"\01__Z2f1v@0" + +void __fastcall f2(void) {} +// WIN: define x86_fastcallcc void @"\01?f2@@YIXXZ" +// ITANIUM: define x86_fastcallcc void @"\01@_Z2f2v@0" + +extern "C" void __stdcall f3(void) {} +// WIN: define x86_stdcallcc void @"\01_f3@0" +// ITANIUM: define x86_stdcallcc void @"\01_f3@0" + +extern "C" void __fastcall f4(void) {} +// WIN: define x86_fastcallcc void @"\01@f4@0" +// ITANIUM: define x86_fastcallcc void @"\01@f4@0" + +struct Foo { + void __stdcall foo(); + static void __stdcall bar(); +}; + +void Foo::foo() {} +// WIN: define x86_stdcallcc void @"\01?foo@Foo@@QAGXXZ" +// ITANIUM: define x86_stdcallcc void @"\01__ZN3Foo3fooEv@4" + +void Foo::bar() {} +// WIN: define x86_stdcallcc void @"\01?bar@Foo@@SGXXZ" +// ITANIUM: define x86_stdcallcc void @"\01__ZN3Foo3barEv@0" + +// Mostly a test that we don't crash and that the names start with a \01. +// gcc on mingw produces __Zpp@4 +// cl produces _++@4 +extern "C" void __stdcall operator++(Foo &x) { +} +// WIN: define x86_stdcallcc void @"\01??E@YGXAAUFoo@@@Z" +// ITANIUM: define x86_stdcallcc void @"\01__ZppR3Foo@4" |

