summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/WindowsResource.cpp
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/lib/Object/WindowsResource.cpp
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/lib/Object/WindowsResource.cpp')
-rw-r--r--llvm/lib/Object/WindowsResource.cpp36
1 files changed, 21 insertions, 15 deletions
diff --git a/llvm/lib/Object/WindowsResource.cpp b/llvm/lib/Object/WindowsResource.cpp
index 3a1ed9a907a..a7e126da52a 100644
--- a/llvm/lib/Object/WindowsResource.cpp
+++ b/llvm/lib/Object/WindowsResource.cpp
@@ -133,17 +133,19 @@ Error WindowsResourceParser::parse(WindowsResource *WR) {
ResourceEntryRef Entry = EntryOrErr.get();
bool End = false;
while (!End) {
-
Data.push_back(Entry.getData());
- if (Entry.checkTypeString())
+ bool IsNewTypeString = false;
+ bool IsNewNameString = false;
+
+ Root.addEntry(Entry, IsNewTypeString, IsNewNameString);
+
+ if (IsNewTypeString)
StringTable.push_back(Entry.getTypeString());
- if (Entry.checkNameString())
+ if (IsNewNameString)
StringTable.push_back(Entry.getNameString());
- Root.addEntry(Entry);
-
RETURN_IF_ERROR(Entry.moveNext(End));
}
@@ -155,9 +157,11 @@ void WindowsResourceParser::printTree() const {
Root.print(Writer, "Resource Tree");
}
-void WindowsResourceParser::TreeNode::addEntry(const ResourceEntryRef &Entry) {
- TreeNode &TypeNode = addTypeNode(Entry);
- TreeNode &NameNode = TypeNode.addNameNode(Entry);
+void WindowsResourceParser::TreeNode::addEntry(const ResourceEntryRef &Entry,
+ bool &IsNewTypeString,
+ bool &IsNewNameString) {
+ TreeNode &TypeNode = addTypeNode(Entry, IsNewTypeString);
+ TreeNode &NameNode = TypeNode.addNameNode(Entry, IsNewNameString);
NameNode.addLanguageNode(Entry);
}
@@ -171,7 +175,6 @@ WindowsResourceParser::TreeNode::TreeNode(uint16_t MajorVersion,
uint32_t Characteristics)
: IsDataNode(true), MajorVersion(MajorVersion), MinorVersion(MinorVersion),
Characteristics(Characteristics) {
- if (IsDataNode)
DataIndex = DataCount++;
}
@@ -194,17 +197,19 @@ WindowsResourceParser::TreeNode::createDataNode(uint16_t MajorVersion,
}
WindowsResourceParser::TreeNode &
-WindowsResourceParser::TreeNode::addTypeNode(const ResourceEntryRef &Entry) {
+WindowsResourceParser::TreeNode::addTypeNode(const ResourceEntryRef &Entry,
+ bool &IsNewTypeString) {
if (Entry.checkTypeString())
- return addChild(Entry.getTypeString());
+ return addChild(Entry.getTypeString(), IsNewTypeString);
else
return addChild(Entry.getTypeID());
}
WindowsResourceParser::TreeNode &
-WindowsResourceParser::TreeNode::addNameNode(const ResourceEntryRef &Entry) {
+WindowsResourceParser::TreeNode::addNameNode(const ResourceEntryRef &Entry,
+ bool &IsNewNameString) {
if (Entry.checkNameString())
- return addChild(Entry.getNameString());
+ return addChild(Entry.getNameString(), IsNewNameString);
else
return addChild(Entry.getNameID());
}
@@ -232,7 +237,8 @@ WindowsResourceParser::TreeNode &WindowsResourceParser::TreeNode::addChild(
}
WindowsResourceParser::TreeNode &
-WindowsResourceParser::TreeNode::addChild(ArrayRef<UTF16> NameRef) {
+WindowsResourceParser::TreeNode::addChild(ArrayRef<UTF16> NameRef,
+ bool &IsNewString) {
std::string NameString;
ArrayRef<UTF16> CorrectedName;
std::vector<UTF16> EndianCorrectedName;
@@ -248,6 +254,7 @@ WindowsResourceParser::TreeNode::addChild(ArrayRef<UTF16> NameRef) {
auto Child = StringChildren.find(NameString);
if (Child == StringChildren.end()) {
auto NewChild = createStringNode();
+ IsNewString = true;
WindowsResourceParser::TreeNode &Node = *NewChild;
StringChildren.emplace(NameString, std::move(NewChild));
return Node;
@@ -296,7 +303,6 @@ class WindowsResourceCOFFWriter {
public:
WindowsResourceCOFFWriter(StringRef OutputFile, Machine MachineType,
const WindowsResourceParser &Parser, Error &E);
-
Error write();
private:
OpenPOWER on IntegriCloud