[PATCH] D32609: Update llvm-readobj -coff-resources to display tree structure.

Zachary Turner via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue May 2 11:30:32 PDT 2017


zturner added inline comments.


================
Comment at: llvm/include/llvm/Object/COFF.h:1072
+  ErrorOr<const coff_resource_dir_table*> getTableAtOffset(uint32_t Offset);
+  ErrorOr<StringRef> getDirStringAtOffset(uint32_t Offset,) const;
+
----------------
Why is there a comma here?


================
Comment at: llvm/lib/Object/COFFObjectFile.cpp:1604-1610
+ResourceSectionRef::getDirStringAtOffset(uint32_t Offset,
+                                         StringRef &DirString) const {
+  auto Length = reinterpret_cast<const uint16_t *>(
+      reinterpret_cast<const uint8_t *>(BaseTable) + Offset);
+  auto *Data = reinterpret_cast<const char *>(Length + 1);
+  DirString = StringRef(Data, (size_t)*Length);
+  return std::error_code();
----------------
This code has endianness problems.  See later for suggested fix.


================
Comment at: llvm/tools/llvm-readobj/COFFDumper.cpp:1537
     if ((Name == ".rsrc") || (Name == ".rsrc$01")) {
-      auto Table =
-          reinterpret_cast<const coff_resource_dir_table *>(Ref.data());
-      char FormattedTime[20];
-      time_t TDS = time_t(Table->TimeDateStamp);
-      strftime(FormattedTime, sizeof(FormattedTime), "%Y-%m-%d %H:%M:%S",
-               gmtime(&TDS));
-      W.printHex("Time/Date Stamp", FormattedTime, Table->TimeDateStamp);
+      ResourceSectionRef RSF(
+          reinterpret_cast<const coff_resource_dir_table *>(Ref.data()));
----------------
Can you use `llvm::BinaryStreamReader` here?  This could would be written:

```
BinaryByteStream Stream(Ref, support::little);
BinaryStreamReader Reader(Stream);
const coff_resource_dir_table *TypeTable;
error(Reader.readObject(TypeTable));
// ...
for (int i=0; i < TypeTable->NumberOfNameEntries; ++i) {
  const coff_resource_dir_entry *Entry;
  error(Reader.readObject(Entry));
  uint32_t OldOffset = Reader.getOffset();

  Reader.setOffset(Entry->NameOffset);
  uint16_t Length;
  StringRef TypeName;
  error(Reader.readInteger(Length));
  error(Reader.readFixedString(TypeName, Length));
  ListScope ResourceType(W, "Type: " + TypeName.str());

  Reader.setOffset(OldOffset);
}

for (int i=0; i < TypeTable->NumberOfIDEntries; ++i) {
  const coff_resource_dir_entry *Entry;
  error(Reader.readObject(Entry));

  StringRef TypeName = RSF.convertIDToType(Entry->Identifier.ID);
  ListScope ResourceType(W, "Type: " + TypeName.str());
}
```

Note that your original code has a bug because it is using `uint16_t` to read an integer, instead of `ulittle16_t`.  The code here fixes that since you specify the endianness in the stream.


https://reviews.llvm.org/D32609





More information about the llvm-commits mailing list