[clang] [llvm] [HLSL] Print struct body definition when within the context of defining a target extension type (PR #115971)
Joshua Batista via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 12 16:47:44 PST 2024
https://github.com/bob80905 created https://github.com/llvm/llvm-project/pull/115971
This PR changes the way that final DXIL is printed by adjusting the way the type definition section of the DXIL output is printed.
Specifically, when defining a target extension type, if the RHS involves a struct type, then rather than printing the entire struct type definition, only the struct body is printed.
This prevents repetitive phrases like "struct = type {...}" from being repeated over and over in the RHS.
Additionally, it should allow opt to not crash when parsing the DXIL output.
Fixes [#114131](https://github.com/llvm/llvm-project/issues/114131)
>From 7413ceb21a6e0ac9212ef6317763ee0eff559612 Mon Sep 17 00:00:00 2001
From: Joshua Batista <jbatista at microsoft.com>
Date: Tue, 12 Nov 2024 16:44:00 -0800
Subject: [PATCH] print struct body within target ext ty context
---
.../test/AST/HLSL/StructuredBuffer-AST-2.hlsl | 30 +++++++++++++++++++
llvm/lib/IR/AsmWriter.cpp | 10 +++++--
2 files changed, 38 insertions(+), 2 deletions(-)
create mode 100644 clang/test/AST/HLSL/StructuredBuffer-AST-2.hlsl
diff --git a/clang/test/AST/HLSL/StructuredBuffer-AST-2.hlsl b/clang/test/AST/HLSL/StructuredBuffer-AST-2.hlsl
new file mode 100644
index 00000000000000..73073b3f6f2839
--- /dev/null
+++ b/clang/test/AST/HLSL/StructuredBuffer-AST-2.hlsl
@@ -0,0 +1,30 @@
+// RUN: %clang_dxc -T cs_6_6 %s | FileCheck %s
+
+// The purpose of this test is to ensure that the AST writer
+// only emits struct bodies when within the context of a
+// larger object that is being outputted on the RHS.
+
+
+// note that "{ <4 x float> }" in the check below is a struct type, but only the
+// body is emitted on the RHS because we are already in the context of a
+// target extension type definition (class.hlsl::StructuredBuffer)
+// CHECK: %"class.hlsl::StructuredBuffer" = type { target("dx.RawBuffer", { <4 x float> }, 0, 0), %struct.mystruct }
+// CHECK: %struct.mystruct = type { <4 x float> }
+// CHECK: %dx.types.Handle = type { ptr }
+// CHECK: %dx.types.ResBind = type { i32, i32, i32, i8 }
+// CHECK: %dx.types.ResourceProperties = type { i32, i32 }
+
+struct mystruct
+{
+ float4 Color;
+};
+
+StructuredBuffer<mystruct> my_buffer : register(t2, space4);
+
+export float4 test()
+{
+ return my_buffer[0].Color;
+}
+
+[numthreads(1,1,1)]
+void main() {}
diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp
index 3c1cb76622bbb7..d2705ff4b30fb8 100644
--- a/llvm/lib/IR/AsmWriter.cpp
+++ b/llvm/lib/IR/AsmWriter.cpp
@@ -649,8 +649,14 @@ void TypePrinting::print(Type *Ty, raw_ostream &OS) {
OS << "target(\"";
printEscapedString(Ty->getTargetExtName(), OS);
OS << "\"";
- for (Type *Inner : TETy->type_params())
- OS << ", " << *Inner;
+ for (Type *Inner : TETy->type_params()) {
+ OS << ", ";
+ if (Inner->isStructTy()) {
+ StructType *STy = cast<StructType>(Inner);
+ printStructBody(STy, OS);
+ } else
+ OS << *Inner;
+ }
for (unsigned IntParam : TETy->int_params())
OS << ", " << IntParam;
OS << ")";
More information about the cfe-commits
mailing list