summaryrefslogtreecommitdiffstats
path: root/llvm/test/Demangle/ms-basic.test
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2018-07-20 17:27:48 +0000
committerZachary Turner <zturner@google.com>2018-07-20 17:27:48 +0000
commitf435a7eada02567e315371f73e64eab26829a67b (patch)
tree1761ca957da6f2600a2c2de7d107f64d914e9399 /llvm/test/Demangle/ms-basic.test
parent2628620b62d57ca68a2df7220b28c05852a9dd98 (diff)
downloadbcm5719-llvm-f435a7eada02567e315371f73e64eab26829a67b.tar.gz
bcm5719-llvm-f435a7eada02567e315371f73e64eab26829a67b.zip
Add a Microsoft Demangler.
This adds initial support for a demangling library (LLVMDemangle) and tool (llvm-undname) for demangling Microsoft names. This doesn't cover 100% of cases and there are some known limitations which I intend to address in followup patches, at least until such time that we have (near) 100% test coverage matching up with all of the test cases in clang/test/CodeGenCXX/mangle-ms-*. Differential Revision: https://reviews.llvm.org/D49552 llvm-svn: 337584
Diffstat (limited to 'llvm/test/Demangle/ms-basic.test')
-rw-r--r--llvm/test/Demangle/ms-basic.test230
1 files changed, 230 insertions, 0 deletions
diff --git a/llvm/test/Demangle/ms-basic.test b/llvm/test/Demangle/ms-basic.test
new file mode 100644
index 00000000000..17694b90284
--- /dev/null
+++ b/llvm/test/Demangle/ms-basic.test
@@ -0,0 +1,230 @@
+; RUN: llvm-undname < %s | FileCheck %s
+
+; CHECK-NOT: Invalid mangled name
+
+?x@@3HA
+; CHECK: int x
+
+?x@@3PEAHEA
+; CHECK: int *x
+
+?x@@3PEAPEAHEA
+; CHECK: int **x
+
+?x@@3PEAY02HEA
+; CHECK: int (*x)[3]
+
+?x@@3PEAY124HEA
+; CHECK: int (*x)[3][5]
+
+?x@@3PEAY02$$CBHEA
+; CHECK: int const (*x)[3]
+
+?x@@3PEAEEA
+; CHECK: unsigned char *x
+
+?x@@3PEAY1NKM@5HEA
+; CHECK: int (*x)[3500][6]
+
+?x@@YAXMH@Z
+; CHECK: void __cdecl x(float, int)
+
+?x@@3P6AHMNH@ZEA
+; CHECK: int __cdecl (*x)(float, double, int)
+
+?x@@3P6AHP6AHM@ZN@ZEA
+; CHECK: int __cdecl (*x)(int __cdecl (*)(float), double)
+
+?x@@3P6AHP6AHM@Z0@ZEA
+; CHECK: int __cdecl (*x)(int __cdecl (*)(float), int __cdecl (*)(float))
+
+?x@ns@@3HA
+; CHECK: int ns::x
+
+; Microsoft's undname doesn't handle Q correctly or the multiple occurrences
+; of the const modifier. So the results here differ, but ours are correct.
+?x@@3PEAHEA
+; CHECK: int *x
+
+?x@@3PEBHEB
+; CHECK: int const *x
+
+?x@@3QEAHEA
+; CHECK: int *const x
+
+?x@@3QEBHEB
+; CHECK: int const *const x
+
+
+?x@@3AEBHEB
+; CHECK: int const &x
+
+?x@@3PEAUty@@EA
+; CHECK: struct ty *x
+
+?x@@3PEATty@@EA
+; CHECK: union ty *x
+
+?x@@3PEAUty@@EA
+; CHECK: struct ty *x
+
+?x@@3PEAW4ty@@EA
+; CHECK: enum ty *x
+
+?x@@3PEAVty@@EA
+; CHECK: class ty *x
+
+?x@@3PEAV?$tmpl@H@@EA
+; CHECK: class tmpl<int> *x
+
+?x@@3PEAU?$tmpl@H@@EA
+; CHECK: struct tmpl<int> *x
+
+?x@@3PEAT?$tmpl@H@@EA
+; CHECK: union tmpl<int> *x
+
+?instance@@3Vklass@@A
+; CHECK: class klass instance
+
+?instance$initializer$@@3P6AXXZEA
+; CHECK: void __cdecl (*instance$initializer$)(void)
+
+??0klass@@QEAA@XZ
+; CHECK: __cdecl klass::klass(void)
+
+??1klass@@QEAA@XZ
+; CHECK: __cdecl klass::~klass(void)
+
+?x@@YAHPEAVklass@@AEAV1@@Z
+; CHECK: int __cdecl x(class klass *, class klass &)
+
+?x@ns@@3PEAV?$klass@HH@1@EA
+; CHECK: class ns::klass<int, int> *ns::x
+
+?fn@?$klass@H@ns@@QEBAIXZ
+; CHECK: unsigned int __cdecl ns::klass<int>::fn(void) const
+
+
+??4klass@@QEAAAEBV0@AEBV0@@Z
+; CHECK: class klass const &__cdecl klass::operator=(class klass const &)
+
+??7klass@@QEAA_NXZ
+; CHECK: bool __cdecl klass::operator!(void)
+
+??8klass@@QEAA_NAEBV0@@Z
+; CHECK: bool __cdecl klass::operator==(class klass const &)
+
+??9klass@@QEAA_NAEBV0@@Z
+; CHECK: bool __cdecl klass::operator!=(class klass const &)
+
+??Aklass@@QEAAH_K@Z
+; CHECK: int __cdecl klass::operator[](unsigned __int64)
+
+??Cklass@@QEAAHXZ
+; CHECK: int __cdecl klass::operator->(void)
+
+??Dklass@@QEAAHXZ
+; CHECK: int __cdecl klass::operator*(void)
+
+??Eklass@@QEAAHXZ
+; CHECK: int __cdecl klass::operator++(void)
+
+??Eklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator++(int)
+
+??Fklass@@QEAAHXZ
+; CHECK: int __cdecl klass::operator--(void)
+
+??Fklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator--(int)
+
+??Hklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator+(int)
+
+??Gklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator-(int)
+
+??Iklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator&(int)
+
+??Jklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator->*(int)
+
+??Kklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator/(int)
+
+??Mklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator<(int)
+
+??Nklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator<=(int)
+
+??Oklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator>(int)
+
+??Pklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator>=(int)
+
+??Qklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator,(int)
+
+??Rklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator()(int)
+
+??Sklass@@QEAAHXZ
+; CHECK: int __cdecl klass::operator~(void)
+
+??Tklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator^(int)
+
+??Uklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator|(int)
+
+??Vklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator&&(int)
+
+??Wklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator||(int)
+
+??Xklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator*=(int)
+
+??Yklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator+=(int)
+
+??Zklass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator-=(int)
+
+??_0klass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator/=(int)
+
+??_1klass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator%=(int)
+
+??_2klass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator>>=(int)
+
+??_3klass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator<<=(int)
+
+??_6klass@@QEAAHH@Z
+; CHECK: int __cdecl klass::operator^=(int)
+
+??6@YAAEBVklass@@AEBV0@H@Z
+; CHECK: class klass const &__cdecl operator<<(class klass const &, int)
+
+??5@YAAEBVklass@@AEBV0@_K@Z
+; CHECK: class klass const &__cdecl operator>>(class klass const &, unsigned __int64)
+
+??2@YAPEAX_KAEAVklass@@@Z
+; CHECK: void *__cdecl operator new(unsigned __int64, class klass &)
+
+??_U@YAPEAX_KAEAVklass@@@Z
+; CHECK: void *__cdecl operator new[](unsigned __int64, class klass &)
+
+??3@YAXPEAXAEAVklass@@@Z
+; CHECK: void __cdecl operator delete(void *, class klass &)
+
+??_V@YAXPEAXAEAVklass@@@Z
+; CHECK: void __cdecl operator delete[](void *, class klass &)
+
OpenPOWER on IntegriCloud