diff --git a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp --- a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp +++ b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp @@ -49,6 +49,47 @@ DXILValidatorVersionMD->addOperand(MDNode::get(Ctx, MDVals)); } +static void emitDXILVersion(Module &M) { + Triple T = Triple(M.getTargetTriple()); + VersionTuple DXILVer = T.getOSVersion(); + + auto &Ctx = M.getContext(); + + constexpr StringLiteral DXILVerKey = "dx.version"; + NamedMDNode *VersionMD = M.getOrInsertNamedMetadata(DXILVerKey); + + Metadata *MDVals[DXILVersionNumFields]; + MDVals[0] = Uint32ToConstMD(DXILVer.getMajor() - 5, Ctx); + MDVals[1] = Uint32ToConstMD(DXILVer.getMinor().value_or(0), Ctx); + + VersionMD->addOperand(MDNode::get(Ctx, MDVals)); +} + +static void emitShaderModel(Module &M) { + constexpr StringLiteral DXILEntryPointsMDName = "dx.shaderModel"; + NamedMDNode *pShaderModelNamedMD = + M.getOrInsertNamedMetadata(DXILEntryPointsMDName); + auto &Ctx = M.getContext(); + + // Shader model. + static const unsigned DXILShaderModelNumFields = 3; + // Shader type (vs,ps,cs,gs,ds,hs). + static const unsigned DXILShaderModelTypeIdx = 0; + static const unsigned DXILShaderModelMajorIdx = 1; // Shader model major. + static const unsigned DXILShaderModelMinorIdx = 2; // Shader model minor. + Metadata *MDVals[DXILShaderModelNumFields]; + + Triple T(M.getTargetTriple()); + + MDVals[DXILShaderModelTypeIdx] = MDString::get(Ctx, T.getEnvironmentName()); + auto Ver = T.getOSVersion(); + auto Minor = Ver.getMinor(); + MDVals[DXILShaderModelMajorIdx] = Uint32ToConstMD(Ver.getMajor(), Ctx); + MDVals[DXILShaderModelMinorIdx] = Uint32ToConstMD(Minor.value_or(0), Ctx); + + pShaderModelNamedMD->addOperand(MDNode::get(Ctx, MDVals)); +} + static VersionTuple loadDXILValidatorVersion(MDNode *ValVerMD) { if (ValVerMD->getNumOperands() != DXILVersionNumFields) return VersionTuple(); @@ -107,6 +148,9 @@ ValidatorVer = ValVer; } emitDXILValidatorVersion(M, ValidatorVer); + emitDXILVersion(M); + emitShaderModel(M); + M.setTargetTriple("dxil-ms-dx"); cleanModule(M); return false; } diff --git a/llvm/test/CodeGen/DirectX/dxil_ver.ll b/llvm/test/CodeGen/DirectX/dxil_metadata_emit.ll copy from llvm/test/CodeGen/DirectX/dxil_ver.ll copy to llvm/test/CodeGen/DirectX/dxil_metadata_emit.ll --- a/llvm/test/CodeGen/DirectX/dxil_ver.ll +++ b/llvm/test/CodeGen/DirectX/dxil_metadata_emit.ll @@ -1,13 +1,21 @@ ; RUN: opt -S -dxil-metadata-emit < %s | FileCheck %s target datalayout = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64" +; Make sure triple updated to dxil. +; CHECK:target triple = "dxil-ms-dx" target triple = "dxil-pc-shadermodel6.3-library" ; Make sure dx.valver metadata is generated. ; CHECK:!dx.valver = !{![[valver:[0-9]+]]} +; CHECK:!dx.version = !{![[dxilver:[0-9]+]]} +; CHECK:!dx.shaderModel = !{![[shader_model:[0-9]+]]} + ; Make sure module flags still exist and only have 1 operand left. ; CHECK:!llvm.module.flags = !{{{![0-9]}}} ; Make sure validator version is 1.1. ; CHECK:![[valver]] = !{i32 1, i32 1} +; CHECK:![[dxilver]] = !{i32 1, i32 3} +; CHECK:![[shader_model]] = !{!"library", i32 6, i32 3} + ; Make sure wchar_size still exist. ; CHECK:!{i32 1, !"wchar_size", i32 4} diff --git a/llvm/test/CodeGen/DirectX/dxil_ver.ll b/llvm/test/CodeGen/DirectX/dxil_ver.ll --- a/llvm/test/CodeGen/DirectX/dxil_ver.ll +++ b/llvm/test/CodeGen/DirectX/dxil_ver.ll @@ -1,13 +1,23 @@ ; RUN: opt -S -dxil-metadata-emit < %s | FileCheck %s target datalayout = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64" +; Make sure triple updated to dxil. +; CHECK:target triple = "dxil-ms-dx" target triple = "dxil-pc-shadermodel6.3-library" -; Make sure dx.valver metadata is generated. +; Make sure dx.valver/version/shaderModle metadata is generated. ; CHECK:!dx.valver = !{![[valver:[0-9]+]]} +; CHECK:!dx.version = !{![[dxilver:[0-9]+]]} +; CHECK:!dx.shaderModel = !{![[shader_model:[0-9]+]]} + ; Make sure module flags still exist and only have 1 operand left. ; CHECK:!llvm.module.flags = !{{{![0-9]}}} ; Make sure validator version is 1.1. ; CHECK:![[valver]] = !{i32 1, i32 1} +; Make sure dxil version is 1.3. +; CHECK:![[dxilver]] = !{i32 1, i32 3} +; Make sure shader model is lib_6_3. +; CHECK:![[shader_model]] = !{!"library", i32 6, i32 3} + ; Make sure wchar_size still exist. ; CHECK:!{i32 1, !"wchar_size", i32 4}