summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2018-07-26 20:25:35 +0000
committerZachary Turner <zturner@google.com>2018-07-26 20:25:35 +0000
commiteedd47c7f5ac68570b734409fd74ac653dac1985 (patch)
tree22480d006b7c4b4d7bd5ddebb368c6e7c0700aee
parent3a62886fee036b5a8a1c5627f1548f06ab80e2a8 (diff)
[MS Demangler] Add ms-arg-qualifiers.test
This converts the arg qualifier mangling tests from clang/CodeGenCXX/mangle-ms-arg-qualifiers.cpp to demangling tests. Most tests already pass, so this patch doesn't come with any functional change, just the addition of new tests. The few tests that don't pass are left in with a FIXME label so that they don't run but serve as documentation about what still doesn't work. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338067 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Demangle/MicrosoftDemangle.cpp7
-rw-r--r--test/Demangle/ms-arg-qualifiers.test248
-rw-r--r--test/Demangle/ms-mangle.test4
3 files changed, 255 insertions, 4 deletions
diff --git a/lib/Demangle/MicrosoftDemangle.cpp b/lib/Demangle/MicrosoftDemangle.cpp
index 1bf94ff8469..86a95892edb 100644
--- a/lib/Demangle/MicrosoftDemangle.cpp
+++ b/lib/Demangle/MicrosoftDemangle.cpp
@@ -483,6 +483,11 @@ void Type::outputPre(OutputStream &OS, Type &Ty) {
outputSpaceIfNecessary(OS);
OS << "volatile";
}
+
+ if (Ty.Quals & Q_Restrict) {
+ outputSpaceIfNecessary(OS);
+ OS << "__restrict";
+ }
}
// Write the "second half" of a given type.
@@ -574,8 +579,6 @@ void PointerType::outputPre(OutputStream &OS) {
// FIXME: We should output this, but it requires updating lots of tests.
// if (Ty.Quals & Q_Pointer64)
// OS << " __ptr64";
- if (Quals & Q_Restrict)
- OS << " __restrict";
}
void PointerType::outputPost(OutputStream &OS) {
diff --git a/test/Demangle/ms-arg-qualifiers.test b/test/Demangle/ms-arg-qualifiers.test
new file mode 100644
index 00000000000..cf83ab02119
--- /dev/null
+++ b/test/Demangle/ms-arg-qualifiers.test
@@ -0,0 +1,248 @@
+; These tests are based on clang/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp
+; RUN: llvm-undname < %s | FileCheck %s
+
+; CHECK-NOT: Invalid mangled name
+
+?foo@@YAXI@Z
+; CHECK: void __cdecl foo(unsigned int)
+
+?foo@@YAXN@Z
+; CHECK: void __cdecl foo(double)
+
+?foo_pad@@YAXPAD@Z
+?foo_pad@@YAXPEAD@Z
+; CHECK: void __cdecl foo_pad(char *)
+
+?foo_pbd@@YAXPBD@Z
+?foo_pbd@@YAXPEBD@Z
+; CHECK: void __cdecl foo_pbd(char const *)
+
+?foo_pcd@@YAXPCD@Z
+?foo_pcd@@YAXPECD@Z
+; CHECK: void __cdecl foo_pcd(char volatile *)
+
+?foo_qad@@YAXQAD@Z
+?foo_qad@@YAXQEAD@Z
+; CHECK: void __cdecl foo_qad(char *const)
+
+?foo_rad@@YAXRAD@Z
+?foo_rad@@YAXREAD@Z
+; CHECK: void __cdecl foo_rad(char *volatile)
+
+?foo_sad@@YAXSAD@Z
+?foo_sad@@YAXSEAD@Z
+; CHECK: void __cdecl foo_sad(char *const volatile)
+
+?foo_piad@@YAXPIAD@Z
+?foo_piad@@YAXPEIAD@Z
+; CHECK: void __cdecl foo_piad(char *__restrict)
+
+?foo_qiad@@YAXQIAD@Z
+?foo_qiad@@YAXQEIAD@Z
+; CHECK: void __cdecl foo_qiad(char *const __restrict)
+
+?foo_riad@@YAXRIAD@Z
+?foo_riad@@YAXREIAD@Z
+; CHECK: void __cdecl foo_riad(char *volatile __restrict)
+
+?foo_siad@@YAXSIAD@Z
+?foo_siad@@YAXSEIAD@Z
+; CHECK: void __cdecl foo_siad(char *const volatile __restrict)
+
+?foo_papad@@YAXPAPAD@Z
+?foo_papad@@YAXPEAPEAD@Z
+; CHECK: void __cdecl foo_papad(char **)
+
+?foo_papbd@@YAXPAPBD@Z
+?foo_papbd@@YAXPEAPEBD@Z
+; CHECK: void __cdecl foo_papbd(char const **)
+
+?foo_papcd@@YAXPAPCD@Z
+?foo_papcd@@YAXPEAPECD@Z
+; CHECK: void __cdecl foo_papcd(char volatile **)
+
+?foo_pbqad@@YAXPBQAD@Z
+?foo_pbqad@@YAXPEBQEAD@Z
+; CHECK: void __cdecl foo_pbqad(char *const *)
+
+?foo_pcrad@@YAXPCRAD@Z
+?foo_pcrad@@YAXPECREAD@Z
+; CHECK: void __cdecl foo_pcrad(char *volatile *)
+
+?foo_qapad@@YAXQAPAD@Z
+?foo_qapad@@YAXQEAPEAD@Z
+; CHECK: void __cdecl foo_qapad(char **const)
+
+?foo_rapad@@YAXRAPAD@Z
+?foo_rapad@@YAXREAPEAD@Z
+; CHECK: void __cdecl foo_rapad(char **volatile)
+
+?foo_pbqbd@@YAXPBQBD@Z
+?foo_pbqbd@@YAXPEBQEBD@Z
+; CHECK: void __cdecl foo_pbqbd(char const *const *)
+
+?foo_pbqcd@@YAXPBQCD@Z
+?foo_pbqcd@@YAXPEBQECD@Z
+; CHECK: void __cdecl foo_pbqcd(char volatile *const *)
+
+?foo_pcrbd@@YAXPCRBD@Z
+?foo_pcrbd@@YAXPECREBD@Z
+; CHECK: void __cdecl foo_pcrbd(char const *volatile *)
+
+?foo_pcrcd@@YAXPCRCD@Z
+?foo_pcrcd@@YAXPECRECD@Z
+; CHECK: void __cdecl foo_pcrcd(char volatile *volatile *)
+
+?foo_aad@@YAXAAD@Z
+?foo_aad@@YAXAEAD@Z
+; CHECK: void __cdecl foo_aad(char &)
+
+?foo_abd@@YAXABD@Z
+?foo_abd@@YAXAEBD@Z
+; CHECK: void __cdecl foo_abd(char const &)
+
+?foo_aapad@@YAXAAPAD@Z
+?foo_aapad@@YAXAEAPEAD@Z
+; CHECK: void __cdecl foo_aapad(char *&)
+
+?foo_aapbd@@YAXAAPBD@Z
+?foo_aapbd@@YAXAEAPEBD@Z
+; CHECK: void __cdecl foo_aapbd(char const *&)
+
+?foo_abqad@@YAXABQAD@Z
+?foo_abqad@@YAXAEBQEAD@Z
+; CHECK: void __cdecl foo_abqad(char *const &)
+
+?foo_abqbd@@YAXABQBD@Z
+?foo_abqbd@@YAXAEBQEBD@Z
+; CHECK: void __cdecl foo_abqbd(char const *const &)
+
+?foo_aay144h@@YAXAAY144H@Z
+?foo_aay144h@@YAXAEAY144H@Z
+; CHECK: void __cdecl foo_aay144h(int (&)[5][5])
+
+?foo_aay144cbh@@YAXAAY144$$CBH@Z
+?foo_aay144cbh@@YAXAEAY144$$CBH@Z
+; CHECK: void __cdecl foo_aay144cbh(int const (&)[5][5])
+
+; FIXME: We don't support rvalue references yet
+; ?foo_qay144h@@YAX$$QAY144H@Z
+; ?foo_qay144h@@YAX$$QEAY144H@Z
+; FIXME: void __cdecl foo_qay144h(int (&&)[5][5])
+
+; FIXME: We don't support rvalue references yet
+; ?foo_qay144cbh@@YAX$$QAY144$$CBH@Z
+; ?foo_qay144cbh@@YAX$$QEAY144$$CBH@Z
+; FIXME: void __cdecl foo_qay144cbh(int const (&&)[5][5])
+
+?foo_p6ahxz@@YAXP6AHXZ@Z
+?foo_p6ahxz@@YAXP6AHXZ@Z
+; CHECK: void __cdecl foo_p6ahxz(int __cdecl (*)(void))
+
+?foo_a6ahxz@@YAXA6AHXZ@Z
+?foo_a6ahxz@@YAXA6AHXZ@Z
+; CHECK: void __cdecl foo_a6ahxz(int __cdecl (&)(void))
+
+; FIXME: We don't support rvalue references yet
+; ?foo_q6ahxz@@YAX$$Q6AHXZ@Z
+; ?foo_q6ahxz@@YAX$$Q6AHXZ@Z
+; FIXME: void __cdecl foo_q6ahxz(int __cdecl (&&)(void))
+
+?foo_qay04h@@YAXQAY04H@Z
+?foo_qay04h@@YAXQEAY04H@Z
+; CHECK: void __cdecl foo_qay04h(int (*const)[5])
+
+?foo_qay04cbh@@YAXQAY04$$CBH@Z
+?foo_qay04cbh@@YAXQEAY04$$CBH@Z
+; CHECK: void __cdecl foo_qay04cbh(int const (*const)[5])
+
+?foo@@YAXPAY02N@Z
+?foo@@YAXPEAY02N@Z
+; CHECK: void __cdecl foo(double (*)[3])
+
+?foo@@YAXQAN@Z
+?foo@@YAXQEAN@Z
+; CHECK: void __cdecl foo(double *const)
+
+?foo_const@@YAXQBN@Z
+?foo_const@@YAXQEBN@Z
+; CHECK: void __cdecl foo_const(double const *const)
+
+?foo_volatile@@YAXQCN@Z
+?foo_volatile@@YAXQECN@Z
+; CHECK: void __cdecl foo_volatile(double volatile *const)
+
+?foo@@YAXPAY02NQBNN@Z
+?foo@@YAXPEAY02NQEBNN@Z
+; CHECK: void __cdecl foo(double (*)[3], double const *const, double)
+
+?foo_fnptrconst@@YAXP6AXQAH@Z@Z
+?foo_fnptrconst@@YAXP6AXQEAH@Z@Z
+; CHECK: void __cdecl foo_fnptrconst(void __cdecl (*)(int *const))
+
+?foo_fnptrarray@@YAXP6AXQAH@Z@Z
+?foo_fnptrarray@@YAXP6AXQEAH@Z@Z
+; CHECK: void __cdecl foo_fnptrarray(void __cdecl (*)(int *const))
+
+; ?foo_fnptrbackref1@@YAXP6AXQAH@Z1@Z
+; ?foo_fnptrbackref1@@YAXP6AXQEAH@Z1@Z
+; FIXME: void __cdecl foo_fnptrbackref1(void __cdecl (*)(int *const), void __cdecl (*)(int *const))
+
+; ?foo_fnptrbackref2@@YAXP6AXQAH@Z1@Z
+; ?foo_fnptrbackref2@@YAXP6AXQEAH@Z1@Z
+; FIXME: void __cdecl foo_fnptrbackref2(void __cdecl (*)(int *const), void __cdecl (*)(int *const))
+
+; ?foo_fnptrbackref3@@YAXP6AXQAH@Z1@Z
+; ?foo_fnptrbackref3@@YAXP6AXQEAH@Z1@Z
+; FIXME: void __cdecl foo_fnptrbackref3(void (*)(int *const), void (*)(int *))
+
+; ?foo_fnptrbackref4@@YAXP6AXPAH@Z1@Z
+; ?foo_fnptrbackref4@@YAXP6AXPEAH@Z1@Z
+; FIXME: void __cdecl foo_fnptrbackref4(void (*)(int *), void (*)(int *const))
+
+?ret_fnptrarray@@YAP6AXQAH@ZXZ
+?ret_fnptrarray@@YAP6AXQEAH@ZXZ
+; CHECK: void __cdecl (* __cdecl ret_fnptrarray(void))(int *const)
+
+; The first argument gets mangled as-if it were written int *const
+; The second arg should not form a backref because it isn't qualified
+?mangle_no_backref0@@YAXQAHPAH@Z
+?mangle_no_backref0@@YAXQEAHPEAH@Z
+; CHECK: void __cdecl mangle_no_backref0(int *const, int *)
+
+?mangle_no_backref1@@YAXQAHQAH@Z
+?mangle_no_backref1@@YAXQEAHQEAH@Z
+; CHECK: void __cdecl mangle_no_backref1(int *const, int *const)
+
+; Pointer to function types don't backref with function types
+?mangle_no_backref2@@YAXP6AXXZP6AXXZ@Z
+?mangle_no_backref2@@YAXP6AXXZP6AXXZ@Z
+; CHECK: void __cdecl mangle_no_backref2(void __cdecl (*)(void), void __cdecl (*)(void))
+
+?mangle_yes_backref0@@YAXQAH0@Z
+?mangle_yes_backref0@@YAXQEAH0@Z
+; CHECK: void __cdecl mangle_yes_backref0(int *const, int *const)
+
+?mangle_yes_backref1@@YAXQAH0@Z
+?mangle_yes_backref1@@YAXQEAH0@Z
+; CHECK: void __cdecl mangle_yes_backref1(int *const, int *const)
+
+?mangle_yes_backref2@@YAXQBQ6AXXZ0@Z
+?mangle_yes_backref2@@YAXQEBQ6AXXZ0@Z
+; CHECK: void __cdecl mangle_yes_backref2(void __cdecl (*const *const)(void), void __cdecl (*const *const)(void))
+
+?mangle_yes_backref3@@YAXQAP6AXXZ0@Z
+?mangle_yes_backref3@@YAXQEAP6AXXZ0@Z
+; CHECK: void __cdecl mangle_yes_backref3(void __cdecl (**const)(void), void __cdecl (**const)(void))
+
+?mangle_yes_backref4@@YAXQIAH0@Z
+?mangle_yes_backref4@@YAXQEIAH0@Z
+; CHECK: void __cdecl mangle_yes_backref4(int *const __restrict, int *const __restrict)
+
+?pr23325@@YAXQBUS@@0@Z
+?pr23325@@YAXQEBUS@@0@Z
+; CHECK: void __cdecl pr23325(struct S const *const, struct S const *const)
+
+; ?vla_arg@@YAXHQAY0A@H@Z
+; ?vla_arg@@YAXHQEAY0A@H@Z
+; FIXME: void __cdecl vla_arg(int i, int (*const)[0])
diff --git a/test/Demangle/ms-mangle.test b/test/Demangle/ms-mangle.test
index 3925a1bfb12..ae251d0952b 100644
--- a/test/Demangle/ms-mangle.test
+++ b/test/Demangle/ms-mangle.test
@@ -82,10 +82,10 @@
; CHECK: int const *const h2
?h3@@3QIAHIA
-; CHECK: int * __restrict const h3
+; CHECK: int *const __restrict h3
?h3@@3QEIAHEIA
-; CHECK: int * __restrict const h3
+; CHECK: int *const __restrict h3
?i@@3PAY0BE@HA
; CHECK: int (*i)[20]