https://github.com/inbelic updated https://github.com/llvm/llvm-project/pull/140291
>From 4002195ce0dad1d292efc73530c7584edc1ecf7f Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 16:08:36 +0000 Subject: [PATCH 1/9] pre-req: add keywords --- clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def | 3 +++ clang/unittests/Lex/LexHLSLRootSignatureTest.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def b/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def index 5d16eaa5b72f6..7ca131349fed4 100644 --- a/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def +++ b/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def @@ -102,6 +102,9 @@ KEYWORD(offset) // StaticSampler Keywords: KEYWORD(mipLODBias) +KEYWORD(maxAnisotropy) +KEYWORD(minLOD) +KEYWORD(maxLOD) // Unbounded Enum: UNBOUNDED_ENUM(unbounded, "unbounded") diff --git a/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp b/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp index b610b8f10f8da..575a97e75a05d 100644 --- a/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp +++ b/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp @@ -136,7 +136,7 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) { space visibility flags numDescriptors offset - mipLODBias + mipLODBias maxAnisotropy minLOD maxLOD unbounded DESCRIPTOR_RANGE_OFFSET_APPEND >From caa9a93c263ac4e3ab8dce8008dc9b99e095aa6c Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 16:10:05 +0000 Subject: [PATCH 2/9] add parsing for maxAnisotropy --- .../clang/Parse/ParseHLSLRootSignature.h | 1 + clang/lib/Parse/ParseHLSLRootSignature.cpp | 20 +++++++++++++++++++ .../llvm/Frontend/HLSL/HLSLRootSignature.h | 1 + 3 files changed, 22 insertions(+) diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h index a03f33dfd3b4e..eff004c49c7c6 100644 --- a/clang/include/clang/Parse/ParseHLSLRootSignature.h +++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h @@ -112,6 +112,7 @@ class RootSignatureParser { struct ParsedStaticSamplerParams { std::optional<llvm::hlsl::rootsig::Register> Reg; std::optional<float> MipLODBias; + std::optional<uint32_t> MaxAnisotropy; }; std::optional<ParsedStaticSamplerParams> parseStaticSamplerParams(); diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp index 8be91f5991b21..1807746ec5595 100644 --- a/clang/lib/Parse/ParseHLSLRootSignature.cpp +++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp @@ -380,6 +380,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() { if (Params->MipLODBias.has_value()) Sampler.MipLODBias = Params->MipLODBias.value(); + if (Params->MaxAnisotropy.has_value()) + Sampler.MaxAnisotropy= Params->MaxAnisotropy.value(); + if (consumeExpectedToken(TokenKind::pu_r_paren, diag::err_hlsl_unexpected_end_of_params, /*param of=*/TokenKind::kw_StaticSampler)) @@ -682,6 +685,23 @@ RootSignatureParser::parseStaticSamplerParams() { return std::nullopt; Params.MipLODBias = MipLODBias; } + + // `maxAnisotropy` `=` POS_INT + if (tryConsumeExpectedToken(TokenKind::kw_maxAnisotropy)) { + if (Params.MaxAnisotropy.has_value()) { + getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param) + << CurToken.TokKind; + return std::nullopt; + } + + if (consumeExpectedToken(TokenKind::pu_equal)) + return std::nullopt; + + auto MaxAnisotropy = parseUIntParam(); + if (!MaxAnisotropy.has_value()) + return std::nullopt; + Params.MaxAnisotropy = MaxAnisotropy; + } } while (tryConsumeExpectedToken(TokenKind::pu_comma)); return Params; diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h index 14f5ddea3f978..7679945d23abd 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h +++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h @@ -162,6 +162,7 @@ raw_ostream &operator<<(raw_ostream &OS, const DescriptorTableClause &Clause); struct StaticSampler { Register Reg; float MipLODBias = 0.f; + uint32_t MaxAnisotropy = 16; }; /// Models RootElement : RootFlags | RootConstants | RootParam >From 2ff0c019bca49f202a440eee759c0e1d74e8f014 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 16:13:37 +0000 Subject: [PATCH 3/9] add parsing for minLOD --- .../clang/Parse/ParseHLSLRootSignature.h | 1 + clang/lib/Parse/ParseHLSLRootSignature.cpp | 20 +++++++++++++++++++ .../llvm/Frontend/HLSL/HLSLRootSignature.h | 1 + 3 files changed, 22 insertions(+) diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h index eff004c49c7c6..4214400096728 100644 --- a/clang/include/clang/Parse/ParseHLSLRootSignature.h +++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h @@ -113,6 +113,7 @@ class RootSignatureParser { std::optional<llvm::hlsl::rootsig::Register> Reg; std::optional<float> MipLODBias; std::optional<uint32_t> MaxAnisotropy; + std::optional<float> MinLOD; }; std::optional<ParsedStaticSamplerParams> parseStaticSamplerParams(); diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp index 1807746ec5595..c9e6e735553ca 100644 --- a/clang/lib/Parse/ParseHLSLRootSignature.cpp +++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp @@ -383,6 +383,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() { if (Params->MaxAnisotropy.has_value()) Sampler.MaxAnisotropy= Params->MaxAnisotropy.value(); + if (Params->MinLOD.has_value()) + Sampler.MinLOD= Params->MinLOD.value(); + if (consumeExpectedToken(TokenKind::pu_r_paren, diag::err_hlsl_unexpected_end_of_params, /*param of=*/TokenKind::kw_StaticSampler)) @@ -702,6 +705,23 @@ RootSignatureParser::parseStaticSamplerParams() { return std::nullopt; Params.MaxAnisotropy = MaxAnisotropy; } + + // `minLOD` `=` NUMBER + if (tryConsumeExpectedToken(TokenKind::kw_minLOD)) { + if (Params.MinLOD.has_value()) { + getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param) + << CurToken.TokKind; + return std::nullopt; + } + + if (consumeExpectedToken(TokenKind::pu_equal)) + return std::nullopt; + + auto MinLOD= parseFloatParam(); + if (!MinLOD.has_value()) + return std::nullopt; + Params.MinLOD = MinLOD; + } } while (tryConsumeExpectedToken(TokenKind::pu_comma)); return Params; diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h index 7679945d23abd..9e4cd6b7d17d4 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h +++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h @@ -163,6 +163,7 @@ struct StaticSampler { Register Reg; float MipLODBias = 0.f; uint32_t MaxAnisotropy = 16; + float MinLOD = 0.f; }; /// Models RootElement : RootFlags | RootConstants | RootParam >From 36dab3bb4c4f94405bd908a2713efcc1ac84515e Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 16:14:25 +0000 Subject: [PATCH 4/9] add parsing for maxLOD --- .../clang/Parse/ParseHLSLRootSignature.h | 1 + clang/lib/Parse/ParseHLSLRootSignature.cpp | 20 +++++++++++++++++++ .../llvm/Frontend/HLSL/HLSLRootSignature.h | 1 + 3 files changed, 22 insertions(+) diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h index 4214400096728..859ea7866cd04 100644 --- a/clang/include/clang/Parse/ParseHLSLRootSignature.h +++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h @@ -114,6 +114,7 @@ class RootSignatureParser { std::optional<float> MipLODBias; std::optional<uint32_t> MaxAnisotropy; std::optional<float> MinLOD; + std::optional<float> MaxLOD; }; std::optional<ParsedStaticSamplerParams> parseStaticSamplerParams(); diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp index c9e6e735553ca..d80d3c66bb1e0 100644 --- a/clang/lib/Parse/ParseHLSLRootSignature.cpp +++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp @@ -386,6 +386,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() { if (Params->MinLOD.has_value()) Sampler.MinLOD= Params->MinLOD.value(); + if (Params->MaxLOD.has_value()) + Sampler.MaxLOD= Params->MaxLOD.value(); + if (consumeExpectedToken(TokenKind::pu_r_paren, diag::err_hlsl_unexpected_end_of_params, /*param of=*/TokenKind::kw_StaticSampler)) @@ -722,6 +725,23 @@ RootSignatureParser::parseStaticSamplerParams() { return std::nullopt; Params.MinLOD = MinLOD; } + + // `maxLOD` `=` NUMBER + if (tryConsumeExpectedToken(TokenKind::kw_maxLOD)) { + if (Params.MaxLOD.has_value()) { + getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param) + << CurToken.TokKind; + return std::nullopt; + } + + if (consumeExpectedToken(TokenKind::pu_equal)) + return std::nullopt; + + auto MaxLOD= parseFloatParam(); + if (!MaxLOD.has_value()) + return std::nullopt; + Params.MaxLOD = MaxLOD; + } } while (tryConsumeExpectedToken(TokenKind::pu_comma)); return Params; diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h index 9e4cd6b7d17d4..08f3685bcdda0 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h +++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h @@ -164,6 +164,7 @@ struct StaticSampler { float MipLODBias = 0.f; uint32_t MaxAnisotropy = 16; float MinLOD = 0.f; + float MaxLOD = 3.402823466e+38f; }; /// Models RootElement : RootFlags | RootConstants | RootParam >From 017407d39b7f39749c336bd252b844d8e874cf8c Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 16:21:35 +0000 Subject: [PATCH 5/9] add testing of setting parameters --- .../Parse/ParseHLSLRootSignatureTest.cpp | 22 +++++++++++++++++-- .../llvm/Frontend/HLSL/HLSLRootSignature.h | 2 +- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp index b08c07f41141e..943329f365e27 100644 --- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp +++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp @@ -225,7 +225,11 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) { TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) { const llvm::StringLiteral Source = R"cc( - StaticSampler(s0, mipLODBias = 0) + StaticSampler(s0), + StaticSampler(s0, maxAnisotropy = 3, + minLOD = 4.2f, mipLODBias = 0.23e+3, + maxLOD = 9000, + ) )cc"; TrivialModuleLoader ModLoader; @@ -241,13 +245,27 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) { ASSERT_FALSE(Parser.parse()); - ASSERT_EQ(Elements.size(), 1u); + ASSERT_EQ(Elements.size(), 2u); + // Check default values are as expected RootElement Elem = Elements[0]; ASSERT_TRUE(std::holds_alternative<StaticSampler>(Elem)); ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg); ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u); ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f); + ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u); + ASSERT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f); + ASSERT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f); + + // Check values can be set as expected + Elem = Elements[1]; + ASSERT_TRUE(std::holds_alternative<StaticSampler>(Elem)); + ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg); + ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u); + ASSERT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f); + ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u); + ASSERT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f); + ASSERT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f); ASSERT_TRUE(Consumer->isSatisfied()); } diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h index 08f3685bcdda0..ebee25d8c81fa 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h +++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h @@ -164,7 +164,7 @@ struct StaticSampler { float MipLODBias = 0.f; uint32_t MaxAnisotropy = 16; float MinLOD = 0.f; - float MaxLOD = 3.402823466e+38f; + float MaxLOD = 3.402823466e+38f; // FLT_MAX }; /// Models RootElement : RootFlags | RootConstants | RootParam >From a7c4a3738c879d04eaf4584801afa3cad16a3a32 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 16:54:11 +0000 Subject: [PATCH 6/9] format --- clang/lib/Parse/ParseHLSLRootSignature.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp index d80d3c66bb1e0..23e64e8cb165d 100644 --- a/clang/lib/Parse/ParseHLSLRootSignature.cpp +++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp @@ -381,13 +381,13 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() { Sampler.MipLODBias = Params->MipLODBias.value(); if (Params->MaxAnisotropy.has_value()) - Sampler.MaxAnisotropy= Params->MaxAnisotropy.value(); + Sampler.MaxAnisotropy = Params->MaxAnisotropy.value(); if (Params->MinLOD.has_value()) - Sampler.MinLOD= Params->MinLOD.value(); + Sampler.MinLOD = Params->MinLOD.value(); if (Params->MaxLOD.has_value()) - Sampler.MaxLOD= Params->MaxLOD.value(); + Sampler.MaxLOD = Params->MaxLOD.value(); if (consumeExpectedToken(TokenKind::pu_r_paren, diag::err_hlsl_unexpected_end_of_params, @@ -720,7 +720,7 @@ RootSignatureParser::parseStaticSamplerParams() { if (consumeExpectedToken(TokenKind::pu_equal)) return std::nullopt; - auto MinLOD= parseFloatParam(); + auto MinLOD = parseFloatParam(); if (!MinLOD.has_value()) return std::nullopt; Params.MinLOD = MinLOD; @@ -737,7 +737,7 @@ RootSignatureParser::parseStaticSamplerParams() { if (consumeExpectedToken(TokenKind::pu_equal)) return std::nullopt; - auto MaxLOD= parseFloatParam(); + auto MaxLOD = parseFloatParam(); if (!MaxLOD.has_value()) return std::nullopt; Params.MaxLOD = MaxLOD; >From 194df3fefdb773232d0ad2babf1ef976e15f64cc Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Mon, 26 May 2025 20:52:56 +0000 Subject: [PATCH 7/9] review: use EXPECT_FLOAT_EQ --- clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp index 943329f365e27..f3e421f99be93 100644 --- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp +++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp @@ -254,8 +254,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) { ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u); ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f); ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u); - ASSERT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f); - ASSERT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f); + ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f); + ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f); // Check values can be set as expected Elem = Elements[1]; @@ -264,8 +264,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) { ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u); ASSERT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f); ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u); - ASSERT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f); - ASSERT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f); + ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f); + ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f); ASSERT_TRUE(Consumer->isSatisfied()); } >From 10af0714ef1d59eb001002e76443a7f2deb437ed Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Mon, 26 May 2025 21:02:46 +0000 Subject: [PATCH 8/9] review: use defined FLT_MAX --- llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h index ebee25d8c81fa..43ec14b76a7fa 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h +++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h @@ -164,7 +164,7 @@ struct StaticSampler { float MipLODBias = 0.f; uint32_t MaxAnisotropy = 16; float MinLOD = 0.f; - float MaxLOD = 3.402823466e+38f; // FLT_MAX + float MaxLOD = std::numeric_limits<float>::max(); }; /// Models RootElement : RootFlags | RootConstants | RootParam >From c7b1673c77e89469e7dddb8b5e798ee1cf17b37e Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 28 May 2025 22:14:53 +0000 Subject: [PATCH 9/9] review: add missed ASSERT_FLOAT_EQ --- clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp index f3e421f99be93..b3703c21b5ee1 100644 --- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp +++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp @@ -262,7 +262,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) { ASSERT_TRUE(std::holds_alternative<StaticSampler>(Elem)); ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg); ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u); - ASSERT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f); + ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f); ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u); ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f); ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits