[llvm] 0a1683f - [llvm-rc] Allow dashes as part of resource name strings

Martin Storsjö via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 23 13:06:27 PDT 2021


Author: Martin Storsjö
Date: 2021-07-23T23:05:20+03:00
New Revision: 0a1683f8cc0df2889f1d86da7a795914f07e5599

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

LOG: [llvm-rc] Allow dashes as part of resource name strings

This matches what MS rc.exe allows in practice. I'm not aware of
any legal syntax case that are broken by allowing dashes as part
of what the tokenizer considers an Identifier - but I'm not
very well versed in the RC syntax either, can @amccarth think of
any case that would be broken by this?

This fixes downstream bug
https://github.com/msys2/MINGW-packages/issues/9180.

Additionally, rc.exe allows such resource name strings to be surrounded
by quotes, ending up with e.g.

    Resource name (string): "QUOTEDNAME"

(i.e., the quotes end up as part of the string), which llvm-rc doesn't
support yet either. (I'm not aware of such cases in the wild though,
but resource string names with dashes do exist.)

This also allows including files with unquoted paths, with filenames
containing dashes (which fixes
https://github.com/msys2/MINGW-packages/issues/9130, which has been
worked around differently so far).

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

Added: 
    llvm/test/tools/llvm-rc/Inputs/resname-string.rc
    llvm/test/tools/llvm-rc/resname-string.test

Modified: 
    llvm/test/tools/llvm-rc/Inputs/tokens.rc
    llvm/test/tools/llvm-rc/tokenizer.test
    llvm/tools/llvm-rc/ResourceScriptToken.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-rc/Inputs/resname-string.rc b/llvm/test/tools/llvm-rc/Inputs/resname-string.rc
new file mode 100644
index 0000000000000..7132a1124aa2e
--- /dev/null
+++ b/llvm/test/tools/llvm-rc/Inputs/resname-string.rc
@@ -0,0 +1,2 @@
+stringname RCDATA { "foo" }
+name-with-dashes/and/slashes RCDATA { "foo" }

diff  --git a/llvm/test/tools/llvm-rc/Inputs/tokens.rc b/llvm/test/tools/llvm-rc/Inputs/tokens.rc
index 217d6017a9d74..6a781202a7e37 100644
--- a/llvm/test/tools/llvm-rc/Inputs/tokens.rc
+++ b/llvm/test/tools/llvm-rc/Inputs/tokens.rc
@@ -1,5 +1,6 @@
 1 + 2 - 3214L & 0x120894 032173 2|&~+(-7){0xabcdef 0xABCDEFl} Begin End
 He11o LLVM
+identifier-with-dashes
 
 "RC string test.",L"Another RC string test.'&{",42,100
 

diff  --git a/llvm/test/tools/llvm-rc/resname-string.test b/llvm/test/tools/llvm-rc/resname-string.test
new file mode 100644
index 0000000000000..d41a6a49642d5
--- /dev/null
+++ b/llvm/test/tools/llvm-rc/resname-string.test
@@ -0,0 +1,5 @@
+; RUN: llvm-rc -no-preprocess /FO %t.res -- %p/Inputs/resname-string.rc
+; RUN: llvm-readobj %t.res | FileCheck %s
+
+; CHECK: Resource name (string): STRINGNAME
+; CHECK: Resource name (string): NAME-WITH-DASHES/AND/SLASHES

diff  --git a/llvm/test/tools/llvm-rc/tokenizer.test b/llvm/test/tools/llvm-rc/tokenizer.test
index eb2233c89d725..8486f8bd78690 100644
--- a/llvm/test/tools/llvm-rc/tokenizer.test
+++ b/llvm/test/tools/llvm-rc/tokenizer.test
@@ -27,6 +27,7 @@
 ; CHECK-NEXT:  BlockEnd: End
 ; CHECK-NEXT:  Identifier: He11o
 ; CHECK-NEXT:  Identifier: LLVM
+; CHECK-NEXT:  Identifier: identifier-with-dashes
 ; CHECK-NEXT:  String: "RC string test."
 ; CHECK-NEXT:  Comma: ,
 ; CHECK-NEXT:  String: L"Another RC string test.'&{"

diff  --git a/llvm/tools/llvm-rc/ResourceScriptToken.cpp b/llvm/tools/llvm-rc/ResourceScriptToken.cpp
index 6ce75f7e4bbbb..a8f40abdf8a68 100644
--- a/llvm/tools/llvm-rc/ResourceScriptToken.cpp
+++ b/llvm/tools/llvm-rc/ResourceScriptToken.cpp
@@ -288,7 +288,7 @@ bool Tokenizer::canContinueIdentifier() const {
   assert(!streamEof());
   const char CurChar = Data[Pos];
   return std::isalnum(CurChar) || CurChar == '_' || CurChar == '.' ||
-         CurChar == '/' || CurChar == '\\';
+         CurChar == '/' || CurChar == '\\' || CurChar == '-';
 }
 
 bool Tokenizer::canStartInt() const {


        


More information about the llvm-commits mailing list