[llvm] [llvm-objdump] print out xcoff file header and load section header for xcoff object file with option private-headers (PR #96350)
Chen Zheng via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 1 20:22:32 PDT 2024
================
@@ -30,10 +32,131 @@ using namespace llvm::support;
namespace {
class XCOFFDumper : public objdump::Dumper {
+ const XCOFFObjectFile &Obj;
+ unsigned Width;
public:
- XCOFFDumper(const object::XCOFFObjectFile &O) : Dumper(O) {}
- void printPrivateHeaders() override {}
+ XCOFFDumper(const object::XCOFFObjectFile &O) : Dumper(O), Obj(O) {}
+ void printPrivateHeaders() override;
+ void printFileHeader();
+ void printAuxiliaryHeader(){};
+ void printLoaderSectionHeader();
+ FormattedString formatName(StringRef Name);
+ void printHex(StringRef Name, uint64_t Value);
+ void printNumber(StringRef Name, uint64_t Value);
+ void printStrHex(StringRef Name, StringRef Str, uint64_t Value);
+ void setWidth(unsigned W) {Width =W;};
};
+
+void XCOFFDumper::printPrivateHeaders() {
+ printFileHeader();
+ printAuxiliaryHeader();
+ printLoaderSectionHeader();
+}
+
+FormattedString XCOFFDumper::formatName(StringRef Name) {
+ return FormattedString(Name, Width, FormattedString::JustifyLeft);
+}
+
+void XCOFFDumper::printHex(StringRef Name, uint64_t Value) {
+ outs() << formatName(Name) << format_hex(Value, 0) << "\n";
+}
+
+void XCOFFDumper::printNumber(StringRef Name, uint64_t Value) {
+ outs() << formatName(Name) << format_decimal(Value, 0) << "\n";
+}
+
+void XCOFFDumper::printStrHex(StringRef Name, StringRef Str, uint64_t Value) {
+ outs() << formatName(Name) << Str << " (" << format_decimal(Value, 0) << ")"
+ << "\n";
+}
+
+void XCOFFDumper::printFileHeader() {
+ setWidth(20);
+ outs() << "\n---File Header:\n";
+ printHex("Magic:", Obj.getMagic());
+ printNumber("NumberOfSections:", Obj.getNumberOfSections());
+
+ // Negative timestamp values are reserved for future use.
+ int32_t TimeStamp = Obj.getTimeStamp();
+ if (TimeStamp > 0) {
+ // This handling of the time stamp assumes that the host
+ // system's time_t is
+ // compatible with AIX time_t. If a platform is not
+ // compatible, the lit
+ // tests will let us know.
+ time_t TimeDate = TimeStamp;
+
+ char FormattedTime[80] = {};
+
+ size_t BytesFormatted = strftime(FormattedTime, sizeof(FormattedTime),
+ "%F %T", gmtime(&TimeDate));
+ if (BytesFormatted)
+ printStrHex("TimeStamp:", FormattedTime, TimeStamp);
+ else
+ printHex("Timestamp:", TimeStamp);
+ } else {
+ printStrHex("TimeStamp:", TimeStamp == 0 ? "None" : "Reserved Value",
+ TimeStamp);
+ }
+
+ // 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.
+
----------------
chenzheng1030 wrote:
nit: unnecessary blank line
https://github.com/llvm/llvm-project/pull/96350
More information about the llvm-commits
mailing list