Skip to content

Commit 2b8db52

Browse files
author
joaosaffran
committed
Revert "[HLSL] Adding support for Root Constants in LLVM Metadata (llvm#135085)"
This reverts commit 23186d1.
1 parent 23186d1 commit 2b8db52

File tree

3 files changed

+84
-61
lines changed

3 files changed

+84
-61
lines changed

llvm/lib/Target/DirectX/DXILRootSignature.cpp

Lines changed: 68 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,21 @@ static bool reportError(LLVMContext *Ctx, Twine Message,
4040
return true;
4141
}
4242

43-
static bool reportValueError(LLVMContext *Ctx, Twine ParamName,
44-
uint32_t Value) {
43+
static bool reportValueError(LLVMContext *Ctx, Twine ParamName, uint32_t Value,
44+
DiagnosticSeverity Severity = DS_Error) {
4545
Ctx->diagnose(DiagnosticInfoGeneric(
46-
"Invalid value for " + ParamName + ": " + Twine(Value), DS_Error));
46+
"Invalid value for " + ParamName + ": " + Twine(Value), Severity));
4747
return true;
4848
}
4949

50-
static std::optional<uint32_t> extractMdIntValue(MDNode *Node,
51-
unsigned int OpId) {
52-
if (auto *CI =
53-
mdconst::dyn_extract<ConstantInt>(Node->getOperand(OpId).get()))
54-
return CI->getZExtValue();
55-
return std::nullopt;
50+
static bool extractMdIntValue(uint32_t &Value, MDNode *Node,
51+
unsigned int OpId) {
52+
auto *CI = mdconst::dyn_extract<ConstantInt>(Node->getOperand(OpId).get());
53+
if (CI == nullptr)
54+
return true;
55+
56+
Value = CI->getZExtValue();
57+
return false;
5658
}
5759

5860
static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
@@ -61,9 +63,7 @@ static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
6163
if (RootFlagNode->getNumOperands() != 2)
6264
return reportError(Ctx, "Invalid format for RootFlag Element");
6365

64-
if (std::optional<uint32_t> Val = extractMdIntValue(RootFlagNode, 1))
65-
RSD.Flags = *Val;
66-
else
66+
if (extractMdIntValue(RSD.Flags, RootFlagNode, 1))
6767
return reportError(Ctx, "Invalid value for RootFlag");
6868

6969
return false;
@@ -79,24 +79,22 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
7979
NewParameter.Header.ParameterType =
8080
llvm::to_underlying(dxbc::RootParameterType::Constants32Bit);
8181

82-
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 1))
83-
NewParameter.Header.ShaderVisibility = *Val;
84-
else
82+
uint32_t SV;
83+
if (extractMdIntValue(SV, RootConstantNode, 1))
8584
return reportError(Ctx, "Invalid value for ShaderVisibility");
8685

87-
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 2))
88-
NewParameter.Constants.ShaderRegister = *Val;
89-
else
86+
NewParameter.Header.ShaderVisibility = SV;
87+
88+
if (extractMdIntValue(NewParameter.Constants.ShaderRegister, RootConstantNode,
89+
2))
9090
return reportError(Ctx, "Invalid value for ShaderRegister");
9191

92-
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 3))
93-
NewParameter.Constants.RegisterSpace = *Val;
94-
else
92+
if (extractMdIntValue(NewParameter.Constants.RegisterSpace, RootConstantNode,
93+
3))
9594
return reportError(Ctx, "Invalid value for RegisterSpace");
9695

97-
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 4))
98-
NewParameter.Constants.Num32BitValues = *Val;
99-
else
96+
if (extractMdIntValue(NewParameter.Constants.Num32BitValues, RootConstantNode,
97+
4))
10098
return reportError(Ctx, "Invalid value for Num32BitValues");
10199

102100
RSD.Parameters.push_back(NewParameter);
@@ -150,6 +148,32 @@ static bool parse(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
150148

151149
static bool verifyRootFlag(uint32_t Flags) { return (Flags & ~0xfff) == 0; }
152150

151+
static bool verifyShaderVisibility(uint32_t Flags) {
152+
switch (Flags) {
153+
154+
case llvm::to_underlying(dxbc::ShaderVisibility::All):
155+
case llvm::to_underlying(dxbc::ShaderVisibility::Vertex):
156+
case llvm::to_underlying(dxbc::ShaderVisibility::Hull):
157+
case llvm::to_underlying(dxbc::ShaderVisibility::Domain):
158+
case llvm::to_underlying(dxbc::ShaderVisibility::Geometry):
159+
case llvm::to_underlying(dxbc::ShaderVisibility::Pixel):
160+
case llvm::to_underlying(dxbc::ShaderVisibility::Amplification):
161+
case llvm::to_underlying(dxbc::ShaderVisibility::Mesh):
162+
return true;
163+
}
164+
165+
return false;
166+
}
167+
168+
static bool verifyParameterType(uint32_t Type) {
169+
switch (Type) {
170+
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
171+
return true;
172+
}
173+
174+
return false;
175+
}
176+
153177
static bool verifyVersion(uint32_t Version) {
154178
return (Version == 1 || Version == 2);
155179
}
@@ -164,12 +188,12 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
164188
return reportValueError(Ctx, "RootFlags", RSD.Flags);
165189
}
166190

167-
for (const mcdxbc::RootParameter &P : RSD.Parameters) {
168-
if (!dxbc::isValidShaderVisibility(P.Header.ShaderVisibility))
191+
for (const auto &P : RSD.Parameters) {
192+
if (!verifyShaderVisibility(P.Header.ShaderVisibility))
169193
return reportValueError(Ctx, "ShaderVisibility",
170-
P.Header.ShaderVisibility);
194+
(uint32_t)P.Header.ShaderVisibility);
171195

172-
assert(dxbc::isValidParameterType(P.Header.ParameterType) &&
196+
assert(verifyParameterType(P.Header.ParameterType) &&
173197
"Invalid value for ParameterType");
174198
}
175199

@@ -241,10 +265,6 @@ analyzeModule(Module &M) {
241265
}
242266

243267
mcdxbc::RootSignatureDesc RSD;
244-
// Clang emits the root signature data in dxcontainer following a specific
245-
// sequence. First the header, then the root parameters. So the header
246-
// offset will always equal to the header size.
247-
RSD.RootParameterOffset = sizeof(dxbc::RootSignatureHeader);
248268

249269
if (parse(Ctx, RSD, RootElementListNode) || validate(Ctx, RSD)) {
250270
return RSDMap;
@@ -271,6 +291,7 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
271291
SmallDenseMap<const Function *, mcdxbc::RootSignatureDesc> &RSDMap =
272292
AM.getResult<RootSignatureAnalysis>(M);
273293

294+
const size_t RSHSize = sizeof(dxbc::RootSignatureHeader);
274295
OS << "Root Signature Definitions"
275296
<< "\n";
276297
uint8_t Space = 0;
@@ -285,30 +306,32 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
285306
Space++;
286307
OS << indent(Space) << "Flags: " << format_hex(RS.Flags, 8) << "\n";
287308
OS << indent(Space) << "Version: " << RS.Version << "\n";
288-
OS << indent(Space) << "RootParametersOffset: " << RS.RootParameterOffset
289-
<< "\n";
290309
OS << indent(Space) << "NumParameters: " << RS.Parameters.size() << "\n";
310+
OS << indent(Space) << "RootParametersOffset: " << RSHSize << "\n";
311+
OS << indent(Space) << "NumStaticSamplers: " << 0 << "\n";
312+
OS << indent(Space)
313+
<< "StaticSamplersOffset: " << RSHSize + RS.Parameters.size_in_bytes()
314+
<< "\n";
315+
291316
Space++;
292317
for (auto const &P : RS.Parameters) {
293-
OS << indent(Space) << "- Parameter Type: " << P.Header.ParameterType
318+
OS << indent(Space)
319+
<< "Parameter Type: " << (uint32_t)P.Header.ParameterType << "\n";
320+
OS << indent(Space)
321+
<< "Shader Visibility: " << (uint32_t)P.Header.ShaderVisibility
294322
<< "\n";
295-
OS << indent(Space + 2)
296-
<< "Shader Visibility: " << P.Header.ShaderVisibility << "\n";
297323
switch (P.Header.ParameterType) {
298324
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
299-
OS << indent(Space + 2)
300-
<< "Register Space: " << P.Constants.RegisterSpace << "\n";
301-
OS << indent(Space + 2)
302-
<< "Shader Register: " << P.Constants.ShaderRegister << "\n";
303-
OS << indent(Space + 2)
325+
OS << indent(Space) << "Register Space: " << P.Constants.RegisterSpace
326+
<< "\n";
327+
OS << indent(Space) << "Shader Register: " << P.Constants.ShaderRegister
328+
<< "\n";
329+
OS << indent(Space)
304330
<< "Num 32 Bit Values: " << P.Constants.Num32BitValues << "\n";
305331
break;
306332
}
307333
}
308334
Space--;
309-
OS << indent(Space) << "NumStaticSamplers: " << 0 << "\n";
310-
OS << indent(Space) << "StaticSamplersOffset: " << RS.StaticSamplersOffset
311-
<< "\n";
312335

313336
Space--;
314337
// end root signature header

llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
2626
; CHECK-LABEL: Definition for 'main':
2727
; CHECK-NEXT: Flags: 0x000001
2828
; CHECK-NEXT: Version: 2
29-
; CHECK-NEXT: RootParametersOffset: 24
3029
; CHECK-NEXT: NumParameters: 0
30+
; CHECK-NEXT: RootParametersOffset: 24
3131
; CHECK-NEXT: NumStaticSamplers: 0
32-
; CHECK-NEXT: StaticSamplersOffset: 0
32+
; CHECK-NEXT: StaticSamplersOffset: 24
3333

3434
; CHECK-LABEL: Definition for 'anotherMain':
3535
; CHECK-NEXT: Flags: 0x000002
3636
; CHECK-NEXT: Version: 2
37-
; CHECK-NEXT: RootParametersOffset: 24
3837
; CHECK-NEXT: NumParameters: 0
38+
; CHECK-NEXT: RootParametersOffset: 24
3939
; CHECK-NEXT: NumStaticSamplers: 0
40-
; CHECK-NEXT: StaticSamplersOffset: 0
40+
; CHECK-NEXT: StaticSamplersOffset: 24

llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
1616
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
1717
!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
1818

19-
;CHECK-LABEL: Definition for 'main':
20-
;CHECK-NEXT: Flags: 0x000001
21-
;CHECK-NEXT: Version: 2
22-
;CHECK-NEXT: RootParametersOffset: 24
23-
;CHECK-NEXT: NumParameters: 1
24-
;CHECK-NEXT: - Parameter Type: 1
25-
;CHECK-NEXT: Shader Visibility: 0
26-
;CHECK-NEXT: Register Space: 2
27-
;CHECK-NEXT: Shader Register: 1
28-
;CHECK-NEXT: Num 32 Bit Values: 3
29-
;CHECK-NEXT: NumStaticSamplers: 0
30-
;CHECK-NEXT: StaticSamplersOffset: 0
19+
; CHECK-LABEL: Definition for 'main':
20+
; CHECK-NEXT: Flags: 0x000001
21+
; CHECK-NEXT: Version: 2
22+
; CHECK-NEXT: NumParameters: 1
23+
; CHECK-NEXT: RootParametersOffset: 24
24+
; CHECK-NEXT: NumStaticSamplers: 0
25+
; CHECK-NEXT: StaticSamplersOffset: 48
26+
; CHECK-NEXT: Parameter Type: 1
27+
; CHECK-NEXT: Shader Visibility: 0
28+
; CHECK-NEXT: Register Space: 2
29+
; CHECK-NEXT: Shader Register: 1
30+
; CHECK-NEXT: Num 32 Bit Values: 3

0 commit comments

Comments
 (0)