diff options
author | zhijian <zhijian@ca.ibm.com> | 2021-10-01 12:37:51 -0400 |
---|---|---|
committer | zhijian <zhijian@ca.ibm.com> | 2021-10-01 12:37:51 -0400 |
commit | 5b44c716ee0ffcb0b8943b9e76eb69473188768a (patch) | |
tree | 443f343da450e00eccad87dbfab84e59bcd2d59d /llvm/tools/llvm-objdump/llvm-objdump.cpp | |
parent | 907d5da3da195d2e3a78d5b36807cf44a13c3f25 (diff) | |
download | llvm-5b44c716ee0ffcb0b8943b9e76eb69473188768a.zip llvm-5b44c716ee0ffcb0b8943b9e76eb69473188768a.tar.gz llvm-5b44c716ee0ffcb0b8943b9e76eb69473188768a.tar.bz2 |
[AIX]implement the --syms and using "symbol index and qualname" for --sym --symbol--description for llvm-objdump for xcoff
Summary:
for xcoff :
implement the getSymbolFlag and getSymbolType() for option --syms.
llvm-objdump --sym , if the symbol is label, print the containing section for the symbol too.
when using llvm-objdump --sym --symbol--description, print the symbol index and qualname for symbol.
for example:
--symbol-description
00000000000000c0 l .text (csect: (idx: 2) .foov[PR]) (idx: 3) .foov
and without --symbol-description
00000000000000c0 l .text (csect: .foov) .foov
Reviewers: James Henderson,Esme Yi
Differential Revision: https://reviews.llvm.org/D109452
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 57 |
1 files changed, 48 insertions, 9 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index bb4a871..32c04bd 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -2050,21 +2050,56 @@ void objdump::printSymbol(const ObjectFile *O, const SymbolRef &Symbol, } else if (Common) { outs() << "*COM*"; } else if (Section == O->section_end()) { - outs() << "*UND*"; + if (O->isXCOFF()) { + XCOFFSymbolRef XCOFFSym = dyn_cast<const XCOFFObjectFile>(O)->toSymbolRef( + Symbol.getRawDataRefImpl()); + if (XCOFF::N_DEBUG == XCOFFSym.getSectionNumber()) + outs() << "*DEBUG*"; + else + outs() << "*UND*"; + } else + outs() << "*UND*"; } else { StringRef SegmentName = getSegmentName(MachO, *Section); if (!SegmentName.empty()) outs() << SegmentName << ","; StringRef SectionName = unwrapOrError(Section->getName(), FileName); outs() << SectionName; - } + if (O->isXCOFF()) { + Optional<SymbolRef> SymRef = getXCOFFSymbolContainingSymbolRef( + dyn_cast<const XCOFFObjectFile>(O), Symbol); + if (SymRef) { + + Expected<StringRef> NameOrErr = SymRef.getValue().getName(); + + if (NameOrErr) { + outs() << " (csect:"; + std::string SymName(NameOrErr.get()); + + if (Demangle) + SymName = demangle(SymName); + + if (SymbolDescription) + SymName = getXCOFFSymbolDescription( + createSymbolInfo(O, SymRef.getValue()), SymName); - if (Common || O->isELF()) { - uint64_t Val = - Common ? Symbol.getAlignment() : ELFSymbolRef(Symbol).getSize(); - outs() << '\t' << format(Fmt, Val); + outs() << ' ' << SymName; + outs() << ") "; + } else + reportWarning(toString(NameOrErr.takeError()), FileName); + } + } } + if (Common) + outs() << '\t' << format(Fmt, Symbol.getAlignment()); + else if (O->isXCOFF()) + outs() << '\t' + << format(Fmt, dyn_cast<const XCOFFObjectFile>(O)->getSymbolSize( + Symbol.getRawDataRefImpl())); + else if (O->isELF()) + outs() << '\t' << format(Fmt, ELFSymbolRef(Symbol).getSize()); + if (O->isELF()) { if (!SymbolVersions.empty()) { const VersionEntry &Ver = @@ -2096,10 +2131,14 @@ void objdump::printSymbol(const ObjectFile *O, const SymbolRef &Symbol, outs() << " .hidden"; } + std::string SymName(Name); if (Demangle) - outs() << ' ' << demangle(std::string(Name)) << '\n'; - else - outs() << ' ' << Name << '\n'; + SymName = demangle(SymName); + + if (O->isXCOFF() && SymbolDescription) + SymName = getXCOFFSymbolDescription(createSymbolInfo(O, Symbol), SymName); + + outs() << ' ' << SymName << '\n'; } static void printUnwindInfo(const ObjectFile *O) { |