blob: 5c5b7e04c0edc0588cbf69d10e08e8c81028801b [file] [edit]
; 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: