| ; RUN: llc -filetype=obj -dx-embed-debug %s -o %t.dxbc | |
| ; RUN: obj2yaml %t.dxbc | FileCheck %s --check-prefix=PARTS | |
| ; RUN: llvm-objcopy --dump-section=DXIL=%t.dxil.bc %t.dxbc | |
| ; RUN: llvm-objcopy --dump-section=ILDB=%t.ildb.bc %t.dxbc | |
| ; RUN: llvm-dis %t.dxil.bc -o - | FileCheck %s --check-prefix=SIG | |
| ; RUN: llvm-dis %t.ildb.bc -o - | FileCheck %s --check-prefix=SIG | |
| ; RUN: llvm-dis %t.ildb.bc -o - | FileCheck %s | |
| ; Both cloned bitcode modules and the container must retain the same finalized | |
| ; signature after source metadata stripping, op lowering, and debug preparation. | |
| ; CHECK: !llvm.dbg.cu = | |
| ; CHECK: !DICompileUnit | |
| target triple = "dxil-pc-shadermodel6.8-vertex" | |
| define void @main() #0 { | |
| %p = call <4 x float> @llvm.dx.load.input.v4f32(i32 0, i32 0, i8 0, i32 poison) | |
| %uv = call <2 x float> @llvm.dx.load.input.v2f32(i32 1, i32 0, i8 0, i32 poison) | |
| %u = extractelement <2 x float> %uv, i32 0 | |
| call void @llvm.dx.store.output.v4f32(i32 0, i32 0, i8 0, <4 x float> %p) | |
| call void @llvm.dx.store.output.f32(i32 1, i32 0, i8 0, float %u) | |
| call void @llvm.dx.store.output.v2f32(i32 2, i32 0, i8 0, <2 x float> %uv) | |
| ret void | |
| } | |
| attributes #0 = { "hlsl.shader"="vertex" } | |
| !dx.valver = !{!20} | |
| !20 = !{i32 1, i32 8} | |
| !dx.semantic.signatures = !{!0} | |
| !0 = !{ptr @main, !1, !2} | |
| !1 = !{!3, !4} | |
| !2 = !{!5, !6, !7} | |
| !3 = !{i32 0, !"POSITION", i32 9, i32 0, !10, i32 0, i32 1, i8 4, i32 0, i8 0, i8 0, i8 0, i32 0} | |
| !4 = !{i32 1, !"TEXCOORD", i32 9, i32 0, !10, i32 0, i32 1, i8 2, i32 1, i8 0, i8 0, i8 0, i32 0} | |
| ; The metadata keeps the source spelling, but OSG1 must use SV_Position. | |
| !5 = !{i32 0, !"SV_POSITION", i32 9, i32 3, !10, i32 0, i32 1, i8 4, i32 0, i8 0, i8 0, i8 0, i32 0} | |
| !6 = !{i32 1, !"A", i32 9, i32 0, !10, i32 0, i32 1, i8 1, i32 1, i8 0, i8 0, i8 0, i32 0} | |
| !7 = !{i32 2, !"B", i32 9, i32 0, !10, i32 0, i32 1, i8 2, i32 1, i8 1, i8 0, i8 0, i32 0} | |
| !10 = !{i32 0} | |
| !llvm.dbg.cu = !{!200} | |
| !llvm.module.flags = !{!202, !203} | |
| !200 = distinct !DICompileUnit(language: DW_LANG_C99, file: !201, producer: "test", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug) | |
| !201 = !DIFile(filename: "signature.hlsl", directory: "/") | |
| !202 = !{i32 2, !"Dwarf Version", i32 4} | |
| !203 = !{i32 2, !"Debug Info Version", i32 3} | |
| ; The packed location is row 1, col 1, but the access still uses ID 2, col 0. | |
| ; SIG: call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 0, | |
| ; SIG-NOT: !dx.semantic.signatures | |
| ; SIG: !dx.viewIdState = !{![[STATE:[0-9]+]]} | |
| ; SIG: !dx.entryPoints = !{![[ENTRY:[0-9]+]]} | |
| ; SIG-DAG: ![[STATE]] = !{[10 x i32] [i32 8, i32 8, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 0, i32 0]} | |
| ; SIG-DAG: ![[ENTRY]] = !{ptr @main, !"main", ![[SIG:[0-9]+]], null, null} | |
| ; SIG-DAG: ![[SIG]] = !{![[IN:[0-9]+]], ![[OUT:[0-9]+]], null} | |
| ; SIG-DAG: ![[IN]] = !{![[POS:[0-9]+]], ![[UV:[0-9]+]]} | |
| ; SIG-DAG: ![[OUT]] = !{![[SVPOS:[0-9]+]], ![[A:[0-9]+]], ![[B:[0-9]+]]} | |
| ; SIG-DAG: ![[POS]] = !{i32 0, !"POSITION", i8 9, i8 0, ![[INDEX:[0-9]+]], i8 0, i32 1, i8 4, i32 0, i8 0, ![[USE4:[0-9]+]]} | |
| ; SIG-DAG: ![[UV]] = !{i32 1, !"TEXCOORD", i8 9, i8 0, ![[INDEX]], i8 0, i32 1, i8 2, i32 1, i8 0, ![[USE2:[0-9]+]]} | |
| ; SIG-DAG: ![[SVPOS]] = !{i32 0, !"SV_POSITION", i8 9, i8 3, ![[INDEX]], i8 0, i32 1, i8 4, i32 0, i8 0, ![[USE4]]} | |
| ; SIG-DAG: ![[A]] = !{i32 1, !"A", i8 9, i8 0, ![[INDEX]], i8 0, i32 1, i8 1, i32 1, i8 0, ![[USE1:[0-9]+]]} | |
| ; SIG-DAG: ![[B]] = !{i32 2, !"B", i8 9, i8 0, ![[INDEX]], i8 0, i32 1, i8 2, i32 1, i8 1, ![[USE2]]} | |
| ; SIG-DAG: ![[USE4]] = !{i32 3, i32 15} | |
| ; SIG-DAG: ![[USE2]] = !{i32 3, i32 3} | |
| ; SIG-DAG: ![[USE1]] = !{i32 3, i32 1} | |
| ; SIG-NOT: !dx.semantic.signatures | |
| ; PARTS: Name: ISG1 | |
| ; PARTS: Name: POSITION | |
| ; PARTS: SystemValue: Undefined | |
| ; PARTS-NEXT: CompType: Float32 | |
| ; PARTS-NEXT: Register: 0 | |
| ; PARTS-NEXT: Mask: 15 | |
| ; PARTS-NEXT: ExclusiveMask: 15 | |
| ; PARTS: Name: TEXCOORD | |
| ; PARTS: Register: 1 | |
| ; PARTS-NEXT: Mask: 3 | |
| ; PARTS-NEXT: ExclusiveMask: 3 | |
| ; PARTS: Name: OSG1 | |
| ; PARTS: Name: SV_Position | |
| ; PARTS: SystemValue: Position | |
| ; PARTS: Register: 0 | |
| ; PARTS-NEXT: Mask: 15 | |
| ; PARTS-NEXT: ExclusiveMask: 0 | |
| ; PARTS: Name: A | |
| ; PARTS: Register: 1 | |
| ; PARTS-NEXT: Mask: 1 | |
| ; PARTS-NEXT: ExclusiveMask: 14 | |
| ; PARTS: Name: B | |
| ; PARTS: Register: 1 | |
| ; PARTS-NEXT: Mask: 6 | |
| ; PARTS-NEXT: ExclusiveMask: 9 | |
| ; PARTS: Name: PSV0 | |
| ; PARTS: OutputPositionPresent: 1 | |
| ; PARTS: SigInputVectors: 2 | |
| ; PARTS: SigOutputVectors: [ 2, 0, 0, 0 ] | |
| ; PARTS: SigInputElements: | |
| ; PARTS: Name: POSITION | |
| ; PARTS: SigOutputElements: | |
| ; PARTS: Kind: Position | |
| ; PARTS: Name: B | |
| ; PARTS: StartRow: 1 | |
| ; PARTS-NEXT: Cols: 2 | |
| ; PARTS-NEXT: StartCol: 1 | |
| ; PARTS: InputOutputMap: |