https://github.com/inbelic created https://github.com/llvm/llvm-project/pull/144813
This pr provides the ability to specify the root signature version as a compiler option and to retain this in the root signature decl. It also updates the methods to serialize the version when dumping the declaration and to output the version when generating the metadata. - Update `DXILABI` to define the root signature versions - Update `Options.td` and `LangOpts.h` to define the `hlsl-rootsig-ver` compiler option - Update `Decl.[h|cpp]` and `SeamHLSL.cpp` so that `RootSignatureDecl` will retain its version type - Updates `CGHLSLRuntime.cpp` to generate the extra metadata field - Add tests to illustrate Resolves https://github.com/llvm/llvm-project/issues/126557. Note: this does not implement validation based on versioning. https://github.com/llvm/llvm-project/issues/129940 is required to retrieve the version and use it for validations. >From fde2b30c27744d58d0b7f40965324c090cdf1277 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 18 Jun 2025 21:47:31 +0000 Subject: [PATCH 1/7] define root signature versions --- llvm/include/llvm/Support/DXILABI.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/llvm/include/llvm/Support/DXILABI.h b/llvm/include/llvm/Support/DXILABI.h index b479f7c73eba3..89bf707c205f3 100644 --- a/llvm/include/llvm/Support/DXILABI.h +++ b/llvm/include/llvm/Support/DXILABI.h @@ -99,6 +99,12 @@ enum class SamplerFeedbackType : uint32_t { const unsigned MinWaveSize = 4; const unsigned MaxWaveSize = 128; +// D3D_ROOT_SIGNATURE_VERSION +enum class RootSignatureVersion { + rootsig_1_0 = 0x1, + rootsig_1_1 = 0x2, +}; + } // namespace dxil } // namespace llvm >From 8c2fd9607e66d6f9fd83b333d65804732746503f Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 18 Jun 2025 22:41:36 +0000 Subject: [PATCH 2/7] define hlsl-rootsig-ver for the clang/cc1/dxc drivers - allow for fall-through from dxcoptions to cc1 options - defined as a langopts and only allow when we are compiling HLSL --- clang/include/clang/Basic/LangOptions.h | 5 +++++ clang/include/clang/Driver/Options.td | 9 +++++++++ clang/lib/Driver/ToolChains/Clang.cpp | 3 ++- clang/lib/Frontend/CompilerInvocation.cpp | 4 ++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index 491e8bee9fd5c..6442492d104b9 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -24,6 +24,7 @@ #include "clang/Basic/Visibility.h" #include "llvm/ADT/FloatingPointMode.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Support/DXILABI.h" #include "llvm/TargetParser/Triple.h" #include <optional> #include <string> @@ -623,6 +624,10 @@ class LangOptions : public LangOptionsBase { // implementation on real-world examples. std::string OpenACCMacroOverride; + /// The HLSL root signature version for dxil. + llvm::dxil::RootSignatureVersion HLSLRootSigVer = + llvm::dxil::RootSignatureVersion::rootsig_1_1; + // Indicates if the wasm-opt binary must be ignored in the case of a // WebAssembly target. bool NoWasmOpt = false; diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 0ffd8c40da7da..141d80e786a0c 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -9288,6 +9288,15 @@ def fcgl : DXCFlag<"fcgl">, Alias<emit_pristine_llvm>; def enable_16bit_types : DXCFlag<"enable-16bit-types">, Alias<fnative_half_type>, HelpText<"Enable 16-bit types and disable min precision types." "Available in HLSL 2018 and shader model 6.2.">; +def hlsl_rootsig_ver : + Option<["-"], "hlsl-rootsig-ver", KIND_SEPARATE>, + Group<dxc_Group>, + Visibility<[ClangOption, CC1Option, DXCOption]>, + HelpText<"Root Signature Version">, + Values<"rootsig_1_0,rootsig_1_1">, + NormalizedValuesScope<"llvm::dxil::RootSignatureVersion">, + NormalizedValues<["rootsig_1_0", "rootsig_1_1"]>, + MarshallingInfoEnum<LangOpts<"HLSLRootSigVer">, "rootsig_1_1">; def hlsl_entrypoint : Option<["-"], "hlsl-entry", KIND_SEPARATE>, Group<dxc_Group>, Visibility<[ClangOption, CC1Option]>, diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index a78a1c8978183..b779d5be12941 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3834,7 +3834,8 @@ static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs, options::OPT_emit_obj, options::OPT_disable_llvm_passes, options::OPT_fnative_half_type, - options::OPT_hlsl_entrypoint}; + options::OPT_hlsl_entrypoint, + options::OPT_hlsl_rootsig_ver}; if (!types::isHLSL(InputType)) return; for (const auto &Arg : ForwardedArguments) diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 5c52dc33ddf6c..a53a7347be481 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -636,6 +636,10 @@ static bool FixupInvocation(CompilerInvocation &Invocation, Diags.Report(diag::err_drv_argument_not_allowed_with) << "-hlsl-entry" << GetInputKindName(IK); + if (Args.hasArg(OPT_hlsl_rootsig_ver) && !LangOpts.HLSL) + Diags.Report(diag::err_drv_argument_not_allowed_with) + << "-hlsl-rootsig-ver" << GetInputKindName(IK); + if (Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP) Diags.Report(diag::warn_ignored_hip_only_option) << Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args); >From 9408f86f8ba958bfd314c6f43401b00b460b2d23 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 18 Jun 2025 22:41:57 +0000 Subject: [PATCH 3/7] update RootSignatureDecl to store version --- clang/include/clang/AST/Decl.h | 6 ++++++ clang/lib/AST/Decl.cpp | 18 ++++++++++-------- clang/lib/Sema/SemaHLSL.cpp | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h index 05aac15b30cd6..3e2d39e3a2784 100644 --- a/clang/include/clang/AST/Decl.h +++ b/clang/include/clang/AST/Decl.h @@ -5179,6 +5179,8 @@ class HLSLRootSignatureDecl final llvm::hlsl::rootsig::RootElement> { friend TrailingObjects; + llvm::dxil::RootSignatureVersion RootSigVer; + unsigned NumElems; llvm::hlsl::rootsig::RootElement *getElems() { return getTrailingObjects(); } @@ -5188,16 +5190,20 @@ class HLSLRootSignatureDecl final } HLSLRootSignatureDecl(DeclContext *DC, SourceLocation Loc, IdentifierInfo *ID, + llvm::dxil::RootSignatureVersion RootSigVer, unsigned NumElems); public: static HLSLRootSignatureDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, IdentifierInfo *ID, + llvm::dxil::RootSignatureVersion RootSigVer, ArrayRef<llvm::hlsl::rootsig::RootElement> RootElements); static HLSLRootSignatureDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID); + llvm::dxil::RootSignatureVersion getVersion() const { return RootSigVer; } + ArrayRef<llvm::hlsl::rootsig::RootElement> getRootElements() const { return {getElems(), NumElems}; } diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 860968939b4ae..87cd7bc331b22 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -5853,21 +5853,21 @@ bool HLSLBufferDecl::buffer_decls_empty() { // HLSLRootSignatureDecl Implementation //===----------------------------------------------------------------------===// -HLSLRootSignatureDecl::HLSLRootSignatureDecl(DeclContext *DC, - SourceLocation Loc, - IdentifierInfo *ID, - unsigned NumElems) +HLSLRootSignatureDecl::HLSLRootSignatureDecl( + DeclContext *DC, SourceLocation Loc, IdentifierInfo *ID, + llvm::dxil::RootSignatureVersion RootSigVer, unsigned NumElems) : NamedDecl(Decl::Kind::HLSLRootSignature, DC, Loc, DeclarationName(ID)), - NumElems(NumElems) {} + RootSigVer(RootSigVer), NumElems(NumElems) {} HLSLRootSignatureDecl *HLSLRootSignatureDecl::Create( ASTContext &C, DeclContext *DC, SourceLocation Loc, IdentifierInfo *ID, + llvm::dxil::RootSignatureVersion RootSigVer, ArrayRef<llvm::hlsl::rootsig::RootElement> RootElements) { HLSLRootSignatureDecl *RSDecl = new (C, DC, additionalSizeToAlloc<llvm::hlsl::rootsig::RootElement>( RootElements.size())) - HLSLRootSignatureDecl(DC, Loc, ID, RootElements.size()); + HLSLRootSignatureDecl(DC, Loc, ID, RootSigVer, RootElements.size()); auto *StoredElems = RSDecl->getElems(); std::uninitialized_copy(RootElements.begin(), RootElements.end(), StoredElems); @@ -5876,8 +5876,10 @@ HLSLRootSignatureDecl *HLSLRootSignatureDecl::Create( HLSLRootSignatureDecl * HLSLRootSignatureDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID) { - HLSLRootSignatureDecl *Result = new (C, ID) - HLSLRootSignatureDecl(nullptr, SourceLocation(), nullptr, /*NumElems=*/0); + HLSLRootSignatureDecl *Result = new (C, ID) HLSLRootSignatureDecl( + nullptr, SourceLocation(), nullptr, + /*RootSigVer*/ llvm::dxil::RootSignatureVersion::rootsig_1_0, + /*NumElems=*/0); return Result; } diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index b55f4fd786b58..03431f3944c4b 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -997,7 +997,7 @@ void SemaHLSL::ActOnFinishRootSignatureDecl( auto *SignatureDecl = HLSLRootSignatureDecl::Create( SemaRef.getASTContext(), /*DeclContext=*/SemaRef.CurContext, Loc, - DeclIdent, Elements); + DeclIdent, SemaRef.getLangOpts().HLSLRootSigVer, Elements); SignatureDecl->setImplicit(); SemaRef.PushOnScopeChains(SignatureDecl, SemaRef.getCurScope()); >From a307907f764a28b8ad08522a1595ef1bd53ee338 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 18 Jun 2025 22:42:45 +0000 Subject: [PATCH 4/7] update metadata generation to output the retained version --- clang/lib/CodeGen/CGHLSLRuntime.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index 585411bc59e16..55f4e7fd4e0ec 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -66,14 +66,22 @@ void addDxilValVersion(StringRef ValVersionStr, llvm::Module &M) { DXILValMD->addOperand(Val); } -void addRootSignature(ArrayRef<llvm::hlsl::rootsig::RootElement> Elements, +void addRootSignature(llvm::dxil::RootSignatureVersion RootSigVer, + ArrayRef<llvm::hlsl::rootsig::RootElement> Elements, llvm::Function *Fn, llvm::Module &M) { auto &Ctx = M.getContext(); + IRBuilder<> Builder(Ctx); - llvm::hlsl::rootsig::MetadataBuilder Builder(Ctx, Elements); - MDNode *RootSignature = Builder.BuildRootSignature(); - MDNode *FnPairing = - MDNode::get(Ctx, {ValueAsMetadata::get(Fn), RootSignature}); + llvm::hlsl::rootsig::MetadataBuilder RSBuilder(Ctx, Elements); + MDNode *RootSignature = RSBuilder.BuildRootSignature(); + + Metadata *Operands[] = { + ValueAsMetadata::get(Fn), + RootSignature, + ConstantAsMetadata::get( + Builder.getInt32(llvm::to_underlying(RootSigVer))), + }; + MDNode *FnPairing = MDNode::get(Ctx, Operands); StringRef RootSignatureValKey = "dx.rootsignatures"; auto *RootSignatureValMD = M.getOrInsertNamedMetadata(RootSignatureValKey); @@ -465,9 +473,11 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD, // Add and identify root signature to function, if applicable for (const Attr *Attr : FD->getAttrs()) { - if (const auto *RSAttr = dyn_cast<RootSignatureAttr>(Attr)) - addRootSignature(RSAttr->getSignatureDecl()->getRootElements(), EntryFn, + if (const auto *RSAttr = dyn_cast<RootSignatureAttr>(Attr)) { + auto *RSDecl = RSAttr->getSignatureDecl(); + addRootSignature(RSDecl->getVersion(), RSDecl->getRootElements(), EntryFn, M); + } } } >From 4ef6b3a50eca2460a70512f1ae0c8f6a6bf61741 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 18 Jun 2025 22:43:04 +0000 Subject: [PATCH 5/7] update metadata testcase --- clang/test/CodeGenHLSL/RootSignature.hlsl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/clang/test/CodeGenHLSL/RootSignature.hlsl b/clang/test/CodeGenHLSL/RootSignature.hlsl index ca843ffbb1ced..6618ca741aa9d 100644 --- a/clang/test/CodeGenHLSL/RootSignature.hlsl +++ b/clang/test/CodeGenHLSL/RootSignature.hlsl @@ -3,14 +3,14 @@ // CHECK: !dx.rootsignatures = !{![[#EMPTY_ENTRY:]], ![[#DT_ENTRY:]], // CHECK-SAME: ![[#RF_ENTRY:]], ![[#RC_ENTRY:]], ![[#RD_ENTRY:]], ![[#SS_ENTRY:]]} -// CHECK: ![[#EMPTY_ENTRY]] = !{ptr @EmptyEntry, ![[#EMPTY:]]} +// CHECK: ![[#EMPTY_ENTRY]] = !{ptr @EmptyEntry, ![[#EMPTY:]], i32 2} // CHECK: ![[#EMPTY]] = !{} [shader("compute"), RootSignature("")] [numthreads(1,1,1)] void EmptyEntry() {} -// CHECK: ![[#DT_ENTRY]] = !{ptr @DescriptorTableEntry, ![[#DT_RS:]]} +// CHECK: ![[#DT_ENTRY]] = !{ptr @DescriptorTableEntry, ![[#DT_RS:]], i32 2} // CHECK: ![[#DT_RS]] = !{![[#TABLE:]]} // CHECK: ![[#TABLE]] = !{!"DescriptorTable", i32 0, ![[#CBV:]], ![[#SRV:]]} // CHECK: ![[#CBV]] = !{!"CBV", i32 1, i32 0, i32 0, i32 -1, i32 4} @@ -25,7 +25,7 @@ void EmptyEntry() {} [numthreads(1,1,1)] void DescriptorTableEntry() {} -// CHECK: ![[#RF_ENTRY]] = !{ptr @RootFlagsEntry, ![[#RF_RS:]]} +// CHECK: ![[#RF_ENTRY]] = !{ptr @RootFlagsEntry, ![[#RF_RS:]], i32 2} // CHECK: ![[#RF_RS]] = !{![[#ROOT_FLAGS:]]} // CHECK: ![[#ROOT_FLAGS]] = !{!"RootFlags", i32 2114} @@ -38,7 +38,7 @@ void DescriptorTableEntry() {} [numthreads(1,1,1)] void RootFlagsEntry() {} -// CHECK: ![[#RC_ENTRY]] = !{ptr @RootConstantsEntry, ![[#RC_RS:]]} +// CHECK: ![[#RC_ENTRY]] = !{ptr @RootConstantsEntry, ![[#RC_RS:]], i32 2} // CHECK: ![[#RC_RS]] = !{![[#ROOT_CONSTANTS:]]} // CHECK: ![[#ROOT_CONSTANTS]] = !{!"RootConstants", i32 5, i32 1, i32 2, i32 1} @@ -52,7 +52,7 @@ void RootFlagsEntry() {} [numthreads(1,1,1)] void RootConstantsEntry() {} -// CHECK: ![[#RD_ENTRY]] = !{ptr @RootDescriptorsEntry, ![[#RD_RS:]]} +// CHECK: ![[#RD_ENTRY]] = !{ptr @RootDescriptorsEntry, ![[#RD_RS:]], i32 2} // CHECK: ![[#RD_RS]] = !{![[#ROOT_CBV:]], ![[#ROOT_UAV:]], ![[#ROOT_SRV:]]} // CHECK: ![[#ROOT_CBV]] = !{!"RootCBV", i32 0, i32 0, i32 0, i32 4} // CHECK: ![[#ROOT_UAV]] = !{!"RootUAV", i32 0, i32 42, i32 3, i32 2} @@ -66,7 +66,7 @@ void RootConstantsEntry() {} [numthreads(1,1,1)] void RootDescriptorsEntry() {} -// CHECK: ![[#SS_ENTRY]] = !{ptr @StaticSamplerEntry, ![[#SS_RS:]]} +// CHECK: ![[#SS_ENTRY]] = !{ptr @StaticSamplerEntry, ![[#SS_RS:]], i32 2} // CHECK: ![[#SS_RS]] = !{![[#STATIC_SAMPLER:]]} // checking filter = 0x4 >From 3e795b2db0ff8fcd5fab558d2133ffdb7af9e83a Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 18 Jun 2025 22:43:20 +0000 Subject: [PATCH 6/7] add test-case for specifying the version at it being correclty generated --- clang/test/Driver/dxc_hlsl-rootsig-ver.hlsl | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 clang/test/Driver/dxc_hlsl-rootsig-ver.hlsl diff --git a/clang/test/Driver/dxc_hlsl-rootsig-ver.hlsl b/clang/test/Driver/dxc_hlsl-rootsig-ver.hlsl new file mode 100644 index 0000000000000..5e65b43c15b51 --- /dev/null +++ b/clang/test/Driver/dxc_hlsl-rootsig-ver.hlsl @@ -0,0 +1,15 @@ +// RUN: %clang_dxc -T cs_6_0 -fcgl %s | FileCheck %s --check-prefix=CHECK-V1_1 +// RUN: %clang_dxc -T cs_6_0 -fcgl -hlsl-rootsig-ver rootsig_1_0 %s | FileCheck %s --check-prefix=CHECK-V1_0 +// RUN: %clang_dxc -T cs_6_0 -fcgl -hlsl-rootsig-ver rootsig_1_1 %s | FileCheck %s --check-prefix=CHECK-V1_1 + +// Test to demonstrate that we can specify the root-signature versions + +// CHECK: !dx.rootsignatures = !{![[#EMPTY_ENTRY:]]} +// CHECK: ![[#EMPTY_ENTRY]] = !{ptr @EmptyEntry, ![[#EMPTY:]], +// CHECK-V1_0: i32 1} +// CHECK-V1_1: i32 2} +// CHECK: ![[#EMPTY]] = !{} + +[shader("compute"), RootSignature("")] +[numthreads(1,1,1)] +void EmptyEntry() {} >From 015936646ce5e17ddb8f2191610784864109ae48 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 18 Jun 2025 22:48:58 +0000 Subject: [PATCH 7/7] update serialization of root signature to output version --- clang/lib/AST/TextNodeDumper.cpp | 10 ++++++++++ clang/test/AST/HLSL/RootSignatures-AST.hlsl | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/clang/lib/AST/TextNodeDumper.cpp b/clang/lib/AST/TextNodeDumper.cpp index 1b84b8824047b..cdb6f7b88777d 100644 --- a/clang/lib/AST/TextNodeDumper.cpp +++ b/clang/lib/AST/TextNodeDumper.cpp @@ -3041,6 +3041,16 @@ void TextNodeDumper::VisitHLSLBufferDecl(const HLSLBufferDecl *D) { void TextNodeDumper::VisitHLSLRootSignatureDecl( const HLSLRootSignatureDecl *D) { dumpName(D); + OS << " version: "; + switch (D->getVersion()) { + case llvm::dxil::RootSignatureVersion::rootsig_1_0: + OS << "1.0"; + break; + case llvm::dxil::RootSignatureVersion::rootsig_1_1: + OS << "1.1"; + break; + } + OS << ", "; llvm::hlsl::rootsig::dumpRootElements(OS, D->getRootElements()); } diff --git a/clang/test/AST/HLSL/RootSignatures-AST.hlsl b/clang/test/AST/HLSL/RootSignatures-AST.hlsl index c700174da764d..4b78c24683801 100644 --- a/clang/test/AST/HLSL/RootSignatures-AST.hlsl +++ b/clang/test/AST/HLSL/RootSignatures-AST.hlsl @@ -1,5 +1,11 @@ // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -ast-dump \ // RUN: -disable-llvm-passes -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -ast-dump \ +// RUN: -hlsl-rootsig-ver rootsig_1_0 \ +// RUN: -disable-llvm-passes -o - %s | FileCheck %s --check-prefix=CHECK-V1_0 +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -ast-dump \ +// RUN: -hlsl-rootsig-ver rootsig_1_1 \ +// RUN: -disable-llvm-passes -o - %s | FileCheck %s --check-prefix=CHECK-V1_1 // This test ensures that the sample root signature is parsed without error and // the Attr AST Node is created succesfully. If an invalid root signature was @@ -16,6 +22,8 @@ "DescriptorTable(Sampler(s0, numDescriptors = 4, space = 1))" // CHECK: -HLSLRootSignatureDecl 0x{{.*}} {{.*}} implicit [[SAMPLE_RS_DECL:__hlsl_rootsig_decl_\d*]] +// CHECK-V1_0: version: 1.0, +// CHECK-V1_1: version: 1.1, // CHECK-SAME: RootElements{ // CHECK-SAME: CBV(b1, numDescriptors = 1, space = 0, // CHECK-SAME: offset = DescriptorTableOffsetAppend, flags = DataStaticWhileSetAtExecute), _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits