summaryrefslogtreecommitdiffstats
path: root/llvm/tools
diff options
context:
space:
mode:
authorSean Fertile <sfertile@ca.ibm.com>2019-07-09 18:09:11 +0000
committerSean Fertile <sfertile@ca.ibm.com>2019-07-09 18:09:11 +0000
commit837ae69f8b9d8fbb0a53b9a58b85496fa1962ba5 (patch)
tree3715adc7429a350c9cd20013cf9f75f0eb30674d /llvm/tools
parent5f4d7c9d4f20f85bbcd814b324aec5f3f2107d26 (diff)
downloadbcm5719-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.cpp83
-rw-r--r--llvm/tools/obj2yaml/xcoff2yaml.cpp27
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() {
OpenPOWER on IntegriCloud