From 3644d4177e8401b581f73127de48e1086e4909cf Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Thu, 20 Mar 2025 16:08:37 -0700 Subject: [PATCH 01/13] first draft --- tools/clang/lib/AST/ASTContextHLSL.cpp | 6 ++++++ .../d3dreflect/rayquery-reflection.hlsl | 14 ++++++++++++++ tools/clang/tools/dxcompiler/dxcdisassembler.cpp | 4 +++- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl diff --git a/tools/clang/lib/AST/ASTContextHLSL.cpp b/tools/clang/lib/AST/ASTContextHLSL.cpp index dcd3e89e9a..2856c0a8da 100644 --- a/tools/clang/lib/AST/ASTContextHLSL.cpp +++ b/tools/clang/lib/AST/ASTContextHLSL.cpp @@ -699,6 +699,12 @@ void hlsl::AddRaytracingConstants(ASTContext &context) { AddConstUInt( context, StringRef("RAYTRACING_PIPELINE_FLAG_SKIP_PROCEDURAL_PRIMITIVES"), (unsigned)DXIL::RaytracingPipelineFlags::SkipProceduralPrimitives); + AddConstUInt(context, + context.getTranslationUnitDecl(), StringRef( + "RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS"), + (unsigned)DXIL::RaytracingPipelineFlags::AllowOpacityMicromaps, + ConstructAvailabilityAttribute(context, VT69)); + } /// Adds all constants and enums for sampler feedback diff --git a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl b/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl new file mode 100644 index 0000000000..59086e65a0 --- /dev/null +++ b/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl @@ -0,0 +1,14 @@ +// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -validator-version 1.9 %s | FileCheck -check-prefix=NOD3D %s +// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -validator-version 1.9 %s | %D3DReflect %s | FileCheck -check-prefix=D3D %s + +// NOD3D: ; RaytracingPipelineConfig1 rpc = { MaxTraceRecursionDepth = 32, Flags = RAYTRACING_PIPELINE_FLAG_SKIP_TRIANGLES | RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; +// D3D: MinShaderTarget: 0x10069 +RaytracingPipelineConfig1 rpc = { 32, RAYTRACING_PIPELINE_FLAG_SKIP_TRIANGLES | RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; + +RaytracingAccelerationStructure RTAS; +// DXR entry point to ensure RDAT flags match during validation. +[shader("vertex")] +void main(RayDesc rayDesc : RAYDESC) { + RayQuery rayQuery1; + rayQuery1.TraceRayInline(RTAS, RAY_FLAG_FORCE_OMM_2_STATE, 2, rayDesc); +} diff --git a/tools/clang/tools/dxcompiler/dxcdisassembler.cpp b/tools/clang/tools/dxcompiler/dxcdisassembler.cpp index 01f4973fbe..3e21619b0c 100644 --- a/tools/clang/tools/dxcompiler/dxcdisassembler.cpp +++ b/tools/clang/tools/dxcompiler/dxcdisassembler.cpp @@ -670,7 +670,9 @@ static const char *FlagToString(DXIL::RaytracingPipelineFlags Flag) { case DXIL::RaytracingPipelineFlags::SkipTriangles: return "RAYTRACING_PIPELINE_FLAG_SKIP_TRIANGLES"; case DXIL::RaytracingPipelineFlags::SkipProceduralPrimitives: - return "RAYTRACING_PIPELINE_FLAG_SKIP_PROCEDURAL_PRIMITIVES"; + return "RAYTRACING_PIPELINE_FLAG_SKIP_PROCEDURAL_PRIMITIVES"; + case DXIL::RaytracingPipelineFlags::AllowOpacityMicromaps: + return "RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS"; } return ""; } From 2c9ebf52e9c1e13526e535d212e7b11fd699eddc Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Thu, 20 Mar 2025 16:13:32 -0700 Subject: [PATCH 02/13] clang format --- tools/clang/lib/AST/ASTContextHLSL.cpp | 6 ++---- tools/clang/tools/dxcompiler/dxcdisassembler.cpp | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/clang/lib/AST/ASTContextHLSL.cpp b/tools/clang/lib/AST/ASTContextHLSL.cpp index 2856c0a8da..3748f8f8f8 100644 --- a/tools/clang/lib/AST/ASTContextHLSL.cpp +++ b/tools/clang/lib/AST/ASTContextHLSL.cpp @@ -699,12 +699,10 @@ void hlsl::AddRaytracingConstants(ASTContext &context) { AddConstUInt( context, StringRef("RAYTRACING_PIPELINE_FLAG_SKIP_PROCEDURAL_PRIMITIVES"), (unsigned)DXIL::RaytracingPipelineFlags::SkipProceduralPrimitives); - AddConstUInt(context, - context.getTranslationUnitDecl(), StringRef( - "RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS"), + AddConstUInt(context, context.getTranslationUnitDecl(), + StringRef("RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS"), (unsigned)DXIL::RaytracingPipelineFlags::AllowOpacityMicromaps, ConstructAvailabilityAttribute(context, VT69)); - } /// Adds all constants and enums for sampler feedback diff --git a/tools/clang/tools/dxcompiler/dxcdisassembler.cpp b/tools/clang/tools/dxcompiler/dxcdisassembler.cpp index 3e21619b0c..3af305d52a 100644 --- a/tools/clang/tools/dxcompiler/dxcdisassembler.cpp +++ b/tools/clang/tools/dxcompiler/dxcdisassembler.cpp @@ -670,7 +670,7 @@ static const char *FlagToString(DXIL::RaytracingPipelineFlags Flag) { case DXIL::RaytracingPipelineFlags::SkipTriangles: return "RAYTRACING_PIPELINE_FLAG_SKIP_TRIANGLES"; case DXIL::RaytracingPipelineFlags::SkipProceduralPrimitives: - return "RAYTRACING_PIPELINE_FLAG_SKIP_PROCEDURAL_PRIMITIVES"; + return "RAYTRACING_PIPELINE_FLAG_SKIP_PROCEDURAL_PRIMITIVES"; case DXIL::RaytracingPipelineFlags::AllowOpacityMicromaps: return "RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS"; } From 8502636a3c8275a7eea8160d366da1037b2d144f Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Thu, 20 Mar 2025 18:20:21 -0700 Subject: [PATCH 03/13] add implicit ast / ast dump tests --- .../d3dreflect/rayquery-d3dreflect.hlsl | 4 +++ .../d3dreflect/rayquery-reflection.hlsl | 36 +++++++++++-------- 2 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-d3dreflect.hlsl diff --git a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-d3dreflect.hlsl b/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-d3dreflect.hlsl new file mode 100644 index 0000000000..e85cd94d45 --- /dev/null +++ b/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-d3dreflect.hlsl @@ -0,0 +1,4 @@ +// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -validator-version 1.9 %s | %D3DReflect %s | FileCheck %s + +// CHECK: MinShaderTarget: 0x10069 +RaytracingPipelineConfig1 rpc = { 32, RAYTRACING_PIPELINE_FLAG_SKIP_TRIANGLES | RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; diff --git a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl b/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl index 59086e65a0..a5cbeb9965 100644 --- a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl +++ b/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl @@ -1,14 +1,22 @@ -// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -validator-version 1.9 %s | FileCheck -check-prefix=NOD3D %s -// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -validator-version 1.9 %s | %D3DReflect %s | FileCheck -check-prefix=D3D %s - -// NOD3D: ; RaytracingPipelineConfig1 rpc = { MaxTraceRecursionDepth = 32, Flags = RAYTRACING_PIPELINE_FLAG_SKIP_TRIANGLES | RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; -// D3D: MinShaderTarget: 0x10069 -RaytracingPipelineConfig1 rpc = { 32, RAYTRACING_PIPELINE_FLAG_SKIP_TRIANGLES | RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; - -RaytracingAccelerationStructure RTAS; -// DXR entry point to ensure RDAT flags match during validation. -[shader("vertex")] -void main(RayDesc rayDesc : RAYDESC) { - RayQuery rayQuery1; - rayQuery1.TraceRayInline(RTAS, RAY_FLAG_FORCE_OMM_2_STATE, 2, rayDesc); -} +// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -validator-version 1.9 %s | FileCheck %s +// RUsN: %dxilver 1.8 | %dxc -T lib_6_8 -validator-version 1.8 %s | FileCheck -check-prefix=UNDER69 %s +// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -validator-version 1.9 -ast-dump %s | FileCheck -check-prefix=AST %s +// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -validator-version 1.9 -ast-dump-implicit %s | FileCheck -check-prefix=ASTIMPL %s + +// CHECK: ; RaytracingPipelineConfig1 rpc = { MaxTraceRecursionDepth = 32, Flags = RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; + + +// AST: TranslationUnitDecl 0x{{.+}} <> +// AST-NEXT: VarDecl 0x{{.+}} rpc 'RaytracingPipelineConfig1' static cinit +// AST-NEXT: InitListExpr 0x{{.+}} 'RaytracingPipelineConfig1' +// AST-NEXT: ImplicitCastExpr 0x{{.+}} 'unsigned int' +// AST-NEXT: IntegerLiteral 0x{{.+}} 'literal int' 32 +// AST-NEXT: ImplicitCastExpr 0x{{.+}} 'unsigned int' +// AST-NEXT: DeclRefExpr 0x{{.+}} 'const unsigned int' lvalue Var 0x{{.+}} 'RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS' 'const unsigned int' +// ASTIMPL: VarDecl 0x{{.+}} <> implicit referenced RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS 'const unsigned int' static cinit +// ASTIMPL-NEXT: IntegerLiteral 0x{{.+}} <> 'const unsigned int' 1024 +// ASTIMPL-NEXT: AvailabilityAttr 0x{{.+}} <> Implicit 6.9 0 0 "" +RaytracingPipelineConfig1 rpc = { 32, RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; + +// UNDER69: Potential misuse + From 625f8d280c8507e171475f5809909c41a62d9316 Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Fri, 21 Mar 2025 18:32:41 -0700 Subject: [PATCH 04/13] fiddle with reflect test --- .../test/HLSLFileCheck/d3dreflect/rayquery-d3dreflect.hlsl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-d3dreflect.hlsl b/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-d3dreflect.hlsl index e85cd94d45..5bd5465deb 100644 --- a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-d3dreflect.hlsl +++ b/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-d3dreflect.hlsl @@ -2,3 +2,9 @@ // CHECK: MinShaderTarget: 0x10069 RaytracingPipelineConfig1 rpc = { 32, RAYTRACING_PIPELINE_FLAG_SKIP_TRIANGLES | RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; +SubobjectToExportsAssociation sea = { "rpc", "MyRayGenShader" }; + +[shader("raygeneration")] +void MyRayGenShader() { + // The pipeline configuration affects this shader but is not directly accessible. +} From d8385ecede480d530fb00d4ef39fbb77e2186ff6 Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Mon, 24 Mar 2025 16:30:21 -0700 Subject: [PATCH 05/13] a test --- tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp | 21 +++++++++++++++++-- .../d3dreflect/rayquery-d3dreflect.hlsl | 10 --------- .../d3dreflect/rayquery-reflection.hlsl | 10 ++++----- 3 files changed, 24 insertions(+), 17 deletions(-) delete mode 100644 tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-d3dreflect.hlsl diff --git a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp index ed727af149..da7ae58fd1 100644 --- a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp +++ b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp @@ -731,6 +731,23 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { for (VarDecl *VD : InitGlobals) Visitor.TraverseDecl(VD); for (FunctionDecl *FD : callGraph.GetVisitedFunctions()) - Visitor.TraverseDecl(FD); + Visitor.TraverseDecl(FD); + + for (VarDecl *VD : GlobalsWithInit) { + DXIL::NodeLaunchType NodeLaunchTy = DXIL::NodeLaunchType::Invalid; + HLSLCallDiagnoseVisitor Visitor(self, shaderModel, EntrySK, NodeLaunchTy, + VD, DiagnosedCalls, + DeclAvailabilityChecked); + if (InitListExpr *ILE = dyn_cast(VD->getInit())) { + if (auto RT = ILE->getType()->getAs()) { + if (const RecordDecl *RD = RT->getDecl()) { + if (RD->getName() == "RaytracingPipelineConfig1"){ + Visitor.TraverseDecl(VD); + } + } + } + } + break; + } } -} +} \ No newline at end of file diff --git a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-d3dreflect.hlsl b/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-d3dreflect.hlsl deleted file mode 100644 index 5bd5465deb..0000000000 --- a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-d3dreflect.hlsl +++ /dev/null @@ -1,10 +0,0 @@ -// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -validator-version 1.9 %s | %D3DReflect %s | FileCheck %s - -// CHECK: MinShaderTarget: 0x10069 -RaytracingPipelineConfig1 rpc = { 32, RAYTRACING_PIPELINE_FLAG_SKIP_TRIANGLES | RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; -SubobjectToExportsAssociation sea = { "rpc", "MyRayGenShader" }; - -[shader("raygeneration")] -void MyRayGenShader() { - // The pipeline configuration affects this shader but is not directly accessible. -} diff --git a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl b/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl index a5cbeb9965..44b1e713d9 100644 --- a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl +++ b/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl @@ -1,10 +1,10 @@ -// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -validator-version 1.9 %s | FileCheck %s -// RUsN: %dxilver 1.8 | %dxc -T lib_6_8 -validator-version 1.8 %s | FileCheck -check-prefix=UNDER69 %s -// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -validator-version 1.9 -ast-dump %s | FileCheck -check-prefix=AST %s -// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -validator-version 1.9 -ast-dump-implicit %s | FileCheck -check-prefix=ASTIMPL %s +// RUsN: %dxilver 1.9 | %dxc -T lib_6_9 %s | FileCheck %s +// RUN: %dxilver 1.8 | %dxc -T lib_6_8 %s | FileCheck -check-prefix=UNDER69 %s +// RUsN: %dxilver 1.9 | %dxc -T lib_6_9 -ast-dump %s | FileCheck -check-prefix=AST %s +// RUsN: %dxilver 1.9 | %dxc -T lib_6_9 -ast-dump-implicit %s | FileCheck -check-prefix=ASTIMPL %s -// CHECK: ; RaytracingPipelineConfig1 rpc = { MaxTraceRecursionDepth = 32, Flags = RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; +// CHECK: ; RaytracingPipelineConfig1 rpc = { MaxTraceRecursionDepth = 32, Flags = RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; // AST: TranslationUnitDecl 0x{{.+}} <> // AST-NEXT: VarDecl 0x{{.+}} rpc 'RaytracingPipelineConfig1' static cinit From 8cc21545162ef633224c37f02a14b22fb0bbb477 Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Tue, 25 Mar 2025 13:15:17 -0700 Subject: [PATCH 06/13] some analysis --- tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp | 14 ++++++++------ .../d3dreflect/rayquery-reflection.hlsl | 1 + 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp index da7ae58fd1..6aaceb4948 100644 --- a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp +++ b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp @@ -590,6 +590,7 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { const auto *shaderModel = hlsl::ShaderModel::GetByName(self->getLangOpts().HLSLProfile.c_str()); + DXIL::ShaderKind EntrySK = shaderModel->GetKind(); llvm::SmallVector GlobalsWithInit; GatherGlobalsWithInitializers(self->getASTContext().getTranslationUnitDecl(), @@ -706,7 +707,6 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { } } - DXIL::ShaderKind EntrySK = shaderModel->GetKind(); DXIL::NodeLaunchType NodeLaunchTy = DXIL::NodeLaunchType::Invalid; if (EntrySK == DXIL::ShaderKind::Library) { // For library, check if the exported function is entry with shader @@ -731,23 +731,25 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { for (VarDecl *VD : InitGlobals) Visitor.TraverseDecl(VD); for (FunctionDecl *FD : callGraph.GetVisitedFunctions()) - Visitor.TraverseDecl(FD); - + Visitor.TraverseDecl(FD); + } + + if (EntrySK == DXIL::ShaderKind::Library) { for (VarDecl *VD : GlobalsWithInit) { DXIL::NodeLaunchType NodeLaunchTy = DXIL::NodeLaunchType::Invalid; HLSLCallDiagnoseVisitor Visitor(self, shaderModel, EntrySK, NodeLaunchTy, - VD, DiagnosedCalls, + nullptr, DiagnosedCalls, DeclAvailabilityChecked); if (InitListExpr *ILE = dyn_cast(VD->getInit())) { if (auto RT = ILE->getType()->getAs()) { if (const RecordDecl *RD = RT->getDecl()) { - if (RD->getName() == "RaytracingPipelineConfig1"){ + if (RD->getName() == "RaytracingPipelineConfig1") { Visitor.TraverseDecl(VD); } } } } break; - } + } } } \ No newline at end of file diff --git a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl b/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl index 44b1e713d9..c5ad3249cc 100644 --- a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl +++ b/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl @@ -16,6 +16,7 @@ // ASTIMPL: VarDecl 0x{{.+}} <> implicit referenced RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS 'const unsigned int' static cinit // ASTIMPL-NEXT: IntegerLiteral 0x{{.+}} <> 'const unsigned int' 1024 // ASTIMPL-NEXT: AvailabilityAttr 0x{{.+}} <> Implicit 6.9 0 0 "" + RaytracingPipelineConfig1 rpc = { 32, RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; // UNDER69: Potential misuse From 2d5fd222ddc811e8b0e7e752a94f7b566193ac5c Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Thu, 27 Mar 2025 16:48:48 -0700 Subject: [PATCH 07/13] use new attr --- tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp index 6aaceb4948..97d9d8542e 100644 --- a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp +++ b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp @@ -740,16 +740,13 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { HLSLCallDiagnoseVisitor Visitor(self, shaderModel, EntrySK, NodeLaunchTy, nullptr, DiagnosedCalls, DeclAvailabilityChecked); - if (InitListExpr *ILE = dyn_cast(VD->getInit())) { - if (auto RT = ILE->getType()->getAs()) { - if (const RecordDecl *RD = RT->getDecl()) { - if (RD->getName() == "RaytracingPipelineConfig1") { - Visitor.TraverseDecl(VD); - } - } - } + QualType QT = VD->getType(); + if (const RecordType *RT = QT->getAs()) { + RecordDecl *RD = RT->getDecl(); + if (!RD->hasAttr()) + continue; + Visitor.TraverseDecl(VD); } - break; } } } \ No newline at end of file From 1969f85e15dbce2b530cb51d46f2a2b3d2651adf Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Thu, 27 Mar 2025 17:05:31 -0700 Subject: [PATCH 08/13] check for attr --- tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp index 97d9d8542e..eccd6a0a32 100644 --- a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp +++ b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp @@ -737,9 +737,9 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { if (EntrySK == DXIL::ShaderKind::Library) { for (VarDecl *VD : GlobalsWithInit) { DXIL::NodeLaunchType NodeLaunchTy = DXIL::NodeLaunchType::Invalid; - HLSLCallDiagnoseVisitor Visitor(self, shaderModel, EntrySK, NodeLaunchTy, - nullptr, DiagnosedCalls, - DeclAvailabilityChecked); + HLSLReachableDiagnoseVisitor Visitor( + self, shaderModel, EntrySK, NodeLaunchTy, nullptr, DiagnosedCalls, + DeclAvailabilityChecked, DiagnosedTypeLocs); QualType QT = VD->getType(); if (const RecordType *RT = QT->getAs()) { RecordDecl *RD = RT->getDecl(); From c68f33a26836e063ba2bf27dbe11133bb768ae49 Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Thu, 27 Mar 2025 17:40:07 -0700 Subject: [PATCH 09/13] detect subobjects in globals --- tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp | 11 +++++------ ...reflection.hlsl => raytracingpipelineconfig1.hlsl} | 10 +++------- .../SemaHLSL/raytracingpipelineconfig1-warnings.hlsl | 6 ++++++ 3 files changed, 14 insertions(+), 13 deletions(-) rename tools/clang/test/HLSLFileCheck/d3dreflect/{rayquery-reflection.hlsl => raytracingpipelineconfig1.hlsl} (75%) create mode 100644 tools/clang/test/SemaHLSL/raytracingpipelineconfig1-warnings.hlsl diff --git a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp index eccd6a0a32..d244193b7f 100644 --- a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp +++ b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp @@ -590,7 +590,6 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { const auto *shaderModel = hlsl::ShaderModel::GetByName(self->getLangOpts().HLSLProfile.c_str()); - DXIL::ShaderKind EntrySK = shaderModel->GetKind(); llvm::SmallVector GlobalsWithInit; GatherGlobalsWithInitializers(self->getASTContext().getTranslationUnitDecl(), @@ -706,7 +705,7 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { << PatchConstantFunctionReturnIdx; } } - + DXIL::ShaderKind EntrySK = shaderModel->GetKind(); DXIL::NodeLaunchType NodeLaunchTy = DXIL::NodeLaunchType::Invalid; if (EntrySK == DXIL::ShaderKind::Library) { // For library, check if the exported function is entry with shader @@ -734,12 +733,12 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { Visitor.TraverseDecl(FD); } - if (EntrySK == DXIL::ShaderKind::Library) { + if (shaderModel->GetKind() == DXIL::ShaderKind::Library) { for (VarDecl *VD : GlobalsWithInit) { DXIL::NodeLaunchType NodeLaunchTy = DXIL::NodeLaunchType::Invalid; HLSLReachableDiagnoseVisitor Visitor( - self, shaderModel, EntrySK, NodeLaunchTy, nullptr, DiagnosedCalls, - DeclAvailabilityChecked, DiagnosedTypeLocs); + self, shaderModel, shaderModel->GetKind(), NodeLaunchTy, nullptr, + DiagnosedCalls, DeclAvailabilityChecked, DiagnosedTypeLocs); QualType QT = VD->getType(); if (const RecordType *RT = QT->getAs()) { RecordDecl *RD = RT->getDecl(); @@ -749,4 +748,4 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { } } } -} \ No newline at end of file +} diff --git a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl b/tools/clang/test/HLSLFileCheck/d3dreflect/raytracingpipelineconfig1.hlsl similarity index 75% rename from tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl rename to tools/clang/test/HLSLFileCheck/d3dreflect/raytracingpipelineconfig1.hlsl index c5ad3249cc..44424f5d14 100644 --- a/tools/clang/test/HLSLFileCheck/d3dreflect/rayquery-reflection.hlsl +++ b/tools/clang/test/HLSLFileCheck/d3dreflect/raytracingpipelineconfig1.hlsl @@ -1,7 +1,6 @@ -// RUsN: %dxilver 1.9 | %dxc -T lib_6_9 %s | FileCheck %s -// RUN: %dxilver 1.8 | %dxc -T lib_6_8 %s | FileCheck -check-prefix=UNDER69 %s -// RUsN: %dxilver 1.9 | %dxc -T lib_6_9 -ast-dump %s | FileCheck -check-prefix=AST %s -// RUsN: %dxilver 1.9 | %dxc -T lib_6_9 -ast-dump-implicit %s | FileCheck -check-prefix=ASTIMPL %s +// RUN: %dxilver 1.9 | %dxc -T lib_6_9 %s | FileCheck %s +// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -ast-dump %s | FileCheck -check-prefix=AST %s +// RUN: %dxilver 1.9 | %dxc -T lib_6_9 -ast-dump-implicit %s | FileCheck -check-prefix=ASTIMPL %s // CHECK: ; RaytracingPipelineConfig1 rpc = { MaxTraceRecursionDepth = 32, Flags = RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; @@ -18,6 +17,3 @@ // ASTIMPL-NEXT: AvailabilityAttr 0x{{.+}} <> Implicit 6.9 0 0 "" RaytracingPipelineConfig1 rpc = { 32, RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; - -// UNDER69: Potential misuse - diff --git a/tools/clang/test/SemaHLSL/raytracingpipelineconfig1-warnings.hlsl b/tools/clang/test/SemaHLSL/raytracingpipelineconfig1-warnings.hlsl new file mode 100644 index 0000000000..b466e46031 --- /dev/null +++ b/tools/clang/test/SemaHLSL/raytracingpipelineconfig1-warnings.hlsl @@ -0,0 +1,6 @@ +// RUN: %dxilver 1.8 | %dxc -T lib_6_8 -verify %s + +// expected-warning@+1{{potential misuse of built-in constant 'RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS' in shader model lib_6_8; introduced in shader model 6.9}} +RaytracingPipelineConfig1 rpc = { 32, RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; + + From e38d86940a8d7e05c7b996c5e13570888e656bc3 Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Thu, 27 Mar 2025 18:27:58 -0700 Subject: [PATCH 10/13] remove unrecognized dxilver --- .../clang/test/SemaHLSL/raytracingpipelineconfig1-warnings.hlsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/clang/test/SemaHLSL/raytracingpipelineconfig1-warnings.hlsl b/tools/clang/test/SemaHLSL/raytracingpipelineconfig1-warnings.hlsl index b466e46031..c220f5734d 100644 --- a/tools/clang/test/SemaHLSL/raytracingpipelineconfig1-warnings.hlsl +++ b/tools/clang/test/SemaHLSL/raytracingpipelineconfig1-warnings.hlsl @@ -1,4 +1,4 @@ -// RUN: %dxilver 1.8 | %dxc -T lib_6_8 -verify %s +// RUN: %dxc -T lib_6_8 -verify %s // expected-warning@+1{{potential misuse of built-in constant 'RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS' in shader model lib_6_8; introduced in shader model 6.9}} RaytracingPipelineConfig1 rpc = { 32, RAYTRACING_PIPELINE_FLAG_ALLOW_OPACITY_MICROMAPS }; From 548df7db2a2a03f970a1f2046835cc4d00da07f3 Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Fri, 28 Mar 2025 11:18:46 -0700 Subject: [PATCH 11/13] rework gatherglobalswithinitializers to create separate subobj list --- tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp | 50 +++++++++++---------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp index d244193b7f..ff9f3e4a9f 100644 --- a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp +++ b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp @@ -301,7 +301,8 @@ std::vector GetAllExportedFDecls(clang::Sema *self) { } void GatherGlobalsWithInitializers( - DeclContext *DC, llvm::SmallVectorImpl &GlobalsWithInit) { + DeclContext *DC, llvm::SmallVectorImpl &GlobalsWithInit, + llvm::SmallVectorImpl &SubObjects) { for (auto *D : DC->decls()) { // Skip built-ins and function decls. if (D->isImplicit() || isa(D)) @@ -310,11 +311,19 @@ void GatherGlobalsWithInitializers( // Add if user-defined static or groupshared global with initializer. if (VD->hasInit() && VD->hasGlobalStorage() && (VD->getStorageClass() == SC_Static || - VD->hasAttr())) - GlobalsWithInit.push_back(VD); + VD->hasAttr())) { + // Place subobjects in a separate collection. + QualType QT = VD->getType(); + if (const RecordType *RT = QT->getAs()) { + RecordDecl *RD = RT->getDecl(); + if (RD->hasAttr()) + SubObjects.push_back(VD); + } else + GlobalsWithInit.push_back(VD); + } } else if (auto *DC = dyn_cast(D)) { // Recurse into DeclContexts like namespace, cbuffer, class/struct, etc. - GatherGlobalsWithInitializers(DC, GlobalsWithInit); + GatherGlobalsWithInitializers(DC, GlobalsWithInit, SubObjects); } } } @@ -592,14 +601,25 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { hlsl::ShaderModel::GetByName(self->getLangOpts().HLSLProfile.c_str()); llvm::SmallVector GlobalsWithInit; - GatherGlobalsWithInitializers(self->getASTContext().getTranslationUnitDecl(), - GlobalsWithInit); - + llvm::SmallVector SubObjects; std::set DiagnosedRecursiveDecls; llvm::SmallPtrSet DiagnosedCalls; llvm::SmallPtrSet DeclAvailabilityChecked; llvm::SmallSet DiagnosedTypeLocs; + GatherGlobalsWithInitializers(self->getASTContext().getTranslationUnitDecl(), + GlobalsWithInit, SubObjects); + + if (shaderModel->GetKind() == DXIL::ShaderKind::Library) { + for (VarDecl *VD : SubObjects) { + DXIL::NodeLaunchType NodeLaunchTy = DXIL::NodeLaunchType::Invalid; + HLSLReachableDiagnoseVisitor Visitor( + self, shaderModel, shaderModel->GetKind(), NodeLaunchTy, nullptr, + DiagnosedCalls, DeclAvailabilityChecked, DiagnosedTypeLocs); + Visitor.TraverseDecl(VD); + } + } + // for each FDecl, check for recursion for (FunctionDecl *FDecl : FDeclsToCheck) { CallGraphWithRecurseGuard callGraph; @@ -732,20 +752,4 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { for (FunctionDecl *FD : callGraph.GetVisitedFunctions()) Visitor.TraverseDecl(FD); } - - if (shaderModel->GetKind() == DXIL::ShaderKind::Library) { - for (VarDecl *VD : GlobalsWithInit) { - DXIL::NodeLaunchType NodeLaunchTy = DXIL::NodeLaunchType::Invalid; - HLSLReachableDiagnoseVisitor Visitor( - self, shaderModel, shaderModel->GetKind(), NodeLaunchTy, nullptr, - DiagnosedCalls, DeclAvailabilityChecked, DiagnosedTypeLocs); - QualType QT = VD->getType(); - if (const RecordType *RT = QT->getAs()) { - RecordDecl *RD = RT->getDecl(); - if (!RD->hasAttr()) - continue; - Visitor.TraverseDecl(VD); - } - } - } } From 8f4df9c73b0e195ecc3ca066834aff78c2867709 Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Fri, 28 Mar 2025 11:58:56 -0700 Subject: [PATCH 12/13] update logic, fix loop --- tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp index ff9f3e4a9f..b0e356731f 100644 --- a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp +++ b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp @@ -313,13 +313,13 @@ void GatherGlobalsWithInitializers( (VD->getStorageClass() == SC_Static || VD->hasAttr())) { // Place subobjects in a separate collection. - QualType QT = VD->getType(); - if (const RecordType *RT = QT->getAs()) { - RecordDecl *RD = RT->getDecl(); - if (RD->hasAttr()) + if (const RecordType *RT = VD->getType()->getAs()) { + if (RT->getDecl()->hasAttr()) { SubObjects.push_back(VD); - } else - GlobalsWithInit.push_back(VD); + continue; + } + } + GlobalsWithInit.push_back(VD); } } else if (auto *DC = dyn_cast(D)) { // Recurse into DeclContexts like namespace, cbuffer, class/struct, etc. @@ -611,11 +611,11 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { GlobalsWithInit, SubObjects); if (shaderModel->GetKind() == DXIL::ShaderKind::Library) { + DXIL::NodeLaunchType NodeLaunchTy = DXIL::NodeLaunchType::Invalid; + HLSLReachableDiagnoseVisitor Visitor( + self, shaderModel, shaderModel->GetKind(), NodeLaunchTy, nullptr, + DiagnosedCalls, DeclAvailabilityChecked, DiagnosedTypeLocs); for (VarDecl *VD : SubObjects) { - DXIL::NodeLaunchType NodeLaunchTy = DXIL::NodeLaunchType::Invalid; - HLSLReachableDiagnoseVisitor Visitor( - self, shaderModel, shaderModel->GetKind(), NodeLaunchTy, nullptr, - DiagnosedCalls, DeclAvailabilityChecked, DiagnosedTypeLocs); Visitor.TraverseDecl(VD); } } From 64f00ba9b3ffadd5b2213f1869b31111b267b458 Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Fri, 28 Mar 2025 14:24:26 -0700 Subject: [PATCH 13/13] formatting --- tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp index b0e356731f..c562ee8d52 100644 --- a/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp +++ b/tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp @@ -615,9 +615,8 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) { HLSLReachableDiagnoseVisitor Visitor( self, shaderModel, shaderModel->GetKind(), NodeLaunchTy, nullptr, DiagnosedCalls, DeclAvailabilityChecked, DiagnosedTypeLocs); - for (VarDecl *VD : SubObjects) { + for (VarDecl *VD : SubObjects) Visitor.TraverseDecl(VD); - } } // for each FDecl, check for recursion