From 0a1683f8cc0df2889f1d86da7a795914f07e5599 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Martin=20Storsj=C3=B6?= Date: Fri, 23 Jul 2021 00:36:05 +0300 Subject: [PATCH] [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 --- llvm/test/tools/llvm-rc/Inputs/resname-string.rc | 2 ++ llvm/test/tools/llvm-rc/Inputs/tokens.rc | 1 + llvm/test/tools/llvm-rc/resname-string.test | 5 +++++ llvm/test/tools/llvm-rc/tokenizer.test | 1 + llvm/tools/llvm-rc/ResourceScriptToken.cpp | 2 +- 5 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 llvm/test/tools/llvm-rc/Inputs/resname-string.rc create mode 100644 llvm/test/tools/llvm-rc/resname-string.test 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 0000000..7132a11 --- /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 217d601..6a78120 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 0000000..d41a6a4 --- /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 eb2233c..8486f8b 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 6ce75f7..a8f40ab 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 { -- 2.7.4