Skip to content

[HLSL][DirectX] Add the Qdx-rootsignature-strip driver option #152196

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions clang/include/clang/Basic/CodeGenOptions.def
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,9 @@ CODEGENOPT(StaticClosure, 1, 0, Benign)
/// Assume that UAVs/SRVs may alias
CODEGENOPT(ResMayAlias, 1, 0, Benign)

/// Omit the root signature from produced DXContainer
CODEGENOPT(HLSLRootSigStrip, 1, 0, Benign)

/// Controls how unwind v2 (epilog) information should be generated for x64
/// Windows.
ENUM_CODEGENOPT(WinX64EHUnwindV2, WinX64EHUnwindV2Mode,
Expand Down
10 changes: 10 additions & 0 deletions clang/include/clang/Driver/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -9354,6 +9354,16 @@ def res_may_alias : Option<["/", "-"], "res-may-alias", KIND_FLAG>,
Visibility<[DXCOption, ClangOption, CC1Option]>,
HelpText<"Assume that UAVs/SRVs may alias">,
MarshallingInfoFlag<CodeGenOpts<"ResMayAlias">>;
def Qdx_rootsignature_strip : Option<["-"], "Qdx-rootsignature-strip", KIND_FLAG>,
Group<dxc_Group>,
Visibility<[ClangOption, CC1Option]>,
HelpText<"Omit the root signature from produced DXContainer">,
MarshallingInfoFlag<CodeGenOpts<"HLSLRootSigStrip">>;
def dxc_Qstrip_rootsignature :
Option<["/", "-"], "Qstrip-rootsignature", KIND_FLAG>,
Alias<Qdx_rootsignature_strip>,
Group<dxc_Group>,
Visibility<[DXCOption]>;
def target_profile : DXCJoinedOrSeparate<"T">, MetaVarName<"<profile>">,
HelpText<"Set target profile">,
Values<"ps_6_0, ps_6_1, ps_6_2, ps_6_3, ps_6_4, ps_6_5, ps_6_6, ps_6_7,"
Expand Down
15 changes: 12 additions & 3 deletions clang/lib/CodeGen/CGHLSLRuntime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ void addDxilValVersion(StringRef ValVersionStr, llvm::Module &M) {

void addRootSignature(llvm::dxbc::RootSignatureVersion RootSigVer,
ArrayRef<llvm::hlsl::rootsig::RootElement> Elements,
llvm::Function *Fn, llvm::Module &M) {
llvm::Function *Fn, llvm::Module &M,
bool StripRootSignature) {
auto &Ctx = M.getContext();

llvm::hlsl::rootsig::MetadataBuilder RSBuilder(Ctx, Elements);
Expand All @@ -80,7 +81,14 @@ void addRootSignature(llvm::dxbc::RootSignatureVersion RootSigVer,
MDNode::get(Ctx, {ValueAsMetadata::get(Fn), RootSignature, Version});

StringRef RootSignatureValKey = "dx.rootsignatures";
auto *RootSignatureValMD = M.getOrInsertNamedMetadata(RootSignatureValKey);
NamedMDNode *RootSignatureValMD = M.getNamedMetadata(RootSignatureValKey);
if (!RootSignatureValMD) {
IRBuilder<> Builder(Ctx);
RootSignatureValMD = M.getOrInsertNamedMetadata(RootSignatureValKey);
MDNode *InfoMD = MDNode::get(
Ctx, {ConstantAsMetadata::get(Builder.getInt1(StripRootSignature))});
RootSignatureValMD->addOperand(InfoMD);
}
RootSignatureValMD->addOperand(MDVals);
}

Expand Down Expand Up @@ -479,11 +487,12 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD,
B.CreateRetVoid();

// Add and identify root signature to function, if applicable
auto &CodeGenOpts = CGM.getCodeGenOpts();
for (const Attr *Attr : FD->getAttrs()) {
if (const auto *RSAttr = dyn_cast<RootSignatureAttr>(Attr)) {
auto *RSDecl = RSAttr->getSignatureDecl();
addRootSignature(RSDecl->getVersion(), RSDecl->getRootElements(), EntryFn,
M);
M, CodeGenOpts.HLSLRootSigStrip);
}
}
}
Expand Down
24 changes: 12 additions & 12 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3790,18 +3790,18 @@ static void RenderOpenCLOptions(const ArgList &Args, ArgStringList &CmdArgs,

static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs,
types::ID InputType) {
const unsigned ForwardedArguments[] = {
options::OPT_dxil_validator_version,
options::OPT_res_may_alias,
options::OPT_D,
options::OPT_I,
options::OPT_O,
options::OPT_emit_llvm,
options::OPT_emit_obj,
options::OPT_disable_llvm_passes,
options::OPT_fnative_half_type,
options::OPT_hlsl_entrypoint,
options::OPT_fdx_rootsignature_version};
const unsigned ForwardedArguments[] = {options::OPT_dxil_validator_version,
options::OPT_res_may_alias,
options::OPT_D,
options::OPT_I,
options::OPT_O,
options::OPT_emit_llvm,
options::OPT_emit_obj,
options::OPT_disable_llvm_passes,
options::OPT_fnative_half_type,
options::OPT_hlsl_entrypoint,
options::OPT_fdx_rootsignature_version,
options::OPT_Qdx_rootsignature_strip};
if (!types::isHLSL(InputType))
return;
for (const auto &Arg : ForwardedArguments)
Expand Down
6 changes: 6 additions & 0 deletions clang/lib/Driver/ToolChains/HLSL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,12 @@ HLSLToolChain::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
A->claim();
continue;
}
if (A->getOption().getID() == options::OPT_dxc_Qstrip_rootsignature) {
DAL->AddFlagArg(nullptr,
Opts.getOption(options::OPT_Qdx_rootsignature_strip));
A->claim();
continue;
}
if (A->getOption().getID() == options::OPT__SLASH_O) {
StringRef OStr = A->getValue();
if (OStr == "d") {
Expand Down
4 changes: 3 additions & 1 deletion clang/test/CodeGenHLSL/RootSignature.hlsl
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -o - %s | FileCheck %s

// CHECK: !dx.rootsignatures = !{![[#EMPTY_ENTRY:]], ![[#DT_ENTRY:]],
// CHECK: !dx.rootsignatures = !{![[#LOWER_INFO:]], ![[#EMPTY_ENTRY:]], ![[#DT_ENTRY:]],
// CHECK-SAME: ![[#RF_ENTRY:]], ![[#RC_ENTRY:]], ![[#RD_ENTRY:]], ![[#SS_ENTRY:]]}

// CHECK: ![[#LOWER_INFO]] = !{i1 false}

// CHECK: ![[#EMPTY_ENTRY]] = !{ptr @EmptyEntry, ![[#EMPTY:]], i32 2}
// CHECK: ![[#EMPTY]] = !{}

Expand Down
15 changes: 15 additions & 0 deletions clang/test/CodeGenHLSL/dx-rootsignature-strip.hlsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// RUN: %clang_cc1 -Qdx-rootsignature-strip -triple dxil-pc-shadermodel6.3-compute -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,FLAG
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-compute -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,NOFLAG

// CHECK: !dx.rootsignatures = !{![[#LOWER_INFO:]], ![[#EMPTY_ENTRY:]]}
// FLAG: ![[#LOWER_INFO]] = !{i1 true}
// NOFLAG: ![[#LOWER_INFO]] = !{i1 false}

// Ensure root signature metadata is still generated in either case
// CHECK: ![[#EMPTY_ENTRY]] = !{ptr @EmptyEntry, ![[#EMPTY:]], i32 2}
// CHECK: ![[#EMPTY]] = !{}

[shader("compute"), RootSignature("")]
[numthreads(1,1,1)]
void EmptyEntry() {}

17 changes: 17 additions & 0 deletions clang/test/Driver/dxc_Qstrip-rootsignature.hlsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// RUN: %clang_dxc -Qstrip-rootsignature -T cs_6_3 -HV 202x -Vd -Xclang -emit-llvm %s | FileCheck %s --check-prefixes=CHECK,FLAG
// RUN: %clang_dxc -T cs_6_3 -HV 202x -Vd -Xclang -emit-llvm %s | FileCheck %s --check-prefixes=CHECK,NOFLAG

// Test to demonstrate that we can specify when to strip the root signature
// in its metadata

// CHECK: !dx.rootsignatures = !{![[#LOWER_INFO:]], ![[#EMPTY_ENTRY:]]}
// FLAG: ![[#LOWER_INFO]] = !{i1 true}
// NOFLAG: ![[#LOWER_INFO]] = !{i1 false}

// Ensure root signature metadata is still generated in either case
// CHECK: ![[#EMPTY_ENTRY]] = !{ptr @EmptyEntry, ![[#EMPTY:]], i32 2}
// CHECK: ![[#EMPTY]] = !{}

[shader("compute"), RootSignature("")]
[numthreads(1,1,1)]
void EmptyEntry() {}
1 change: 1 addition & 0 deletions llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ struct ModuleMetadataInfo {
Triple::EnvironmentType ShaderProfile{Triple::UnknownEnvironment};
VersionTuple ValidatorVersion{};
SmallVector<EntryProperties> EntryPropertyVec{};
bool StripRootSignature{true};
void print(raw_ostream &OS) const;
};

Expand Down
13 changes: 13 additions & 0 deletions llvm/lib/Analysis/DXILMetadataAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,18 @@ static ModuleMetadataInfo collectMetadataInfo(Module &M) {
}
MMDAI.EntryPropertyVec.push_back(EFP);
}
NamedMDNode *RootSignaturesNode = M.getNamedMetadata("dx.rootsignatures");
if (RootSignaturesNode) {
// Only insert any extra root signature lowering info on insert
MDNode *InfoMD = RootSignaturesNode->getOperand(0);
[[maybe_unused]] bool HasStripMD =
mdconst::hasa<ConstantInt>(InfoMD->getOperand(0));
assert(HasStripMD && "Failed to parse Strip Root Signature component");
auto *StripRootSignature =
mdconst::dyn_extract<ConstantInt>(InfoMD->getOperand(0));
if (StripRootSignature)
MMDAI.StripRootSignature = StripRootSignature->getZExtValue();
}
return MMDAI;
}

Expand All @@ -84,6 +96,7 @@ void ModuleMetadataInfo::print(raw_ostream &OS) const {
OS << " NumThreads: " << EP.NumThreadsX << "," << EP.NumThreadsY << ","
<< EP.NumThreadsZ << "\n";
}
OS << "Strip Root Signature: " << StripRootSignature << "\n";
}

//===----------------------------------------------------------------------===//
Expand Down
4 changes: 4 additions & 0 deletions llvm/lib/Target/DirectX/DXContainerGlobals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,10 @@ void DXContainerGlobals::addRootSignature(Module &M,
dxil::ModuleMetadataInfo &MMI =
getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();

// Compiler flag denotes to not output the root signature part (RTS0)
if (MMI.StripRootSignature)
return;

// Root Signature in Library don't compile to DXContainer.
if (MMI.ShaderProfile == llvm::Triple::Library)
return;
Expand Down
11 changes: 10 additions & 1 deletion llvm/lib/Target/DirectX/DXILRootSignature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -527,8 +527,17 @@ analyzeModule(Module &M) {
NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
if (RootSignatureNode == nullptr)
return RSDMap;
if (RootSignatureNode->getNumOperands() == 0) {
reportError(Ctx, "Invalid Root Signature metadata - expected lowering "
"info and then Root Signature operands.");
return RSDMap;
}

// Ignore the lowering info metadata
auto Begin = std::next(RootSignatureNode->op_begin());
auto RSNodes = iterator_range(Begin, RootSignatureNode->op_end());

for (const auto &RSDefNode : RootSignatureNode->operands()) {
for (const auto &RSDefNode : RSNodes) {
if (RSDefNode->getNumOperands() != 3) {
reportError(Ctx, "Invalid Root Signature metadata - expected function, "
"signature, and version.");
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/DXILMetadataAnalysis/dxilVer-1.0.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel6.0-vertex"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : vertex
; CHECK-NEXT: NumThreads: 0,0,0
; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:

define void @entry() #0 {
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/DXILMetadataAnalysis/dxilVer-1.8.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel6.8-compute"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : compute
; CHECK-NEXT: NumThreads: 1,2,1
; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:

define void @entry() #0 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ target triple = "dxil-pc-shadermodel6.8-library"
; CHECK-NEXT: entry_cs
; CHECK-NEXT: Function Shader Stage : compute
; CHECK-NEXT: NumThreads: 1,2,1
; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:

define void @entry_as() #0 {
Expand Down
24 changes: 24 additions & 0 deletions llvm/test/Analysis/DXILMetadataAnalysis/keep-rootsignature.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
; RUN: opt -S -passes="print<dxil-metadata>" -disable-output %s 2>&1 | FileCheck %s
target triple = "dxil-pc-shadermodel6.0-compute"

; CHECK: Shader Model Version : 6.0
; CHECK-NEXT: DXIL Version : 1.0
; CHECK-NEXT: Shader Stage : compute
; CHECK-NEXT: Validator Version : 0
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : compute
; CHECK-NEXT: NumThreads: 1,1,1
; CHECK-NEXT: Strip Root Signature: 0
; CHECK-EMPTY:

define void @entry() #0 {
entry:
ret void
}

attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }

!dx.rootsignatures = !{!0, !2} ; list of function/root signature pairs
!0 = !{i1 false} ; don't strip root signature
!2 = !{ ptr @entry, !3, i32 2 } ; function, root signature, version
!3 = !{} ; empty root signature
1 change: 1 addition & 0 deletions llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-as.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel6-amplification"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : amplification
; CHECK-NEXT: NumThreads: 0,0,0
; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:

define void @entry() #0 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@ attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : compute
; CHECK-NEXT: NumThreads: 1,2,1
; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:
1 change: 1 addition & 0 deletions llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-cs.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ target triple = "dxil-pc-shadermodel6.6-compute"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : compute
; CHECK-NEXT: NumThreads: 1,2,1
; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:

define void @entry() #0 {
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-gs.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel6.6-geometry"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : geometry
; CHECK-NEXT: NumThreads: 0,0,0
; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:

define void @entry() #0 {
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-hs.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel6.6-hull"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : hull
; CHECK-NEXT: NumThreads: 0,0,0
; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:

define void @entry() #0 {
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-ms.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel6.6-mesh"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : mesh
; CHECK-NEXT: NumThreads: 0,0,0
; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:

define void @entry() #0 {
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-ps.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel5.0-pixel"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : pixel
; CHECK-NEXT: NumThreads: 0,0,0
; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:

define void @entry() #0 {
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-vs.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel-vertex"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : vertex
; CHECK-NEXT: NumThreads: 0,0,0
; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:

define void @entry() #0 {
Expand Down
24 changes: 24 additions & 0 deletions llvm/test/Analysis/DXILMetadataAnalysis/strip-rootsignature.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
; RUN: opt -S -passes="print<dxil-metadata>" -disable-output %s 2>&1 | FileCheck %s
target triple = "dxil-pc-shadermodel6.0-compute"

; CHECK: Shader Model Version : 6.0
; CHECK-NEXT: DXIL Version : 1.0
; CHECK-NEXT: Shader Stage : compute
; CHECK-NEXT: Validator Version : 0
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : compute
; CHECK-NEXT: NumThreads: 1,1,1
; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:

define void @entry() #0 {
entry:
ret void
}

attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }

!dx.rootsignatures = !{!0, !2} ; list of function/root signature pairs
!0 = !{i1 true} ; strip root signature
!2 = !{ ptr @entry, !3, i32 2 } ; function, root signature, version
!3 = !{} ; empty root signature
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ entry:
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }


!dx.rootsignatures = !{!2} ; list of function/root signature pairs
!dx.rootsignatures = !{!0, !2} ; list of function/root signature pairs
!0 = !{i1 0} ; strip root signature
!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"DescriptorTable", i32 0, !6, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20 }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ entry:
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }


!dx.rootsignatures = !{!2} ; list of function/root signature pairs
!dx.rootsignatures = !{!0, !2} ; list of function/root signature pairs
!0 = !{i1 0} ; strip root signature
!2 = !{ ptr @main, !3, i32 1 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"DescriptorTable", i32 0, !6, !7 }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ entry:
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }


!dx.rootsignatures = !{!2} ; list of function/root signature pairs
!dx.rootsignatures = !{!0, !2} ; list of function/root signature pairs
!0 = !{i1 0} ; strip root signature
!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"DescriptorTable", i32 0, !6, !7 }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ entry:
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }


!dx.rootsignatures = !{!2} ; list of function/root signature pairs
!dx.rootsignatures = !{!0, !2} ; list of function/root signature pairs
!0 = !{i1 0} ; strip root signature
!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"DescriptorTable", i32 0, !6}
Expand Down
Loading