summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2019-06-04 19:10:08 +0000
committerNico Weber <nicolasweber@gmx.de>2019-06-04 19:10:08 +0000
commit1dce82636c9241b8208abe05ba02e499424338d5 (patch)
tree93eadc38febf04b3d0f32bf609b6fff79168dcf5 /llvm
parent463854846853c3e4e099d31c51edec18e00730c0 (diff)
downloadbcm5719-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.h3
-rw-r--r--llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h2
-rw-r--r--llvm/lib/Demangle/MicrosoftDemangle.cpp9
-rw-r--r--llvm/lib/Demangle/MicrosoftDemangleNodes.cpp6
-rw-r--r--llvm/test/Demangle/ms-basic.test6
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)
OpenPOWER on IntegriCloud