[clang] [HLSL][RootSignature] Make Root Signature lexer keywords case-insensitive (PR #132967)
Finn Plummer via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 25 11:02:36 PDT 2025
https://github.com/inbelic created https://github.com/llvm/llvm-project/pull/132967
>From the corrections to the Root Signature specification here: https://github.com/llvm/wg-hlsl/issues/192. It was denoted that keywords are also case-insensitive in DXC.
This pr adjusts the lexer to adhere to the updated spec.
We also have a NFC to add a missing license to a file while in the area.
>From d41aefdbd13ca430cd9c1f64406b5615c662dcce Mon Sep 17 00:00:00 2001
From: Finn Plummer <finnplummer at microsoft.com>
Date: Tue, 25 Mar 2025 16:23:25 +0000
Subject: [PATCH 1/2] [NFC] add missing liscence to file
---
clang/lib/Lex/LexHLSLRootSignature.cpp | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/clang/lib/Lex/LexHLSLRootSignature.cpp b/clang/lib/Lex/LexHLSLRootSignature.cpp
index 8344aad15a9bc..81a8c74ce1be3 100644
--- a/clang/lib/Lex/LexHLSLRootSignature.cpp
+++ b/clang/lib/Lex/LexHLSLRootSignature.cpp
@@ -1,3 +1,11 @@
+//=== LexHLSLRootSignature.cpp - Lex Root Signature -----------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
#include "clang/Lex/LexHLSLRootSignature.h"
namespace clang {
>From cfe69b115871dc1a3d9de6d4c62b3c963597acc0 Mon Sep 17 00:00:00 2001
From: Finn Plummer <finnplummer at microsoft.com>
Date: Tue, 25 Mar 2025 16:24:50 +0000
Subject: [PATCH 2/2] [HLSL][RootSignature] Make keywords case-insensitive
- from dxc testing, it was shown that keywords could be specified in a
case-insensitive manner. the current implementation was case sensitive
---
clang/lib/Lex/LexHLSLRootSignature.cpp | 2 +-
.../Lex/LexHLSLRootSignatureTest.cpp | 30 +++++++++++++++++++
2 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Lex/LexHLSLRootSignature.cpp b/clang/lib/Lex/LexHLSLRootSignature.cpp
index 81a8c74ce1be3..fb4aab20c7275 100644
--- a/clang/lib/Lex/LexHLSLRootSignature.cpp
+++ b/clang/lib/Lex/LexHLSLRootSignature.cpp
@@ -95,7 +95,7 @@ RootSignatureToken RootSignatureLexer::LexToken() {
// Define a large string switch statement for all the keywords and enums
auto Switch = llvm::StringSwitch<TokenKind>(TokSpelling);
-#define KEYWORD(NAME) Switch.Case(#NAME, TokenKind::kw_##NAME);
+#define KEYWORD(NAME) Switch.CaseLower(#NAME, TokenKind::kw_##NAME);
#define ENUM(NAME, LIT) Switch.CaseLower(LIT, TokenKind::en_##NAME);
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
diff --git a/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp b/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp
index 0576f08c4c276..d72a842922f98 100644
--- a/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp
@@ -120,6 +120,36 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) {
CheckTokens(Lexer, Tokens, Expected);
}
+TEST_F(LexHLSLRootSignatureTest, ValidCaseInsensitiveKeywordsTest) {
+ // This test will check that we can lex keywords in an case-insensitive
+ // manner
+ const llvm::StringLiteral Source = R"cc(
+ DeScRiPtOrTaBlE
+
+ CBV srv UAV sampler
+ SPACE visibility FLAGS
+ numDescriptors OFFSET
+ )cc";
+ auto TokLoc = SourceLocation();
+ hlsl::RootSignatureLexer Lexer(Source, TokLoc);
+
+ SmallVector<hlsl::RootSignatureToken> Tokens;
+ SmallVector<hlsl::TokenKind> Expected = {
+ hlsl::TokenKind::kw_DescriptorTable,
+ hlsl::TokenKind::kw_CBV,
+ hlsl::TokenKind::kw_SRV,
+ hlsl::TokenKind::kw_UAV,
+ hlsl::TokenKind::kw_Sampler,
+ hlsl::TokenKind::kw_space,
+ hlsl::TokenKind::kw_visibility,
+ hlsl::TokenKind::kw_flags,
+ hlsl::TokenKind::kw_numDescriptors,
+ hlsl::TokenKind::kw_offset,
+ };
+
+ CheckTokens(Lexer, Tokens, Expected);
+}
+
TEST_F(LexHLSLRootSignatureTest, ValidLexPeekTest) {
// This test will check that we the peek api is correctly used
const llvm::StringLiteral Source = R"cc(
More information about the cfe-commits
mailing list