[llvm-objdump] Add ability to demangle COFF symbols.

llvm-svn: 340221
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 8cec29e..09fa0c6 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -92,12 +92,11 @@
 DisassembleAlld("D", cl::desc("Alias for --disassemble-all"),
              cl::aliasopt(DisassembleAll));
 
-cl::opt<std::string> llvm::Demangle("demangle",
-                                    cl::desc("Demangle symbols names"),
-                                    cl::ValueOptional, cl::init("none"));
+cl::opt<bool> llvm::Demangle("demangle", cl::desc("Demangle symbols names"),
+                             cl::init(false));
 
 static cl::alias DemangleShort("C", cl::desc("Alias for --demangle"),
-                               cl::aliasopt(Demangle));
+                               cl::aliasopt(llvm::Demangle));
 
 static cl::list<std::string>
 DisassembleFunctions("df",
@@ -1529,18 +1528,23 @@
         outs() << '\n' << Name << ":\n";
       };
       StringRef SymbolName = std::get<1>(Symbols[si]);
-      if (Demangle.getValue() == "" || Demangle.getValue() == "itanium") {
+      if (Demangle) {
         char *DemangledSymbol = nullptr;
         size_t Size = 0;
-        int Status;
-        DemangledSymbol =
-            itaniumDemangle(SymbolName.data(), DemangledSymbol, &Size, &Status);
-        if (Status == 0)
+        int Status = -1;
+        if (SymbolName.startswith("_Z"))
+          DemangledSymbol = itaniumDemangle(SymbolName.data(), DemangledSymbol,
+                                            &Size, &Status);
+        else if (SymbolName.startswith("?"))
+          DemangledSymbol = microsoftDemangle(SymbolName.data(),
+                                              DemangledSymbol, &Size, &Status);
+
+        if (Status == 0 && DemangledSymbol)
           PrintSymbol(StringRef(DemangledSymbol));
         else
           PrintSymbol(SymbolName);
 
-        if (Size != 0)
+        if (DemangledSymbol)
           free(DemangledSymbol);
       } else
         PrintSymbol(SymbolName);
@@ -2395,10 +2399,6 @@
   if (DisassembleAll || PrintSource || PrintLines)
     Disassemble = true;
 
-  if (Demangle.getValue() != "none" && Demangle.getValue() != "" &&
-      Demangle.getValue() != "itanium")
-    warn("Unsupported demangling style");
-
   if (!Disassemble
       && !Relocations
       && !DynamicRelocations