| // RUN: %clang_cc1 -triple spirv-linux-vulkan-vertex -x hlsl -emit-llvm -finclude-default-header -disable-llvm-passes -o - %s | FileCheck %s | |
| struct Inner { | |
| uint b : B; | |
| }; | |
| struct VSInput { | |
| float4 position : POSITION; // Not system semantic, Location 0 | |
| }; | |
| struct VSOutput { | |
| float4 position : SV_POSITION; // System semantic, builtin Position | |
| uint a : A; // Location 0 | |
| Inner inner; // Location 1 | |
| uint c : C; // Location 2 | |
| }; | |
| // CHECK: @POSITION0 = external hidden thread_local addrspace(7) externally_initialized constant <4 x float>, !spirv.Decorations ![[#MD_0:]] | |
| // CHECK: @SV_POSITION = external hidden thread_local addrspace(8) global <4 x float>, !spirv.Decorations ![[#MD_2:]] | |
| // CHECK: @A0 = external hidden thread_local addrspace(8) global i32, !spirv.Decorations ![[#MD_0:]] | |
| // CHECK: @B0 = external hidden thread_local addrspace(8) global i32, !spirv.Decorations ![[#MD_4:]] | |
| // CHECK: @C0 = external hidden thread_local addrspace(8) global i32, !spirv.Decorations ![[#MD_6:]] | |
| VSOutput main(VSInput input) { | |
| VSOutput output; | |
| output.position = input.position; | |
| output.a = 1; | |
| output.inner.b = 2; | |
| output.c = 3; | |
| return output; | |
| } | |
| // CHECK: ![[#MD_0]] = !{![[#MD_1:]]} | |
| // CHECK: ![[#MD_1]] = !{i32 30, i32 0} | |
| // | `-> Location index | |
| // `-> SPIR-V decoration 'Location' | |
| // CHECK: ![[#MD_2]] = !{![[#MD_3:]]} | |
| // CHECK: ![[#MD_3]] = !{i32 11, i32 0} | |
| // | `-> BuiltIn 'Position' | |
| // `-> SPIR-V decoration 'BuiltIn' | |
| // CHECK: ![[#MD_4]] = !{![[#MD_5:]]} | |
| // CHECK: ![[#MD_5]] = !{i32 30, i32 1} | |
| // | `-> Location index | |
| // `-> SPIR-V decoration 'Location' | |
| // CHECK: ![[#MD_6]] = !{![[#MD_7:]]} | |
| // CHECK: ![[#MD_7]] = !{i32 30, i32 2} | |
| // | `-> Location index | |
| // `-> SPIR-V decoration 'Location' |