diff options
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 8cec29ebe7b..09fa0c6fff8 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -92,12 +92,11 @@ static cl::alias 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 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { 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 @@ int main(int argc, char **argv) { if (DisassembleAll || PrintSource || PrintLines) Disassemble = true; - if (Demangle.getValue() != "none" && Demangle.getValue() != "" && - Demangle.getValue() != "itanium") - warn("Unsupported demangling style"); - if (!Disassemble && !Relocations && !DynamicRelocations |