diff options
| author | Nico Weber <nicolasweber@gmx.de> | 2019-06-04 19:10:08 +0000 |
|---|---|---|
| committer | Nico Weber <nicolasweber@gmx.de> | 2019-06-04 19:10:08 +0000 |
| commit | 1dce82636c9241b8208abe05ba02e499424338d5 (patch) | |
| tree | 93eadc38febf04b3d0f32bf609b6fff79168dcf5 /llvm | |
| parent | 463854846853c3e4e099d31c51edec18e00730c0 (diff) | |
| download | bcm5719-llvm-1dce82636c9241b8208abe05ba02e499424338d5.tar.gz bcm5719-llvm-1dce82636c9241b8208abe05ba02e499424338d5.zip | |
llvm-undname: Correctly demangle vararg parameters
FunctionSignatureNode already had an IsVariadic field,
but it wasn't used anywhere yet. Set it and use it.
llvm-svn: 362541
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/Demangle/MicrosoftDemangle.h | 3 | ||||
| -rw-r--r-- | llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h | 2 | ||||
| -rw-r--r-- | llvm/lib/Demangle/MicrosoftDemangle.cpp | 9 | ||||
| -rw-r--r-- | llvm/lib/Demangle/MicrosoftDemangleNodes.cpp | 6 | ||||
| -rw-r--r-- | llvm/test/Demangle/ms-basic.test | 6 |
5 files changed, 17 insertions, 9 deletions
diff --git a/llvm/include/llvm/Demangle/MicrosoftDemangle.h b/llvm/include/llvm/Demangle/MicrosoftDemangle.h index 423fc2eac85..382e79401c4 100644 --- a/llvm/include/llvm/Demangle/MicrosoftDemangle.h +++ b/llvm/include/llvm/Demangle/MicrosoftDemangle.h @@ -177,8 +177,9 @@ private: ArrayTypeNode *demangleArrayType(StringView &MangledName); + NodeArrayNode *demangleFunctionParameterList(StringView &MangledName, + bool &IsVariadic); NodeArrayNode *demangleTemplateParameterList(StringView &MangledName); - NodeArrayNode *demangleFunctionParameterList(StringView &MangledName); std::pair<uint64_t, bool> demangleNumber(StringView &MangledName); uint64_t demangleUnsigned(StringView &MangledName); diff --git a/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h b/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h index df384e7362a..da9d9d5bfdc 100644 --- a/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h +++ b/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h @@ -344,7 +344,7 @@ struct FunctionSignatureNode : public TypeNode { // Function parameters NodeArrayNode *Params = nullptr; - // True if the function type is noexcept + // True if the function type is noexcept. bool IsNoexcept = false; }; diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp index e28420c4a13..bf7d77638f3 100644 --- a/llvm/lib/Demangle/MicrosoftDemangle.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp @@ -1826,7 +1826,7 @@ FunctionSignatureNode *Demangler::demangleFunctionType(StringView &MangledName, if (!IsStructor) FTy->ReturnType = demangleType(MangledName, QualifierMangleMode::Result); - FTy->Params = demangleFunctionParameterList(MangledName); + FTy->Params = demangleFunctionParameterList(MangledName, FTy->IsVariadic); FTy->IsNoexcept = demangleThrowSpecification(MangledName); @@ -2094,8 +2094,8 @@ ArrayTypeNode *Demangler::demangleArrayType(StringView &MangledName) { } // Reads a function's parameters. -NodeArrayNode * -Demangler::demangleFunctionParameterList(StringView &MangledName) { +NodeArrayNode *Demangler::demangleFunctionParameterList(StringView &MangledName, + bool &IsVariadic) { // Empty parameter list. if (MangledName.consumeFront('X')) return nullptr; @@ -2152,8 +2152,7 @@ Demangler::demangleFunctionParameterList(StringView &MangledName) { return NA; if (MangledName.consumeFront('Z')) { - // This is a variadic parameter list. We probably need a variadic node to - // append to the end. + IsVariadic = true; return NA; } diff --git a/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp b/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp index c07fde897e0..63ca475ec1f 100644 --- a/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp @@ -414,6 +414,12 @@ void FunctionSignatureNode::outputPost(OutputStream &OS, Params->output(OS, Flags); else OS << "void"; + + if (IsVariadic) { + if (OS.back() != '(') + OS << ", "; + OS << "..."; + } OS << ")"; } diff --git a/llvm/test/Demangle/ms-basic.test b/llvm/test/Demangle/ms-basic.test index 8ba34d871f1..bc514b4e0c6 100644 --- a/llvm/test/Demangle/ms-basic.test +++ b/llvm/test/Demangle/ms-basic.test @@ -39,8 +39,10 @@ ; CHECK: void __cdecl x(float, int) ?x@@YAXMHZZ -; FIXME: This should be `(float, int, ...)` -; CHECK: void __cdecl x(float, int) +; CHECK: void __cdecl x(float, int, ...) + +?x@@YAXZZ +; CHECK: void __cdecl x(...) ?x@@3P6AHMNH@ZEA ; CHECK: int (__cdecl *x)(float, double, int) |

