summaryrefslogtreecommitdiffstats
path: root/llvm/tools
diff options
context:
space:
mode:
authorEric Beckmann <ecbeckmann@google.com>2017-06-13 00:16:32 +0000
committerEric Beckmann <ecbeckmann@google.com>2017-06-13 00:16:32 +0000
commit13017597927db39fe725395e26c9f20ff7dfedb0 (patch)
tree3137002a9fb6a5b783fcdb616fe8a35db4500be1 /llvm/tools
parent56951cb031a1ea8f3d066f42255b0984fe82a150 (diff)
downloadbcm5719-llvm-13017597927db39fe725395e26c9f20ff7dfedb0.tar.gz
bcm5719-llvm-13017597927db39fe725395e26c9f20ff7dfedb0.zip
Update the test framework for llvm-cvtres to be more comprehensive.
Summary: Added test cases for multiple machine types, file merging, multiple languages, and more resource types. Also fixed new bugs these tests exposed. Subscribers: javed.absar, llvm-commits, hiraditya Differential Revision: https://reviews.llvm.org/D34047 llvm-svn: 305258
Diffstat (limited to 'llvm/tools')
-rw-r--r--llvm/tools/llvm-readobj/COFFDumper.cpp45
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);
}
}
}
OpenPOWER on IntegriCloud