summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-objdump/llvm-objdump.cpp
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2018-08-20 22:18:21 +0000
committerZachary Turner <zturner@google.com>2018-08-20 22:18:21 +0000
commit030ad37ef46a298287da6a5c78d62d54e2d77599 (patch)
treef07c8d6f4b5a1c87f3a1b46b4afdc83db27fa735 /llvm/tools/llvm-objdump/llvm-objdump.cpp
parent79d50a04c060af23642cc1f290299defb3032405 (diff)
downloadbcm5719-llvm-030ad37ef46a298287da6a5c78d62d54e2d77599.tar.gz
bcm5719-llvm-030ad37ef46a298287da6a5c78d62d54e2d77599.zip
[llvm-objdump] Add ability to demangle COFF symbols.
llvm-svn: 340221
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.cpp28
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
OpenPOWER on IntegriCloud