diff options
Diffstat (limited to 'llvm/tools/llvm-objdump')
-rw-r--r-- | llvm/tools/llvm-objdump/XCOFFDump.cpp | 30 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/XCOFFDump.h | 4 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 13 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.h | 4 |
4 files changed, 34 insertions, 17 deletions
diff --git a/llvm/tools/llvm-objdump/XCOFFDump.cpp b/llvm/tools/llvm-objdump/XCOFFDump.cpp index eedb8da..df37abb 100644 --- a/llvm/tools/llvm-objdump/XCOFFDump.cpp +++ b/llvm/tools/llvm-objdump/XCOFFDump.cpp @@ -12,7 +12,9 @@ //===----------------------------------------------------------------------===// #include "XCOFFDump.h" -#include "llvm/MC/MCDisassembler/MCDisassembler.h" + +#include "llvm-objdump.h" +#include "llvm/Demangle/Demangle.h" using namespace llvm; using namespace llvm::object; @@ -29,7 +31,14 @@ Error objdump::getXCOFFRelocationValueString(const XCOFFObjectFile *Obj, Expected<StringRef> SymNameOrErr = SymI->getName(); if (!SymNameOrErr) return SymNameOrErr.takeError(); - StringRef SymName = *SymNameOrErr; + + std::string SymName = (*SymNameOrErr).str(); + if (Demangle) + SymName = demangle(SymName); + + if (SymbolDescription) + SymName = getXCOFFSymbolDescription(createSymbolInfo(Obj, *SymI), SymName); + Result.append(SymName.begin(), SymName.end()); return Error::success(); } @@ -55,20 +64,25 @@ bool objdump::isLabel(const XCOFFObjectFile *Obj, const SymbolRef &Sym) { return false; } -void objdump::printXCOFFSymbolDescription(const SymbolInfoTy &SymbolInfo, - StringRef SymbolName) { +std::string objdump::getXCOFFSymbolDescription(const SymbolInfoTy &SymbolInfo, + StringRef SymbolName) { assert(SymbolInfo.isXCOFF() && "Must be a XCOFFSymInfo."); + std::string Result; // Dummy symbols have no symbol index. if (SymbolInfo.XCOFFSymInfo.Index) - outs() << "(idx: " << SymbolInfo.XCOFFSymInfo.Index.getValue() << ") "; - - outs() << SymbolName; + Result = ("(idx: " + Twine(SymbolInfo.XCOFFSymInfo.Index.getValue()) + + ") " + SymbolName) + .str(); + else + Result.append(SymbolName.begin(), SymbolName.end()); if (SymbolInfo.XCOFFSymInfo.StorageMappingClass && !SymbolInfo.XCOFFSymInfo.IsLabel) { const XCOFF::StorageMappingClass Smc = SymbolInfo.XCOFFSymInfo.StorageMappingClass.getValue(); - outs() << "[" << XCOFF::getMappingClassString(Smc) << "]"; + Result.append(("[" + XCOFF::getMappingClassString(Smc) + "]").str()); } + + return Result; } diff --git a/llvm/tools/llvm-objdump/XCOFFDump.h b/llvm/tools/llvm-objdump/XCOFFDump.h index f4b64e7..dbf5200 100644 --- a/llvm/tools/llvm-objdump/XCOFFDump.h +++ b/llvm/tools/llvm-objdump/XCOFFDump.h @@ -22,8 +22,8 @@ getXCOFFSymbolCsectSMC(const object::XCOFFObjectFile *Obj, bool isLabel(const object::XCOFFObjectFile *Obj, const object::SymbolRef &Sym); -void printXCOFFSymbolDescription(const SymbolInfoTy &SymbolInfo, - StringRef SymbolName); +std::string getXCOFFSymbolDescription(const SymbolInfoTy &SymbolInfo, + StringRef SymbolName); Error getXCOFFRelocationValueString(const object::XCOFFObjectFile *Obj, const object::RelocationRef &RelRef, diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 4ce8f69..92c130b 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -131,11 +131,11 @@ static cl::alias DisassembleAllShort("D", cl::NotHidden, cl::Grouping, cl::aliasopt(DisassembleAll)); -static cl::opt<bool> - SymbolDescription("symbol-description", - cl::desc("Add symbol description for disassembly. This " - "option is for XCOFF files only"), - cl::init(false), cl::cat(ObjdumpCat)); +cl::opt<bool> objdump::SymbolDescription( + "symbol-description", + cl::desc("Add symbol description for disassembly. This " + "option is for XCOFF files only"), + cl::init(false), cl::cat(ObjdumpCat)); static cl::list<std::string> DisassembleSymbols("disassemble-symbols", cl::CommaSeparated, @@ -1422,8 +1422,7 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, outs() << format(Is64Bits ? "%016" PRIx64 " " : "%08" PRIx64 " ", SectionAddr + Start + VMAAdjustment); if (Obj->isXCOFF() && SymbolDescription) { - printXCOFFSymbolDescription(Symbols[SI], SymbolName); - outs() << ":\n"; + outs() << getXCOFFSymbolDescription(Symbols[SI], SymbolName) << ":\n"; } else outs() << '<' << SymbolName << ">:\n"; diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h index 18fd903..360ff09 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -10,6 +10,7 @@ #include "llvm/ADT/StringSet.h" #include "llvm/DebugInfo/DIContext.h" +#include "llvm/MC/MCDisassembler/MCDisassembler.h" #include "llvm/Object/Archive.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Compiler.h" @@ -43,6 +44,7 @@ extern cl::opt<bool> PrivateHeaders; extern cl::opt<bool> Relocations; extern cl::opt<bool> SectionHeaders; extern cl::opt<bool> SectionContents; +extern cl::opt<bool> SymbolDescription; extern cl::opt<bool> SymbolTable; extern cl::opt<std::string> TripleName; extern cl::opt<bool> UnwindInfo; @@ -151,6 +153,8 @@ T unwrapOrError(Expected<T> EO, Ts &&... Args) { std::string getFileNameForError(const object::Archive::Child &C, unsigned Index); +SymbolInfoTy createSymbolInfo(const object::ObjectFile *Obj, + const object::SymbolRef &Symbol); } // end namespace llvm |