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,49 @@ DXILValidatorVersionMD->addOperand(MDNode::get(Ctx, MDVals)); } +static void emitDXILVersion(Module &M) { + Triple T = Triple(M.getTargetTriple()); + VersionTuple SMVer = T.getOSVersion(); + + auto &Ctx = M.getContext(); + + constexpr StringLiteral DXILVerKey = "dx.version"; + NamedMDNode *VersionMD = M.getOrInsertNamedMetadata(DXILVerKey); + + Metadata *MDVals[DXILVersionNumFields]; + // DXIL Verison is ShaderModel Version with offset 5. + // ShaderModel 6.1 will get DXIL Version 1.1. + MDVals[0] = Uint32ToConstMD(SMVer.getMajor() - 5, Ctx); + MDVals[1] = Uint32ToConstMD(SMVer.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. + constexpr unsigned DXILShaderModelNumFields = 3; + // Shader type (vs,ps,cs,gs,ds,hs). + constexpr unsigned DXILShaderModelTypeIdx = 0; + constexpr unsigned DXILShaderModelMajorIdx = 1; // Shader model major. + constexpr unsigned DXILShaderModelMinorIdx = 2; // Shader model minor. + Metadata *MDVals[DXILShaderModelNumFields]; + + Triple T(M.getTargetTriple()); + + MDVals[DXILShaderModelTypeIdx] = MDString::get(Ctx, T.getEnvironmentName()); + VersionTuple Ver = T.getOSVersion(); + MDVals[DXILShaderModelMajorIdx] = Uint32ToConstMD(Ver.getMajor(), Ctx); + MDVals[DXILShaderModelMinorIdx] = + Uint32ToConstMD(Ver.getMinor().value_or(0), Ctx); + + pShaderModelNamedMD->addOperand(MDNode::get(Ctx, MDVals)); +} + static VersionTuple loadDXILValidatorVersion(MDNode *ValVerMD) { if (ValVerMD->getNumOperands() != DXILVersionNumFields) return VersionTuple(); @@ -81,6 +124,9 @@ ValidatorVer = ValVer; } emitDXILValidatorVersion(M, ValidatorVer); + emitDXILVersion(M); + emitShaderModel(M); + return false; } diff --git a/llvm/lib/Target/DirectX/DXILWriter/DXILWriterPass.cpp b/llvm/lib/Target/DirectX/DXILWriter/DXILWriterPass.cpp --- a/llvm/lib/Target/DirectX/DXILWriter/DXILWriterPass.cpp +++ b/llvm/lib/Target/DirectX/DXILWriter/DXILWriterPass.cpp @@ -64,8 +64,17 @@ bool runOnModule(Module &M) override { std::string Data; llvm::raw_string_ostream OS(Data); + + const std::string OriginalTriple = M.getTargetTriple(); + // Set to DXIL triple when write to bitcode. + // Only the output bitcode need to be DXIL triple. + M.setTargetTriple("dxil-ms-dx"); + WriteDXILToFile(M, OS); + // Recover triple. + M.setTargetTriple(OriginalTriple); + Constant *ModuleConstant = ConstantDataArray::get(M.getContext(), arrayRefFromStringRef(Data)); auto *GV = new llvm::GlobalVariable(M, ModuleConstant->getType(), true, diff --git a/llvm/test/CodeGen/DirectX/dxil_ver.ll b/llvm/test/CodeGen/DirectX/dxil_metadata_emit.ll rename from llvm/test/CodeGen/DirectX/dxil_ver.ll rename 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 @@ -2,12 +2,20 @@ 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" target triple = "dxil-pc-shadermodel6.3-library" -; Make sure dx.valver metadata is generated. +; Make sure dx.valver/version/shaderModle metadata is generated. ; CHECK-DAG:!dx.valver = !{![[valver:[0-9]+]]} +; CHECK-DAG:!dx.version = !{![[dxilver:[0-9]+]]} +; CHECK-DAG:!dx.shaderModel = !{![[shader_model:[0-9]+]]} + ; Make sure module flags still exist and only have 1 operand left. ; CHECK-DAG:!llvm.module.flags = !{{{![0-9]}}} ; Make sure validator version is 1.1. ; CHECK-DAG:![[valver]] = !{i32 1, i32 1} +; Make sure dxil version is 1.3. +; CHECK-DAG:![[dxilver]] = !{i32 1, i32 3} +; Make sure shader model is lib_6_3. +; CHECK-DAG:![[shader_model]] = !{!"library", i32 6, i32 3} + ; Make sure wchar_size still exist. ; CHECK-DAG:!{i32 1, !"wchar_size", i32 4} diff --git a/llvm/test/tools/dxil-dis/attribute-filter.ll b/llvm/test/tools/dxil-dis/attribute-filter.ll --- a/llvm/test/tools/dxil-dis/attribute-filter.ll +++ b/llvm/test/tools/dxil-dis/attribute-filter.ll @@ -1,6 +1,6 @@ ; RUN: llc %s --filetype=obj -o - | dxil-dis -o - | FileCheck %s -; CHECK: target triple = "dxil-unknown-unknown" +; CHECK: target triple = "dxil-ms-dx" target triple = "dxil-unknown-unknown" ; CHECK: Function Attrs: nounwind readnone diff --git a/llvm/test/tools/dxil-dis/debug-info.ll b/llvm/test/tools/dxil-dis/debug-info.ll --- a/llvm/test/tools/dxil-dis/debug-info.ll +++ b/llvm/test/tools/dxil-dis/debug-info.ll @@ -2,17 +2,17 @@ target triple = "dxil-unknown-unknown" target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" -; CHECK: define float @fma(float, float, float) unnamed_addr #0 !dbg !7 +; CHECK: define float @fma(float, float, float) unnamed_addr #0 !dbg ![[FMA_DBG:[0-9]+]] ; Function Attrs: norecurse nounwind readnone willreturn define dso_local float @fma(float %0, float %1, float %2) local_unnamed_addr #0 !dbg !6 { -; CHECK-NEXT: call void @llvm.dbg.value(metadata float %0, metadata !12, metadata !15), !dbg !16 -; CHECK-NEXT: call void @llvm.dbg.value(metadata float %1, metadata !13, metadata !15), !dbg !16 -; CHECK-NEXT: call void @llvm.dbg.value(metadata float %2, metadata !14, metadata !15), !dbg !16 +; CHECK-NEXT: call void @llvm.dbg.value(metadata float %0, metadata ![[TAG_0:[0-9]+]], metadata ![[EXP:[0-9]+]]), !dbg ![[LINE:[0-9]+]] +; CHECK-NEXT: call void @llvm.dbg.value(metadata float %1, metadata ![[TAG_1:[0-9]+]], metadata ![[EXP]]), !dbg ![[LINE]] +; CHECK-NEXT: call void @llvm.dbg.value(metadata float %2, metadata ![[TAG_2:[0-9]+]], metadata ![[EXP]]), !dbg ![[LINE]] call void @llvm.dbg.value(metadata float %0, metadata !11, metadata !DIExpression()), !dbg !14 call void @llvm.dbg.value(metadata float %1, metadata !12, metadata !DIExpression()), !dbg !14 call void @llvm.dbg.value(metadata float %2, metadata !13, metadata !DIExpression()), !dbg !14 -; CHECK-NEXT: %4 = fmul float %0, %1, !dbg !17 -; CHECK-NEXT: %5 = fadd float %4, %2, !dbg !18 +; CHECK-NEXT: %4 = fmul float %0, %1, !dbg ![[MUL_DBG:[0-9]+]] +; CHECK-NEXT: %5 = fadd float %4, %2, !dbg ![[ADD_DBG:[0-9]+]] %4 = fmul float %0, %1, !dbg !15 %5 = fadd float %4, %2, !dbg !16 ret float %5, !dbg !17 @@ -34,17 +34,17 @@ ; being emitted correctly even though other tests verified the MD would be ; emitted if it was referenced as module metadata. -; CHECK: !0 = distinct !DICompileUnit -; CHECK-NEXT: !1 = !DIFile(filename: -; CHECK: !7 = distinct !DISubprogram(name: "fma", -; CHECK: !12 = !DILocalVariable(tag: -; CHECK-NEXT: !13 = !DILocalVariable(tag: -; CHECK-NEXT: !14 = !DILocalVariable(tag: -; CHECK-NEXT: !15 = !DIExpression() -; CHECK-NEXT: !16 = !DILocation(line: -; CHECK-NEXT: !17 = !DILocation(line: -; CHECK-NEXT: !18 = !DILocation(line: -; CHECK-NEXT: !19 = !DILocation(line: +; CHECK: !{{[0-9]+}} = distinct !DICompileUnit +; CHECK-NEXT: !{{[0-9]+}} = !DIFile(filename: +; CHECK: ![[FMA_DBG]] = distinct !DISubprogram(name: "fma", +; CHECK: ![[TAG_0]] = !DILocalVariable(tag: +; CHECK-NEXT: ![[TAG_1]] = !DILocalVariable(tag: +; CHECK-NEXT: ![[TAG_2]] = !DILocalVariable(tag: +; CHECK-NEXT: ![[EXP]] = !DIExpression() +; CHECK-NEXT: ![[LINE]] = !DILocation(line: +; CHECK-NEXT: ![[MUL_DBG]] = !DILocation(line: +; CHECK-NEXT: ![[ADD_DBG]] = !DILocation(line: +; CHECK-NEXT: !{{[0-9]+}} = !DILocation(line: !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None) !1 = !DIFile(filename: "in.c", directory: "dir") diff --git a/llvm/test/tools/dxil-dis/triple.ll b/llvm/test/tools/dxil-dis/triple.ll new file mode 100644 --- /dev/null +++ b/llvm/test/tools/dxil-dis/triple.ll @@ -0,0 +1,5 @@ +; RUN: llc --filetype=obj %s -o - | dxil-dis -o - | FileCheck %s +target triple = "dxil-unknown-unknown" + +; Make sure triple updated to dxil. +; CHECK:target triple = "dxil-ms-dx"