OSDN Git Service

llvm-undname: Correctly demangle vararg parameters
authorNico Weber <nicolasweber@gmx.de>
Tue, 4 Jun 2019 19:10:08 +0000 (19:10 +0000)
committerNico Weber <nicolasweber@gmx.de>
Tue, 4 Jun 2019 19:10:08 +0000 (19:10 +0000)
FunctionSignatureNode already had an IsVariadic field,
but it wasn't used anywhere yet. Set it and use it.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@362541 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Demangle/MicrosoftDemangle.h
include/llvm/Demangle/MicrosoftDemangleNodes.h
lib/Demangle/MicrosoftDemangle.cpp
lib/Demangle/MicrosoftDemangleNodes.cpp
test/Demangle/ms-basic.test

index 423fc2e..382e794 100644 (file)
@@ -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);
index df384e7..da9d9d5 100644 (file)
@@ -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;
 };
 
index e28420c..bf7d776 100644 (file)
@@ -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;
   }
 
index c07fde8..63ca475 100644 (file)
@@ -414,6 +414,12 @@ void FunctionSignatureNode::outputPost(OutputStream &OS,
       Params->output(OS, Flags);
     else
       OS << "void";
+
+    if (IsVariadic) {
+      if (OS.back() != '(')
+        OS << ", ";
+      OS << "...";
+    }
     OS << ")";
   }
 
index 8ba34d8..bc514b4 100644 (file)
 ; 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)