1010#include " DXILTranslateMetadata.h"
1111#include " DirectX.h"
1212#include " llvm/ADT/Twine.h"
13+ #include " llvm/Analysis/DXILMetadataAnalysis.h"
1314#include " llvm/IR/BasicBlock.h"
1415#include " llvm/IR/DiagnosticInfo.h"
1516#include " llvm/IR/DiagnosticPrinter.h"
@@ -43,14 +44,43 @@ class DiagnosticInfoValidateMD : public DiagnosticInfo {
4344 }
4445};
4546
47+ static bool reportError (Module &M, Twine Message,
48+ DiagnosticSeverity Severity = DS_Error) {
49+ M.getContext ().diagnose (DiagnosticInfoValidateMD (M, Message, Severity));
50+ return true ;
51+ }
52+
4653} // namespace
4754
4855static void validateInstructionMetadata (Module &M) {
4956 llvm::errs () << " hello from new pass!\n " ;
5057}
5158
59+ static void validateGlobalMetadata (Module &M,
60+ const dxil::ModuleMetadataInfo &MMDI) {
61+ if (MMDI.ShaderProfile != Triple::EnvironmentType::Library) {
62+ if (1 < MMDI.EntryPropertyVec .size ())
63+ reportError (M, " Non-library shader: One and only one entry expected" );
64+
65+ for (const dxil::EntryProperties &EntryProp : MMDI.EntryPropertyVec )
66+ if (EntryProp.ShaderStage != MMDI.ShaderProfile )
67+ reportError (
68+ M,
69+ " Shader stage '" +
70+ Twine (Twine (Triple::getEnvironmentTypeName (
71+ EntryProp.ShaderStage )) +
72+ " ' for entry '" + Twine (EntryProp.Entry ->getName ()) +
73+ " ' different from specified target profile '" +
74+ Twine (Triple::getEnvironmentTypeName (MMDI.ShaderProfile ) +
75+ " '" )));
76+ }
77+ }
78+
5279PreservedAnalyses DXILValidateMetadata::run (Module &M,
5380 ModuleAnalysisManager &MAM) {
81+
82+ const dxil::ModuleMetadataInfo MMDI = MAM.getResult <DXILMetadataAnalysis>(M);
83+ validateGlobalMetadata (M, MMDI);
5484 validateInstructionMetadata (M);
5585
5686 return PreservedAnalyses::all ();
@@ -65,12 +95,15 @@ class DXILValidateMetadataLegacy : public ModulePass {
6595 StringRef getPassName () const override { return " DXIL Validate Metadata" ; }
6696
6797 void getAnalysisUsage (AnalysisUsage &AU) const override {
98+ AU.addRequired <DXILMetadataAnalysisWrapperPass>();
6899 AU.addRequired <DXILTranslateMetadataLegacy>();
69100 AU.setPreservesAll ();
70101 }
71102
72103 bool runOnModule (Module &M) override {
73- validateInstructionMetadata ();
104+ dxil::ModuleMetadataInfo MMDI =
105+ getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata ();
106+ validateGlobalMetadata (M, MMDI);
74107 return true ;
75108 }
76109};
@@ -85,6 +118,7 @@ ModulePass *llvm::createDXILValidateMetadataLegacyPass() {
85118
86119INITIALIZE_PASS_BEGIN (DXILValidateMetadataLegacy, " dxil-validate-metadata" ,
87120 " DXIL Validate Metadata" , false , false )
121+ INITIALIZE_PASS_DEPENDENCY(DXILMetadataAnalysisWrapperPass)
88122INITIALIZE_PASS_DEPENDENCY(DXILTranslateMetadataLegacy)
89123INITIALIZE_PASS_END(DXILValidateMetadataLegacy, " dxil-validate-metadata" ,
90124 " DXIL validate Metadata" , false , false )
0 commit comments