Skip to content

Commit 868c42b

Browse files
committed
[DirectX] add a DXILValidateMetadata pass
1 parent ec970c2 commit 868c42b

File tree

10 files changed

+172
-38
lines changed

10 files changed

+172
-38
lines changed

llvm/docs/DirectX/DXILArchitecture.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ are grouped into two flows:
113113

114114
The passes to generate DXIL IR follow the flow:
115115

116-
DXILOpLowering -> DXILPrepare -> DXILTranslateMetadata
116+
DXILOpLowering -> DXILPrepare -> DXILTranslateMetadata -> DXILValidateMetadata
117117

118118
Each of these passes has a defined responsibility:
119119

@@ -122,6 +122,8 @@ Each of these passes has a defined responsibility:
122122
namely removing attributes, and inserting bitcasts to allow typed pointers
123123
to be inserted.
124124
#. DXILTranslateMetadata transforms and emits all recognized DXIL Metadata.
125+
#. DXILValidateMetadata validates all emitted DXIL metadata structures
126+
conform to DXIL validation.
125127

126128
The passes to encode DXIL to binary in the DX Container follow the flow:
127129

llvm/lib/Target/DirectX/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ add_llvm_target(DirectXCodeGen
3535
DXILResourceImplicitBinding.cpp
3636
DXILShaderFlags.cpp
3737
DXILTranslateMetadata.cpp
38+
DXILValidateMetadata.cpp
3839
DXILRootSignature.cpp
3940
DXILLegalizePass.cpp
4041

llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp

Lines changed: 26 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -454,45 +454,34 @@ PreservedAnalyses DXILTranslateMetadata::run(Module &M,
454454
return PreservedAnalyses::all();
455455
}
456456

457-
namespace {
458-
class DXILTranslateMetadataLegacy : public ModulePass {
459-
public:
460-
static char ID; // Pass identification, replacement for typeid
461-
explicit DXILTranslateMetadataLegacy() : ModulePass(ID) {}
462-
463-
StringRef getPassName() const override { return "DXIL Translate Metadata"; }
464-
465-
void getAnalysisUsage(AnalysisUsage &AU) const override {
466-
AU.addRequired<DXILResourceTypeWrapperPass>();
467-
AU.addRequired<DXILResourceWrapperPass>();
468-
AU.addRequired<ShaderFlagsAnalysisWrapper>();
469-
AU.addRequired<DXILMetadataAnalysisWrapperPass>();
470-
AU.addRequired<RootSignatureAnalysisWrapper>();
471-
472-
AU.addPreserved<DXILMetadataAnalysisWrapperPass>();
473-
AU.addPreserved<DXILResourceBindingWrapperPass>();
474-
AU.addPreserved<DXILResourceWrapperPass>();
475-
AU.addPreserved<RootSignatureAnalysisWrapper>();
476-
AU.addPreserved<ShaderFlagsAnalysisWrapper>();
477-
}
457+
void DXILTranslateMetadataLegacy::getAnalysisUsage(AnalysisUsage &AU) const {
458+
AU.addRequired<DXILResourceTypeWrapperPass>();
459+
AU.addRequired<DXILResourceWrapperPass>();
460+
AU.addRequired<ShaderFlagsAnalysisWrapper>();
461+
AU.addRequired<DXILMetadataAnalysisWrapperPass>();
462+
AU.addRequired<RootSignatureAnalysisWrapper>();
463+
464+
AU.addPreserved<DXILMetadataAnalysisWrapperPass>();
465+
AU.addPreserved<DXILResourceBindingWrapperPass>();
466+
AU.addPreserved<DXILResourceWrapperPass>();
467+
AU.addPreserved<RootSignatureAnalysisWrapper>();
468+
AU.addPreserved<ShaderFlagsAnalysisWrapper>();
469+
}
478470

479-
bool runOnModule(Module &M) override {
480-
DXILResourceMap &DRM =
481-
getAnalysis<DXILResourceWrapperPass>().getResourceMap();
482-
DXILResourceTypeMap &DRTM =
483-
getAnalysis<DXILResourceTypeWrapperPass>().getResourceTypeMap();
484-
const ModuleShaderFlags &ShaderFlags =
485-
getAnalysis<ShaderFlagsAnalysisWrapper>().getShaderFlags();
486-
dxil::ModuleMetadataInfo MMDI =
487-
getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
488-
489-
translateGlobalMetadata(M, DRM, DRTM, ShaderFlags, MMDI);
490-
translateInstructionMetadata(M);
491-
return true;
492-
}
493-
};
471+
bool DXILTranslateMetadataLegacy::runOnModule(Module &M) {
472+
DXILResourceMap &DRM =
473+
getAnalysis<DXILResourceWrapperPass>().getResourceMap();
474+
DXILResourceTypeMap &DRTM =
475+
getAnalysis<DXILResourceTypeWrapperPass>().getResourceTypeMap();
476+
const ModuleShaderFlags &ShaderFlags =
477+
getAnalysis<ShaderFlagsAnalysisWrapper>().getShaderFlags();
478+
dxil::ModuleMetadataInfo MMDI =
479+
getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
494480

495-
} // namespace
481+
translateGlobalMetadata(M, DRM, DRTM, ShaderFlags, MMDI);
482+
translateInstructionMetadata(M);
483+
return true;
484+
}
496485

497486
char DXILTranslateMetadataLegacy::ID = 0;
498487

llvm/lib/Target/DirectX/DXILTranslateMetadata.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#define LLVM_TARGET_DIRECTX_DXILTRANSLATEMETADATA_H
1111

1212
#include "llvm/IR/PassManager.h"
13+
#include "llvm/Pass.h"
1314

1415
namespace llvm {
1516

@@ -20,6 +21,22 @@ class DXILTranslateMetadata : public PassInfoMixin<DXILTranslateMetadata> {
2021
PreservedAnalyses run(Module &M, ModuleAnalysisManager &);
2122
};
2223

24+
/// Wrapper pass for the legacy pass manager.
25+
///
26+
/// This is required because the passes that will depend on this are codegen
27+
/// passes which run through the legacy pass manager.
28+
class DXILTranslateMetadataLegacy : public ModulePass {
29+
public:
30+
static char ID; // Pass identification, replacement for typeid
31+
explicit DXILTranslateMetadataLegacy() : ModulePass(ID) {}
32+
33+
StringRef getPassName() const override { return "DXIL Translate Metadata"; }
34+
35+
void getAnalysisUsage(AnalysisUsage &AU) const override;
36+
37+
bool runOnModule(Module &M) override;
38+
};
39+
2340
} // namespace llvm
2441

2542
#endif // LLVM_TARGET_DIRECTX_DXILTRANSLATEMETADATA_H
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
//===- DXILValidateMetadata.cpp - Pass to validate DXIL metadata ----------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "DXILValidateMetadata.h"
10+
#include "DXILTranslateMetadata.h"
11+
#include "DirectX.h"
12+
#include "llvm/ADT/Twine.h"
13+
#include "llvm/IR/BasicBlock.h"
14+
#include "llvm/IR/DiagnosticInfo.h"
15+
#include "llvm/IR/DiagnosticPrinter.h"
16+
#include "llvm/IR/Metadata.h"
17+
#include "llvm/IR/Module.h"
18+
#include "llvm/InitializePasses.h"
19+
#include "llvm/Support/ErrorHandling.h"
20+
21+
using namespace llvm;
22+
23+
namespace {
24+
25+
/// A simple Wrapper DiagnosticInfo that generates Module-level diagnostic
26+
/// for the ValidateMetadata pass
27+
class DiagnosticInfoValidateMD : public DiagnosticInfo {
28+
private:
29+
const Twine &Msg;
30+
const Module &Mod;
31+
32+
public:
33+
/// \p M is the module for which the diagnostic is being emitted. \p Msg is
34+
/// the message to show. Note that this class does not copy this message, so
35+
/// this reference must be valid for the whole life time of the diagnostic.
36+
DiagnosticInfoValidateMD(const Module &M,
37+
const Twine &Msg LLVM_LIFETIME_BOUND,
38+
DiagnosticSeverity Severity = DS_Error)
39+
: DiagnosticInfo(DK_Unsupported, Severity), Msg(Msg), Mod(M) {}
40+
41+
void print(DiagnosticPrinter &DP) const override {
42+
DP << Mod.getName() << ": " << Msg << '\n';
43+
}
44+
};
45+
46+
} // namespace
47+
48+
static void validateInstructionMetadata(Module &M) {
49+
llvm::errs() << "hello from new pass!\n";
50+
}
51+
52+
PreservedAnalyses DXILValidateMetadata::run(Module &M,
53+
ModuleAnalysisManager &MAM) {
54+
validateInstructionMetadata(M);
55+
56+
return PreservedAnalyses::all();
57+
}
58+
59+
namespace {
60+
class DXILValidateMetadataLegacy : public ModulePass {
61+
public:
62+
static char ID; // Pass identification, replacement for typeid
63+
explicit DXILValidateMetadataLegacy() : ModulePass(ID) {}
64+
65+
StringRef getPassName() const override { return "DXIL Validate Metadata"; }
66+
67+
void getAnalysisUsage(AnalysisUsage &AU) const override {
68+
AU.addRequired<DXILTranslateMetadataLegacy>();
69+
AU.setPreservesAll();
70+
}
71+
72+
bool runOnModule(Module &M) override {
73+
validateInstructionMetadata();
74+
return true;
75+
}
76+
};
77+
78+
} // namespace
79+
80+
char DXILValidateMetadataLegacy::ID = 0;
81+
82+
ModulePass *llvm::createDXILValidateMetadataLegacyPass() {
83+
return new DXILValidateMetadataLegacy();
84+
}
85+
86+
INITIALIZE_PASS_BEGIN(DXILValidateMetadataLegacy, "dxil-validate-metadata",
87+
"DXIL Validate Metadata", false, false)
88+
INITIALIZE_PASS_DEPENDENCY(DXILTranslateMetadataLegacy)
89+
INITIALIZE_PASS_END(DXILValidateMetadataLegacy, "dxil-validate-metadata",
90+
"DXIL validate Metadata", false, false)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//===- DXILValidateMetadata.h - Pass to emit DXIL metadata -----*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef LLVM_TARGET_DIRECTX_DXILVALIDATEMETADATA_H
10+
#define LLVM_TARGET_DIRECTX_DXILVALIDATEMETADATA_H
11+
12+
#include "llvm/IR/PassManager.h"
13+
14+
namespace llvm {
15+
16+
/// A pass that transforms DXIL Intrinsics that don't have DXIL opCodes
17+
class DXILValidateMetadata : public PassInfoMixin<DXILValidateMetadata> {
18+
public:
19+
PreservedAnalyses run(Module &M, ModuleAnalysisManager &);
20+
};
21+
22+
} // namespace llvm
23+
24+
#endif // LLVM_TARGET_DIRECTX_DXILVALIDATEMETADATA_H

llvm/lib/Target/DirectX/DirectX.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ void initializeDXILTranslateMetadataLegacyPass(PassRegistry &);
9090
/// Pass to emit metadata for DXIL.
9191
ModulePass *createDXILTranslateMetadataLegacyPass();
9292

93+
/// Initializer for DXILValidateMetadata.
94+
void initializeDXILValidateMetadataLegacyPass(PassRegistry &);
95+
96+
/// Pass to validate metadata for DXIL.
97+
ModulePass *createDXILValidateMetadataLegacyPass();
98+
9399
/// Pass to pretty print DXIL metadata.
94100
ModulePass *createDXILPrettyPrinterLegacyPass(raw_ostream &OS);
95101

llvm/lib/Target/DirectX/DirectXPassRegistry.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ MODULE_PASS("dxil-intrinsic-expansion", DXILIntrinsicExpansion())
3131
MODULE_PASS("dxil-op-lower", DXILOpLowering())
3232
MODULE_PASS("dxil-pretty-printer", DXILPrettyPrinterPass(dbgs()))
3333
MODULE_PASS("dxil-translate-metadata", DXILTranslateMetadata())
34+
MODULE_PASS("dxil-validate-metadata", DXILValidateMetadata())
3435
MODULE_PASS("dxil-resource-implicit-binding", DXILResourceImplicitBinding())
3536
MODULE_PASS("dxil-post-optimization-validation", DXILPostOptimizationValidation())
3637
// TODO: rename to print<foo> after NPM switch

llvm/lib/Target/DirectX/DirectXTargetMachine.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "DXILRootSignature.h"
2828
#include "DXILShaderFlags.h"
2929
#include "DXILTranslateMetadata.h"
30+
#include "DXILValidateMetadata.h"
3031
#include "DXILWriter/DXILWriterPass.h"
3132
#include "DirectX.h"
3233
#include "DirectXSubtarget.h"
@@ -70,6 +71,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXTarget() {
7071
initializeDXILResourceAccessLegacyPass(*PR);
7172
initializeDXILResourceImplicitBindingLegacyPass(*PR);
7273
initializeDXILTranslateMetadataLegacyPass(*PR);
74+
initializeDXILValidateMetadataLegacyPass(*PR);
7375
initializeDXILPostOptimizationValidationLegacyPass(*PR);
7476
initializeShaderFlagsAnalysisWrapperPass(*PR);
7577
initializeRootSignatureAnalysisWrapperPass(*PR);
@@ -122,6 +124,7 @@ class DirectXPassConfig : public TargetPassConfig {
122124
addPass(createDXILLegalizeLegacyPass());
123125
addPass(createDXILResourceImplicitBindingLegacyPass());
124126
addPass(createDXILTranslateMetadataLegacyPass());
127+
addPass(createDXILValidateMetadataLegacyPass());
125128
addPass(createDXILPostOptimizationValidationLegacyPass());
126129
addPass(createDXILOpLoweringLegacyPass());
127130
addPass(createDXILPrepareModulePass());

llvm/test/CodeGen/DirectX/llc-pipeline.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
; CHECK-NEXT: DXIL Shader Flag Analysis
4343
; CHECK-NEXT: DXIL Root Signature Analysis
4444
; CHECK-NEXT: DXIL Translate Metadata
45+
; CHECK-NEXT: DXIL Validate Metadata
4546
; CHECK-NEXT: DXIL Post Optimization Validation
4647
; CHECK-NEXT: DXIL Op Lowering
4748
; CHECK-NEXT: DXIL Prepare Module

0 commit comments

Comments
 (0)