[llvm-rc] Add VERSIONINFO parsing ability. [6/8]

This extends the set of llvm-rc parser's available resources by
another one, VERSIONINFO.

Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381058.aspx

Thanks to Nico Weber for his original work in this area.

Differential Revision: https://reviews.llvm.org/D37021

llvm-svn: 314468
diff --git a/llvm/test/tools/llvm-rc/Inputs/parser-correct-everything.rc b/llvm/test/tools/llvm-rc/Inputs/parser-correct-everything.rc
index 4c7ce40..ec5286c 100644
--- a/llvm/test/tools/llvm-rc/Inputs/parser-correct-everything.rc
+++ b/llvm/test/tools/llvm-rc/Inputs/parser-correct-everything.rc
@@ -78,3 +78,36 @@
 END
 
 26 DIALOGEX 1, 2, 3, 4 {}
+
+1 VERSIONINFO
+FILEVERSION 1, 2, 3, 4
+PRODUCTVERSION 5, 6, 7, 8
+FILEFLAGSMASK 50
+FILEFLAGS 555
+FILEOS 110
+FILETYPE 555555
+FILESUBTYPE 14
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904E4"
+        {
+            VALUE "CompanyName",      "a"
+            VALUE "FileDescription",  "b"
+            VALUE "FileVersion",      "c"
+            VALUE "InternalName",     "d"
+            VALUE "LegalCopyright",   "e"
+            VALUE "LegalTrademarks1", "f"
+            VALUE "LegalTrademarks2", "g"
+            VALUE "OriginalFilename", L"h"
+            VALUE "ProductName",      "ii", 2, 3
+            VALUE "ProductVersion"
+        }
+    END
+
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1252
+
+    END
+END
diff --git a/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-bad-type.rc b/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-bad-type.rc
new file mode 100644
index 0000000..1fa230d
--- /dev/null
+++ b/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-bad-type.rc
@@ -0,0 +1,4 @@
+1 VERSIONINFO
+BEGIN
+  INCORRECT "1", "2"
+END
diff --git a/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-named-main-block.rc b/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-named-main-block.rc
new file mode 100644
index 0000000..affd110
--- /dev/null
+++ b/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-named-main-block.rc
@@ -0,0 +1,4 @@
+1 VERSIONINFO
+BLOCK "hello"
+BEGIN
+END
diff --git a/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-repeated-fixed.rc b/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-repeated-fixed.rc
new file mode 100644
index 0000000..45588a6
--- /dev/null
+++ b/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-repeated-fixed.rc
@@ -0,0 +1,6 @@
+1 VERSIONINFO
+FileVersion 1, 2, 3, 4
+PRODUCTVERSION 5, 6, 7, 8
+FILEVERSION 9, 10, 11, 12
+BEGIN
+END
diff --git a/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-unnamed-inner-block.rc b/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-unnamed-inner-block.rc
new file mode 100644
index 0000000..3ed1fb6
--- /dev/null
+++ b/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-unnamed-inner-block.rc
@@ -0,0 +1,4 @@
+1 VERSIONINFO
+BEGIN
+  BLOCK {}
+END
diff --git a/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-unnamed-value.rc b/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-unnamed-value.rc
new file mode 100644
index 0000000..acb9eba
--- /dev/null
+++ b/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-unnamed-value.rc
@@ -0,0 +1,7 @@
+1 VERSIONINFO
+BEGIN
+  BLOCK "VarFileInfo"
+  BEGIN
+    VALUE
+  END
+END
diff --git a/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-wrong-fixed.rc b/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-wrong-fixed.rc
new file mode 100644
index 0000000..9882d88
--- /dev/null
+++ b/llvm/test/tools/llvm-rc/Inputs/parser-versioninfo-wrong-fixed.rc
@@ -0,0 +1,3 @@
+1 VERSIONINFO
+WEIRDFIXED 5
+BEGIN END
diff --git a/llvm/test/tools/llvm-rc/parser.test b/llvm/test/tools/llvm-rc/parser.test
index bc7f20325..1f11a85 100644
--- a/llvm/test/tools/llvm-rc/parser.test
+++ b/llvm/test/tools/llvm-rc/parser.test
@@ -64,6 +64,34 @@
 ; PGOOD-NEXT:    Control (5): EDITTEXT, title: , loc: (1, 2), size: [4, 7], style: 8
 ; PGOOD-NEXT:  Dialog (25): loc: (1, 2), size: [3, 4], help ID: 0
 ; PGOOD-NEXT:  DialogEx (26): loc: (1, 2), size: [3, 4], help ID: 0
+; PGOOD-NEXT:  VersionInfo (1):
+; PGOOD-NEXT:    Fixed: FILEVERSION: 1 2 3 4
+; PGOOD-NEXT:    Fixed: PRODUCTVERSION: 5 6 7 8
+; PGOOD-NEXT:    Fixed: FILEFLAGSMASK: 50
+; PGOOD-NEXT:    Fixed: FILEFLAGS: 555
+; PGOOD-NEXT:    Fixed: FILEOS: 110
+; PGOOD-NEXT:    Fixed: FILETYPE: 555555
+; PGOOD-NEXT:    Fixed: FILESUBTYPE: 14
+; PGOOD-NEXT:    Start of block (name: )
+; PGOOD-NEXT:    Start of block (name: "StringFileInfo")
+; PGOOD-NEXT:    Start of block (name: "040904E4")
+; PGOOD-NEXT:    "CompanyName" => "a"
+; PGOOD-NEXT:    "FileDescription" => "b"
+; PGOOD-NEXT:    "FileVersion" => "c"
+; PGOOD-NEXT:    "InternalName" => "d"
+; PGOOD-NEXT:    "LegalCopyright" => "e"
+; PGOOD-NEXT:    "LegalTrademarks1" => "f"
+; PGOOD-NEXT:    "LegalTrademarks2" => "g"
+; PGOOD-NEXT:    "OriginalFilename" => L"h"
+; PGOOD-NEXT:    "ProductName" => "ii" 2 3
+; PGOOD-NEXT:    "ProductVersion" =>
+; PGOOD-NEXT:    End of block
+; PGOOD-NEXT:    End of block
+; PGOOD-NEXT:    Start of block (name: "VarFileInfo")
+; PGOOD-NEXT:    "Translation" => 1033 1252
+; PGOOD-NEXT:    End of block
+; PGOOD-NEXT:    End of block
+
 
 
 ; RUN: not llvm-rc /V %p/Inputs/parser-stringtable-no-string.rc 2>&1 | FileCheck %s --check-prefix PSTRINGTABLE1
@@ -184,3 +212,33 @@
 ; RUN: not llvm-rc /V %p/Inputs/parser-dialog-unnecessary-string.rc 2>&1 | FileCheck %s --check-prefix PDIALOG5
 
 ; PDIALOG5:  llvm-rc: Error parsing file: expected integer, got "This shouldn't be here"
+
+
+; RUN: not llvm-rc /V %p/Inputs/parser-versioninfo-wrong-fixed.rc 2>&1 | FileCheck %s --check-prefix PVERSIONINFO1
+
+; PVERSIONINFO1:  llvm-rc: Error parsing file: expected fixed VERSIONINFO statement type, got WEIRDFIXED
+
+
+; RUN: not llvm-rc /V %p/Inputs/parser-versioninfo-named-main-block.rc 2>&1 | FileCheck %s --check-prefix PVERSIONINFO2
+
+; PVERSIONINFO2:  llvm-rc: Error parsing file: expected fixed VERSIONINFO statement type, got BLOCK
+
+
+; RUN: not llvm-rc /V %p/Inputs/parser-versioninfo-unnamed-inner-block.rc 2>&1 | FileCheck %s --check-prefix PVERSIONINFO3
+
+; PVERSIONINFO3:  llvm-rc: Error parsing file: expected string, got {
+
+
+; RUN: not llvm-rc /V %p/Inputs/parser-versioninfo-unnamed-value.rc 2>&1 | FileCheck %s --check-prefix PVERSIONINFO4
+
+; PVERSIONINFO4:  llvm-rc: Error parsing file: expected string, got END
+
+
+; RUN: not llvm-rc /V %p/Inputs/parser-versioninfo-bad-type.rc 2>&1 | FileCheck %s --check-prefix PVERSIONINFO5
+
+; PVERSIONINFO5:  llvm-rc: Error parsing file: expected BLOCK or VALUE, got INCORRECT
+
+
+; RUN: not llvm-rc /V %p/Inputs/parser-versioninfo-repeated-fixed.rc 2>&1 | FileCheck %s --check-prefix PVERSIONINFO6
+
+; PVERSIONINFO6:  llvm-rc: Error parsing file: expected yet unread fixed VERSIONINFO statement type, got FILEVERSION