diff options
| author | Sean Fertile <sfertile@ca.ibm.com> | 2019-07-09 18:09:11 +0000 |
|---|---|---|
| committer | Sean Fertile <sfertile@ca.ibm.com> | 2019-07-09 18:09:11 +0000 |
| commit | 837ae69f8b9d8fbb0a53b9a58b85496fa1962ba5 (patch) | |
| tree | 3715adc7429a350c9cd20013cf9f75f0eb30674d /llvm/tools | |
| parent | 5f4d7c9d4f20f85bbcd814b324aec5f3f2107d26 (diff) | |
| download | bcm5719-llvm-837ae69f8b9d8fbb0a53b9a58b85496fa1962ba5.tar.gz bcm5719-llvm-837ae69f8b9d8fbb0a53b9a58b85496fa1962ba5.zip | |
[Object][XCOFF] Add support for 64-bit file header and section header dumping.
Adds a readobj dumper for 32-bit and 64-bit section header tables, and extend
support for the file-header dumping to include 64-bit object files. Also
refactors the binary file parsing to be done in a helper function in an attempt
to cleanup error handeling.
Differential Revision: https://reviews.llvm.org/D63843
llvm-svn: 365524
Diffstat (limited to 'llvm/tools')
| -rw-r--r-- | llvm/tools/llvm-readobj/XCOFFDumper.cpp | 83 | ||||
| -rw-r--r-- | llvm/tools/obj2yaml/xcoff2yaml.cpp | 27 |
2 files changed, 91 insertions, 19 deletions
diff --git a/llvm/tools/llvm-readobj/XCOFFDumper.cpp b/llvm/tools/llvm-readobj/XCOFFDumper.cpp index 59293fe80ee..6f260f91537 100644 --- a/llvm/tools/llvm-readobj/XCOFFDumper.cpp +++ b/llvm/tools/llvm-readobj/XCOFFDumper.cpp @@ -36,7 +36,12 @@ public: void printNeededLibraries() override; private: + template <typename T> void printSectionHeaders(ArrayRef<T> Sections); + const XCOFFObjectFile &Obj; + + // Least significant 3 bits are reserved. + static constexpr unsigned SectionFlagsReservedMask = 0x7; }; } // anonymous namespace @@ -65,12 +70,20 @@ void XCOFFDumper::printFileHeaders() { TimeStamp); } - W.printHex("SymbolTableOffset", Obj.getSymbolTableOffset()); - int32_t SymTabEntries = Obj.getRawNumberOfSymbolTableEntries(); - if (SymTabEntries >= 0) - W.printNumber("SymbolTableEntries", SymTabEntries); - else - W.printHex("SymbolTableEntries", "Reserved Value", SymTabEntries); + // The number of symbol table entries is an unsigned value in 64-bit objects + // and a signed value (with negative values being 'reserved') in 32-bit + // objects. + if (Obj.is64Bit()) { + W.printHex("SymbolTableOffset", Obj.getSymbolTableOffset64()); + W.printNumber("SymbolTableEntries", Obj.getNumberOfSymbolTableEntries64()); + } else { + W.printHex("SymbolTableOffset", Obj.getSymbolTableOffset32()); + int32_t SymTabEntries = Obj.getRawNumberOfSymbolTableEntries32(); + if (SymTabEntries >= 0) + W.printNumber("SymbolTableEntries", SymTabEntries); + else + W.printHex("SymbolTableEntries", "Reserved Value", SymTabEntries); + } W.printHex("OptionalHeaderSize", Obj.getOptionalHeaderSize()); W.printHex("Flags", Obj.getFlags()); @@ -80,7 +93,10 @@ void XCOFFDumper::printFileHeaders() { } void XCOFFDumper::printSectionHeaders() { - llvm_unreachable("Unimplemented functionality for XCOFFDumper"); + if (Obj.is64Bit()) + printSectionHeaders(Obj.sections64()); + else + printSectionHeaders(Obj.sections32()); } void XCOFFDumper::printRelocations() { @@ -107,6 +123,59 @@ void XCOFFDumper::printNeededLibraries() { llvm_unreachable("Unimplemented functionality for XCOFFDumper"); } +static const EnumEntry<XCOFF::SectionTypeFlags> SectionTypeFlagsNames[] = { +#define ECase(X) \ + { #X, XCOFF::X } + ECase(STYP_PAD), ECase(STYP_DWARF), ECase(STYP_TEXT), + ECase(STYP_DATA), ECase(STYP_BSS), ECase(STYP_EXCEPT), + ECase(STYP_INFO), ECase(STYP_TDATA), ECase(STYP_TBSS), + ECase(STYP_LOADER), ECase(STYP_DEBUG), ECase(STYP_TYPCHK), + ECase(STYP_OVRFLO) +#undef ECase +}; + +template <typename T> +void XCOFFDumper::printSectionHeaders(ArrayRef<T> Sections) { + ListScope Group(W, "Sections"); + + uint16_t Index = 1; + for (const T &Sec : Sections) { + DictScope SecDS(W, "Section"); + + W.printNumber("Index", Index++); + W.printString("Name", Sec.getName()); + + W.printHex("PhysicalAddress", Sec.PhysicalAddress); + W.printHex("VirtualAddress", Sec.VirtualAddress); + W.printHex("Size", Sec.SectionSize); + W.printHex("RawDataOffset", Sec.FileOffsetToRawData); + W.printHex("RelocationPointer", Sec.FileOffsetToRelocationInfo); + W.printHex("LineNumberPointer", Sec.FileOffsetToLineNumberInfo); + + // TODO Need to add overflow handling when NumberOfX == _OVERFLOW_MARKER + // in 32-bit object files. + W.printNumber("NumberOfRelocations", Sec.NumberOfRelocations); + W.printNumber("NumberOfLineNumbers", Sec.NumberOfLineNumbers); + + // The most significant 16-bits represent the DWARF section subtype. For + // now we just dump the section type flags. + uint16_t Flags = Sec.Flags & 0xffffu; + if (Flags & SectionFlagsReservedMask) + W.printHex("Flags", "Reserved", Flags); + else + W.printEnum("Type", Flags, makeArrayRef(SectionTypeFlagsNames)); + } + + if (opts::SectionRelocations) + report_fatal_error("Dumping section relocations is unimplemented"); + + if (opts::SectionSymbols) + report_fatal_error("Dumping symbols is unimplemented"); + + if (opts::SectionData) + report_fatal_error("Dumping section data is unimplemented"); +} + namespace llvm { std::error_code createXCOFFDumper(const object::ObjectFile *Obj, ScopedPrinter &Writer, diff --git a/llvm/tools/obj2yaml/xcoff2yaml.cpp b/llvm/tools/obj2yaml/xcoff2yaml.cpp index bcacd2b8d55..dd9d8e87509 100644 --- a/llvm/tools/obj2yaml/xcoff2yaml.cpp +++ b/llvm/tools/obj2yaml/xcoff2yaml.cpp @@ -29,22 +29,25 @@ public: } // namespace std::error_code XCOFFDumper::dump() { - std::error_code EC; dumpHeader(); - EC = dumpSymbols(); - return EC; + return dumpSymbols(); } void XCOFFDumper::dumpHeader() { - const XCOFFFileHeader *FileHdrPtr = Obj.getFileHeader(); - - YAMLObj.Header.Magic = FileHdrPtr->Magic; - YAMLObj.Header.NumberOfSections = FileHdrPtr->NumberOfSections; - YAMLObj.Header.TimeStamp = FileHdrPtr->TimeStamp; - YAMLObj.Header.SymbolTableOffset = FileHdrPtr->SymbolTableOffset; - YAMLObj.Header.NumberOfSymTableEntries = FileHdrPtr->NumberOfSymTableEntries; - YAMLObj.Header.AuxHeaderSize = FileHdrPtr->AuxHeaderSize; - YAMLObj.Header.Flags = FileHdrPtr->Flags; + + YAMLObj.Header.Magic = Obj.getMagic(); + YAMLObj.Header.NumberOfSections = Obj.getNumberOfSections(); + YAMLObj.Header.TimeStamp = Obj.getTimeStamp(); + + // TODO FIXME only dump 32 bit header for now. + if (Obj.is64Bit()) + report_fatal_error("64-bit XCOFF files not supported yet."); + YAMLObj.Header.SymbolTableOffset = Obj.getSymbolTableOffset32(); + + YAMLObj.Header.NumberOfSymTableEntries = + Obj.getRawNumberOfSymbolTableEntries32(); + YAMLObj.Header.AuxHeaderSize = Obj.getOptionalHeaderSize(); + YAMLObj.Header.Flags = Obj.getFlags(); } std::error_code XCOFFDumper::dumpSymbols() { |

