diff options
| author | Eric Beckmann <ecbeckmann@google.com> | 2017-06-13 00:06:10 +0000 |
|---|---|---|
| committer | Eric Beckmann <ecbeckmann@google.com> | 2017-06-13 00:06:10 +0000 |
| commit | 5ee9eca868a04db7b8af52312c32b3235ba19994 (patch) | |
| tree | 1ad26cd343fb3e8ec0e85764a39760ef985c0de2 /llvm/tools/llvm-readobj | |
| parent | f3bfd7ace9f8a26c9abf00702c05cd630dcffdf0 (diff) | |
| download | bcm5719-llvm-5ee9eca868a04db7b8af52312c32b3235ba19994.tar.gz bcm5719-llvm-5ee9eca868a04db7b8af52312c32b3235ba19994.zip | |
Fix alignment bug in COFF emission.
Summary: Fix alignment issue in D34020, by aligning all sections to 8 bytes.
Reviewers: zturner
Subscribers: hiraditya, llvm-commits
Differential Revision: https://reviews.llvm.org/D34072
llvm-svn: 305256
Diffstat (limited to 'llvm/tools/llvm-readobj')
| -rw-r--r-- | llvm/tools/llvm-readobj/COFFDumper.cpp | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index 6223c09a4de..216c9adad9a 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -124,6 +124,10 @@ private: uint32_t RelocOffset, uint32_t Offset, StringRef *RelocSym = nullptr); + uint32_t countTotalTableEntries(ResourceSectionRef RSF, + const coff_resource_dir_table &Table, + StringRef Level); + void printResourceDirectoryTable(ResourceSectionRef RSF, const coff_resource_dir_table &Table, StringRef Level); @@ -1526,6 +1530,11 @@ void COFFDumper::printCOFFResources() { if ((Name == ".rsrc") || (Name == ".rsrc$01")) { ResourceSectionRef RSF(Ref); auto &BaseTable = unwrapOrError(RSF.getBaseTable()); + W.printNumber("Total Number of Resources", + countTotalTableEntries(RSF, BaseTable, "Type")); + W.printHex("Base Table Address", + Obj->getCOFFSection(S)->PointerToRawData); + W.startLine() << "\n"; printResourceDirectoryTable(RSF, BaseTable, "Type"); } if (opts::SectionData) @@ -1533,15 +1542,35 @@ void COFFDumper::printCOFFResources() { } } +uint32_t +COFFDumper::countTotalTableEntries(ResourceSectionRef RSF, + const coff_resource_dir_table &Table, + StringRef Level) { + uint32_t TotalEntries = 0; + for (int i = 0; i < Table.NumberOfNameEntries + Table.NumberOfIDEntries; + i++) { + auto Entry = unwrapOrError(getResourceDirectoryTableEntry(Table, i)); + if (Entry.Offset.isSubDir()) { + StringRef NextLevel; + if (Level == "Name") + NextLevel = "Language"; + else + NextLevel = "Name"; + auto &NextTable = unwrapOrError(RSF.getEntrySubDir(Entry)); + TotalEntries += countTotalTableEntries(RSF, NextTable, NextLevel); + } else { + TotalEntries += 1; + } + } + return TotalEntries; +} + void COFFDumper::printResourceDirectoryTable( ResourceSectionRef RSF, const coff_resource_dir_table &Table, StringRef Level) { - W.printNumber("String Name Entries", Table.NumberOfNameEntries); - W.printNumber("ID Entries", Table.NumberOfIDEntries); - char FormattedTime[20] = {}; - time_t TDS = time_t(Table.TimeDateStamp); - strftime(FormattedTime, 20, "%Y-%m-%d %H:%M:%S", gmtime(&TDS)); + W.printNumber("Number of String Entries", Table.NumberOfNameEntries); + W.printNumber("Number of ID Entries", Table.NumberOfIDEntries); // Iterate through level in resource directory tree. for (int i = 0; i < Table.NumberOfNameEntries + Table.NumberOfIDEntries; @@ -1578,6 +1607,7 @@ void COFFDumper::printResourceDirectoryTable( Name = StringRef(IDStr); ListScope ResourceType(W, Level.str() + Name.str()); if (Entry.Offset.isSubDir()) { + W.printHex("Table Offset", Entry.Offset.value()); StringRef NextLevel; if (Level == "Name") NextLevel = "Language"; @@ -1586,9 +1616,14 @@ void COFFDumper::printResourceDirectoryTable( auto &NextTable = unwrapOrError(RSF.getEntrySubDir(Entry)); printResourceDirectoryTable(RSF, NextTable, NextLevel); } else { + W.printHex("Entry Offset", Entry.Offset.value()); + char FormattedTime[20] = {}; + time_t TDS = time_t(Table.TimeDateStamp); + strftime(FormattedTime, 20, "%Y-%m-%d %H:%M:%S", gmtime(&TDS)); W.printHex("Time/Date Stamp", FormattedTime, Table.TimeDateStamp); W.printNumber("Major Version", Table.MajorVersion); W.printNumber("Minor Version", Table.MinorVersion); + W.printNumber("Characteristics", Table.Characteristics); } } } |

