diff options
Diffstat (limited to 'llvm/test/Demangle/ms-mangle.test')
-rw-r--r-- | llvm/test/Demangle/ms-mangle.test | 363 |
1 files changed, 363 insertions, 0 deletions
diff --git a/llvm/test/Demangle/ms-mangle.test b/llvm/test/Demangle/ms-mangle.test new file mode 100644 index 00000000000..18e260b30c6 --- /dev/null +++ b/llvm/test/Demangle/ms-mangle.test @@ -0,0 +1,363 @@ +; These tests are based on clang/test/CodeGenCXX/mangle-ms.cpp +; RUN: llvm-undname < %s | FileCheck %s + +; CHECK-NOT: Invalid mangled name + +?k@@3PTfoo@@DT1 + + +?a@@3HA +; CHECK: int a + +?b@N@@3HA +; CHECK: int N::b + +?anonymous@?A@N@@3HA +; CHECK: int N::`anonymous namespace'::anonymous + +?_c@@YAHXZ +; CHECK: int __cdecl _c(void) + +?d@foo@@0FB +; CHECK: static short const foo::d + +?e@foo@@1JC +; CHECK: static long volatile foo::e + +?f@foo@@2DD +; CHECK: static char const volatile foo::f + +??0foo@@QAE@XZ +; CHECK: __thiscall foo::foo(void) + +??0foo@@QEAA@XZ +; CHECK: __cdecl foo::foo(void) + +??1foo@@QAE@XZ +; CHECK: __thiscall foo::~foo(void) + +??1foo@@QEAA@XZ +; CHECK: __cdecl foo::~foo(void) + +??0foo@@QAE@H@Z +; CHECK: __thiscall foo::foo(int) + +??0foo@@QEAA@H@Z +; CHECK: __cdecl foo::foo(int) + +??0foo@@QAE@PAD@Z +; CHECK: __thiscall foo::foo(char *) + +??0foo@@QEAA@PEAD@Z +; CHECK: __cdecl foo::foo(char *) + +?bar@@YA?AVfoo@@XZ +; CHECK: class foo __cdecl bar(void) + +?bar@@YA?AVfoo@@XZ +; CHECK: class foo __cdecl bar(void) + +??Hfoo@@QAEHH@Z +; CHECK: int __thiscall foo::operator+(int) + +??Hfoo@@QEAAHH@Z +; CHECK: int __cdecl foo::operator+(int) + +?static_method@foo@@SAPAV1@XZ +; CHECK: static class foo *__cdecl foo::static_method(void) + +?static_method@foo@@SAPEAV1@XZ +; CHECK: static class foo *__cdecl foo::static_method(void) + +?g@bar@@2HA +; CHECK: static int bar::g + +; undname returns `int *h1`, but it is a bug in their demangler. Their mangler +; correctly mangles `int *h1` as ?h1@3PAHA and `int * const h1` as ?h1@3QAHA +?h1@@3QAHA +; CHECK: int *const h1 + +?h2@@3QBHB +; CHECK: int const *const h2 + +?h3@@3QIAHIA +; CHECK: int * __restrict const h3 + +?h3@@3QEIAHEIA +; CHECK: int * __restrict const h3 + +?i@@3PAY0BE@HA +; CHECK: int (*i)[20] + +?FunArr@@3PAY0BE@P6AHHH@ZA +; CHECK: int __cdecl (*(*FunArr)[20])(int, int) + +?j@@3P6GHCE@ZA +; CHECK: int __stdcall (*j)(signed char, unsigned char) + + +; FIXME: We don't handle member pointers yet. +; ?k@@3PTfoo@@DT1 +; FIXME: char const volatile foo::*k + +; ?k@@3PETfoo@@DET1 +; FIXME: char const volatile foo::*k + +; ?l@@3P8foo@@AEHH@ZQ1 +; FIXME: int __thiscall (foo::*l)(int) + +?g_cInt@@3HB +; CHECK: int const g_cInt + +?g_vInt@@3HC +; CHECK: int volatile g_vInt + +?g_cvInt@@3HD +; CHECK: int const volatile g_cvInt + +?beta@@YI_N_J_W@Z +; CHECK: bool __fastcall beta(__int64, wchar_t) + +?beta@@YA_N_J_W@Z +; CHECK: bool __cdecl beta(__int64, wchar_t) + +?alpha@@YGXMN@Z +; CHECK: void __stdcall alpha(float, double) + +?alpha@@YAXMN@Z +; CHECK: void __cdecl alpha(float, double) + +?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z +; CHECK: void __cdecl gamma(class foo, struct bar, union baz, enum quux) + +?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z +; CHECK: void __cdecl gamma(class foo, struct bar, union baz, enum quux) + +?delta@@YAXQAHABJ@Z +; CHECK: void __cdecl delta(int *const, long const &) + +?delta@@YAXQEAHAEBJ@Z +; CHECK: void __cdecl delta(int *const, long const &) + +?epsilon@@YAXQAY19BE@H@Z +; CHECK: void __cdecl epsilon(int (*const)[10][20]) + +?epsilon@@YAXQEAY19BE@H@Z +; CHECK: void __cdecl epsilon(int (*const)[10][20]) + +?zeta@@YAXP6AHHH@Z@Z +; CHECK: void __cdecl zeta(int __cdecl (*)(int, int)) + +?zeta@@YAXP6AHHH@Z@Z +; CHECK: void __cdecl zeta(int __cdecl (*)(int, int)) + +??2@YAPAXI@Z +; CHECK: void *__cdecl operator new(unsigned int) + +??3@YAXPAX@Z +; CHECK: void __cdecl operator delete(void *) + +??_U@YAPAXI@Z +; CHECK: void *__cdecl operator new[](unsigned int) + +??_V@YAXPAX@Z +; CHECK: void __cdecl operator delete[](void *) + +?color1@@3PANA +; CHECK: double *color1 + +?color2@@3QBNB +; CHECK: double const *const color2 + +; FIXME-EXTRACONST: These tests fails because we print an extra const inside the parens. +; ?color3@@3QAY02$$CBNA +; FIXME-EXTRACONST: double const (*color3)[3] + +; ?color4@@3QAY02$$CBNA +; FIXME-EXTRACONST: double const (*color4)[3] + +; FIXME-MEMBERPTR: We don't support member pointers yet. +; ?memptr1@@3RESB@@HES1 +; FIXME-MEMBERPTR: volatile int B::*memptr2 + +; ?memptr2@@3PESB@@HES1 +; FIXME: volatile int B::*memptr2 + +; ?memptr3@@3REQB@@HEQ1 +; FIXME-MEMBERPTR: int B::* volatile memptr3 + +; ?funmemptr1@@3RESB@@R6AHXZES1 +; FIXME-MEMBERPTR: int __cdecl (* volatile B::* volatile funmemptr1)(void) + +; ?funmemptr2@@3PESB@@R6AHXZES1 +; FIXME-MEMBERPTR: int __cdecl (* volatile B::*funmemptr2)(void) + +; ?funmemptr3@@3REQB@@P6AHXZEQ1 +; FIXME-MEMBERPTR: int __cdecl (* B::*volatile funmemptr3)(void) + +; ?memptrtofun1@@3R8B@@EAAXXZEQ1 +; FIXME-MEMBERPTR: void __cdecl (B::*volatile memptrtofun1)(void) + +; ?memptrtofun2@@3P8B@@EAAXXZEQ1 +; FIXME-MEMBERPTR: void __cdecl (B::*memptrtofun2)(void) + +; ?memptrtofun3@@3P8B@@EAAXXZEQ1 +; FIXME-MEMBERPTR: void __cdecl (B::*memptrtofun3)(void) + +; ?memptrtofun4@@3R8B@@EAAHXZEQ1 +; FIXME-MEMBERPTR: int __cdecl (B::* volatile memptrtofun4)(void) + +; ?memptrtofun5@@3P8B@@EAA?CHXZEQ1 +; FIXME-MEMBERPTR: int volatile __cdecl (B::*memptrtofun5)(void) + +; ?memptrtofun6@@3P8B@@EAA?BHXZEQ1 +; FIXME-MEMBERPTR: int const __cdecl (B::*memptrtofun6)(void) + +; ?memptrtofun7@@3R8B@@EAAP6AHXZXZEQ1 +; FIXME-MEMBERPTR: int __cdecl (*(__cdecl B::*volatile memptrtofun7)(void))(void) + +; ?memptrtofun8@@3P8B@@EAAR6AHXZXZEQ1 +; FIXME-MEMBERPTR: int __cdecl (*(__cdecl B::*memptrtofun8)(void))(void) + +; ?memptrtofun9@@3P8B@@EAAQ6AHXZXZEQ1 +; FIXME-MEMBERPTR: int __cdecl(*(__cdecl B::*memptrtofun9)(void))(void) + + +?fooE@@YA?AW4E@@XZ +; CHECK: enum E __cdecl fooE(void) + +?fooE@@YA?AW4E@@XZ +; CHECK: enum E __cdecl fooE(void) + +?fooX@@YA?AVX@@XZ +; CHECK: class X __cdecl fooX(void) + +?fooX@@YA?AVX@@XZ +; CHECK: class X __cdecl fooX(void) + +?s0@PR13182@@3PADA +; CHECK: char *PR13182::s0 + +?s1@PR13182@@3PADA +; CHECK: char *PR13182::s1 + +?s2@PR13182@@3QBDB +; CHECK: char const *const PR13182::s2 + +?s3@PR13182@@3QBDB +; CHECK: char const *const PR13182::s3 + +?s4@PR13182@@3RCDC +; CHECK: char volatile *volatile PR13182::s4 + +?s5@PR13182@@3SDDD +; CHECK: char const volatile *const volatile PR13182::s5 + +; undname adds an extra const in here, but it seems like their bug. +?s6@PR13182@@3PBQBDB +; CHECK: char const *const *PR13182::s6 + +; FIXME-EXTERNC: We don't properly support static locals in extern c functions yet. +; ?local@?1??extern_c_func@@9@4HA +; FIXME-EXTERNC: int `extern_c_func'::`2'::local + +; ?local@?1??extern_c_func@@9@4HA +; FIXME-EXTERNC: int `extern_c_func'::`2'::local + +??2OverloadedNewDelete@@SAPAXI@Z +; CHECK: static void *__cdecl OverloadedNewDelete::operator new(unsigned int) + + +??_UOverloadedNewDelete@@SAPAXI@Z +; CHECK: static void *__cdecl OverloadedNewDelete::operator new[](unsigned int) + +??3OverloadedNewDelete@@SAXPAX@Z +; CHECK: static void __cdecl OverloadedNewDelete::operator delete(void *) + + +??_VOverloadedNewDelete@@SAXPAX@Z +; CHECK: static void __cdecl OverloadedNewDelete::operator delete[](void *) + +??HOverloadedNewDelete@@QAEHH@Z +; CHECK: int __thiscall OverloadedNewDelete::operator+(int) + +??2OverloadedNewDelete@@SAPEAX_K@Z +; CHECK: static void *__cdecl OverloadedNewDelete::operator new(unsigned __int64) + +??_UOverloadedNewDelete@@SAPEAX_K@Z +; CHECK: static void *__cdecl OverloadedNewDelete::operator new[](unsigned __int64) + +??3OverloadedNewDelete@@SAXPEAX@Z +; CHECK: static void __cdecl OverloadedNewDelete::operator delete(void *) + + +??_VOverloadedNewDelete@@SAXPEAX@Z +; CHECK: static void __cdecl OverloadedNewDelete::operator delete[](void *) + +??HOverloadedNewDelete@@QEAAHH@Z +; CHECK: int __cdecl OverloadedNewDelete::operator+(int) + + +??2TypedefNewDelete@@SAPAXI@Z +; CHECK: static void *__cdecl TypedefNewDelete::operator new(unsigned int) + + +??_UTypedefNewDelete@@SAPAXI@Z +; CHECK: static void *__cdecl TypedefNewDelete::operator new[](unsigned int) + +??3TypedefNewDelete@@SAXPAX@Z +; CHECK: static void __cdecl TypedefNewDelete::operator delete(void *) + +??_VTypedefNewDelete@@SAXPAX@Z +; CHECK: static void __cdecl TypedefNewDelete::operator delete[](void *) + +?vector_func@@YQXXZ +; CHECK: void __vectorcall vector_func(void) + +; FIXME-EXTERNC: We don't support extern C funcs currently. +; ??$fn_tmpl@$1?extern_c_func@@YAXXZ@@YAXXZ +; FIXME-EXTERNC: void __cdecl fn_tmpl<&void __cdecl extern_c_func(void)>(void) + +; ?overloaded_fn@@$$J0YAXXZ +; FIXME-EXTERNC: extern \"C\" void __cdecl overloaded_fn(void) + + +?f@UnnamedType@@YAXUT2@S@1@@Z +; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T2) + +?f@UnnamedType@@YAXPAUT4@S@1@@Z +; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T4 *) + +?f@UnnamedType@@YAXUT4@S@1@@Z +; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T4) + +?f@UnnamedType@@YAXUT5@S@1@@Z +; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T5) + +?f@UnnamedType@@YAXUT2@S@1@@Z +; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T2) + +?f@UnnamedType@@YAXUT4@S@1@@Z +; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T4) + +?f@UnnamedType@@YAXUT5@S@1@@Z +; CHECK: void __cdecl UnnamedType::f(struct UnnamedType::S::T5) + +?f@Atomic@@YAXU?$_Atomic@H@__clang@@@Z +; CHECK: void __cdecl Atomic::f(struct __clang::_Atomic<int>) + +?f@Complex@@YAXU?$_Complex@H@__clang@@@Z +; CHECK: void __cdecl Complex::f(struct __clang::_Complex<int>) + +?f@Float16@@YAXU_Float16@__clang@@@Z +; CHECK: void __cdecl Float16::f(struct __clang::_Float16) + + +??0?$L@H@NS@@QEAA@XZ +; CHECK: __cdecl NS::L<int>::L<int>(void) + +??0Bar@Foo@@QEAA@XZ +; CHECK: __cdecl Foo::Bar::Bar(void) + +??0?$L@V?$H@PAH@PR26029@@@PR26029@@QAE@XZ +; CHECK: __thiscall PR26029::L<class PR26029::H<int *>>::L<class PR26029::H<int *>>(void) |