[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