[llvm] beb0e7e - [llvm-rc] Make commas in user data structs optional

Martin Storsjö via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 9 04:31:49 PDT 2021


Author: Martin Storsjö
Date: 2021-07-09T14:31:12+03:00
New Revision: beb0e7e338d6c196362745ddebc24ae394bff6f2

URL: https://github.com/llvm/llvm-project/commit/beb0e7e338d6c196362745ddebc24ae394bff6f2
DIFF: https://github.com/llvm/llvm-project/commit/beb0e7e338d6c196362745ddebc24ae394bff6f2.diff

LOG: [llvm-rc] Make commas in user data structs optional

This matches what rc.exe tolerates in this type.

This fixes cases like this:

    1 24
    BEGIN
      "<?xml version=""1.0""?>\n"
      "<assembly>\n"
      "</assembly>\n"
    END

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

Added: 
    llvm/test/tools/llvm-rc/Inputs/inline-manifest.rc
    llvm/test/tools/llvm-rc/inline-manifest.test

Modified: 
    llvm/test/tools/llvm-rc/Inputs/tag-user.rc
    llvm/tools/llvm-rc/ResourceScriptParser.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-rc/Inputs/inline-manifest.rc b/llvm/test/tools/llvm-rc/Inputs/inline-manifest.rc
new file mode 100644
index 000000000000..a5e8abf8317d
--- /dev/null
+++ b/llvm/test/tools/llvm-rc/Inputs/inline-manifest.rc
@@ -0,0 +1,6 @@
+1 24
+BEGIN
+  "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>\n"
+  "<assembly xmlns=""urn:schemas-microsoft-com:asm.v1"" manifestVersion=""1.0"">\n"
+  "</assembly>\n"
+END

diff  --git a/llvm/test/tools/llvm-rc/Inputs/tag-user.rc b/llvm/test/tools/llvm-rc/Inputs/tag-user.rc
index 163748d58450..af4c210a3237 100644
--- a/llvm/test/tools/llvm-rc/Inputs/tag-user.rc
+++ b/llvm/test/tools/llvm-rc/Inputs/tag-user.rc
@@ -1,8 +1,8 @@
 500 500 {
-  1, 2, 3, 4, 5, "data", L"wide data", 0xABCD, 0xABCDEF01L
+  1, 2 3, ,4, 5, "da", "ta" L"wide data", 0xABCD, 0xABCDEF01L
 }
 501 RCDATA {
-  1, 2, 3, 4, 5, "data", L"wide data", 0xABCD, 0xABCDEF01L
+  1, 2, 3, 4, ,5, "da" "ta" L"wide", L" data", 0xABCD 0xABCDEF01L,
 }
 
 NAME1 NAME2 {}

diff  --git a/llvm/test/tools/llvm-rc/inline-manifest.test b/llvm/test/tools/llvm-rc/inline-manifest.test
new file mode 100644
index 000000000000..fb991e4056ca
--- /dev/null
+++ b/llvm/test/tools/llvm-rc/inline-manifest.test
@@ -0,0 +1,23 @@
+; RUN: llvm-rc -no-preprocess /FO %t -- %p/Inputs/inline-manifest.rc
+; RUN: llvm-readobj %t | FileCheck %s
+
+; CHECK:      Resource type (int): MANIFEST (ID 24)
+; CHECK-NEXT: Resource name (int): 1
+; CHECK-NEXT: Data version: 0
+; CHECK-NEXT: Memory flags: 0x30
+; CHECK-NEXT: Language ID: 1033
+; CHECK-NEXT: Version (major): 0
+; CHECK-NEXT: Version (minor): 0
+; CHECK-NEXT: Characteristics: 0
+; CHECK-NEXT: Data size: 142
+; CHECK-NEXT: Data: (
+; CHECK-NEXT:   0000: 3C3F786D 6C207665 7273696F 6E3D2231  |<?xml version="1|
+; CHECK-NEXT:   0010: 2E302220 656E636F 64696E67 3D225554  |.0" encoding="UT|
+; CHECK-NEXT:   0020: 462D3822 20737461 6E64616C 6F6E653D  |F-8" standalone=|
+; CHECK-NEXT:   0030: 22796573 223F3E0A 3C617373 656D626C  |"yes"?>.<assembl|
+; CHECK-NEXT:   0040: 7920786D 6C6E733D 2275726E 3A736368  |y xmlns="urn:sch|
+; CHECK-NEXT:   0050: 656D6173 2D6D6963 726F736F 66742D63  |emas-microsoft-c|
+; CHECK-NEXT:   0060: 6F6D3A61 736D2E76 3122206D 616E6966  |om:asm.v1" manif|
+; CHECK-NEXT:   0070: 65737456 65727369 6F6E3D22 312E3022  |estVersion="1.0"|
+; CHECK-NEXT:   0080: 3E0A3C2F 61737365 6D626C79 3E0A      |>.</assembly>.|
+; CHECK-NEXT: )

diff  --git a/llvm/tools/llvm-rc/ResourceScriptParser.cpp b/llvm/tools/llvm-rc/ResourceScriptParser.cpp
index fec497783872..4045131dd785 100644
--- a/llvm/tools/llvm-rc/ResourceScriptParser.cpp
+++ b/llvm/tools/llvm-rc/ResourceScriptParser.cpp
@@ -506,15 +506,14 @@ RCParser::ParseType RCParser::parseUserDefinedResource(IntOrString Type) {
   RETURN_IF_ERROR(consumeType(Kind::BlockBegin));
   std::vector<IntOrString> Data;
 
-  // Consume comma before each consecutive token except the first one.
-  bool ConsumeComma = false;
   while (!consumeOptionalType(Kind::BlockEnd)) {
-    if (ConsumeComma)
-      RETURN_IF_ERROR(consumeType(Kind::Comma));
-    ConsumeComma = true;
-
     ASSIGN_OR_RETURN(Item, readIntOrString());
     Data.push_back(*Item);
+
+    // There can be zero or more commas after each token (but not before
+    // the first one).
+    while (consumeOptionalType(Kind::Comma)) {
+    }
   }
 
   return std::make_unique<UserDefinedResource>(Type, std::move(Data),


        


More information about the llvm-commits mailing list