|
| 1 | +; RUN: llc < %s -filetype=obj | llvm-readobj --codeview - | FileCheck %s |
| 2 | + |
| 3 | +; The point of this is mostly just to avoid crashing... there isn't any way |
| 4 | +; to encode most of the information we want to encode. But we try to do what |
| 5 | +; we can. |
| 6 | +; |
| 7 | +; Generated from: |
| 8 | +; |
| 9 | +; #include <arm_sve.h> |
| 10 | +; void g(); |
| 11 | +; svint32_t f(svint32_t aaa, svint32_t bbb, svint32_t *ccc) { |
| 12 | +; asm("":::"z0", "z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8", "z9", |
| 13 | +; "z10", "z11", "z12", "z13", "z14", "z15", "z16", "z17", "z18", |
| 14 | +; "z19", "z20", "z21", "z22", "z23", "z24", "z25", "z26", "z27", |
| 15 | +; "z28", "z29", "z30", "z31"); |
| 16 | +; return aaa**ccc+bbb; |
| 17 | +;} |
| 18 | + |
| 19 | +; Emit the SVE type. We represent this as an array with unknown bound. |
| 20 | + |
| 21 | +; CHECK: Array (0x1000) { |
| 22 | +; CHECK-NEXT: TypeLeafKind: LF_ARRAY (0x1503) |
| 23 | +; CHECK-NEXT: ElementType: int (0x74) |
| 24 | +; CHECK-NEXT: IndexType: unsigned __int64 (0x23) |
| 25 | +; CHECK-NEXT: SizeOf: 0 |
| 26 | +; CHECK-NEXT: Name: |
| 27 | +; CHECK-NEXT: } |
| 28 | + |
| 29 | +; Emit frame information. This is missing the size of the SVE |
| 30 | +; variables, but we can't really do anything about that. |
| 31 | + |
| 32 | +; CHECK: FrameProcSym { |
| 33 | +; CHECK-NEXT: Kind: S_FRAMEPROC (0x1012) |
| 34 | +; CHECK-NEXT: TotalFrameBytes: 0x10 |
| 35 | +; CHECK-NEXT: PaddingFrameBytes: 0x0 |
| 36 | +; CHECK-NEXT: OffsetToPadding: 0x0 |
| 37 | +; CHECK-NEXT: BytesOfCalleeSavedRegisters: 0x0 |
| 38 | +; CHECK-NEXT: OffsetOfExceptionHandler: 0x0 |
| 39 | +; CHECK-NEXT: SectionIdOfExceptionHandler: 0x0 |
| 40 | +; CHECK-NEXT: Flags [ (0x116008) |
| 41 | +; CHECK-NEXT: HasInlineAssembly (0x8) |
| 42 | +; CHECK-NEXT: OptimizedForSpeed (0x100000) |
| 43 | +; CHECK-NEXT: SafeBuffers (0x2000) |
| 44 | +; CHECK-NEXT: ] |
| 45 | +; CHECK-NEXT: LocalFramePtrReg: ARM64_NOREG (0x0) |
| 46 | +; CHECK-NEXT: ParamFramePtrReg: ARM64_NOREG (0x0) |
| 47 | +; CHECK-NEXT: } |
| 48 | + |
| 49 | +; Emit the symbols for the local variables. |
| 50 | +; |
| 51 | +; ccc is a normal pointer. |
| 52 | +; |
| 53 | +; We can't represent bbb anywhere in its range; there's no way to name Z |
| 54 | +; registers, and no way to express its location on the stack relative |
| 55 | +; to the stack pointer when it's spilled. |
| 56 | +; |
| 57 | +; In the middle of the range, aaa happens to have a scalable offset of zero, |
| 58 | +; so we can represent it while it's on the stack. |
| 59 | + |
| 60 | +; CHECK-NEXT: LocalSym { |
| 61 | +; CHECK-NEXT: Kind: S_LOCAL (0x113E) |
| 62 | +; CHECK-NEXT: Type: 0x1000 |
| 63 | +; CHECK-NEXT: Flags [ (0x1) |
| 64 | +; CHECK-NEXT: IsParameter (0x1) |
| 65 | +; CHECK-NEXT: ] |
| 66 | +; CHECK-NEXT: VarName: aaa |
| 67 | +; CHECK-NEXT: } |
| 68 | +; CHECK-NEXT: DefRangeRegisterRelSym { |
| 69 | +; CHECK-NEXT: Kind: S_DEFRANGE_REGISTER_REL (0x1145) |
| 70 | +; CHECK-NEXT: BaseRegister: ARM64_SP (0x51) |
| 71 | +; CHECK-NEXT: HasSpilledUDTMember: No |
| 72 | +; CHECK-NEXT: OffsetInParent: 0 |
| 73 | +; CHECK-NEXT: BasePointerOffset: 0 |
| 74 | +; CHECK-NEXT: LocalVariableAddrRange { |
| 75 | +; CHECK-NEXT: OffsetStart: .text+0x58 |
| 76 | +; CHECK-NEXT: ISectStart: 0x0 |
| 77 | +; CHECK-NEXT: Range: 0xC |
| 78 | +; CHECK-NEXT: } |
| 79 | +; CHECK-NEXT: } |
| 80 | +; CHECK-NEXT: LocalSym { |
| 81 | +; CHECK-NEXT: Kind: S_LOCAL (0x113E) |
| 82 | +; CHECK-NEXT: Type: 0x1000 |
| 83 | +; CHECK-NEXT: Flags [ (0x101) |
| 84 | +; CHECK-NEXT: IsOptimizedOut (0x100) |
| 85 | +; CHECK-NEXT: IsParameter (0x1) |
| 86 | +; CHECK-NEXT: ] |
| 87 | +; CHECK-NEXT: VarName: bbb |
| 88 | +; CHECK-NEXT: } |
| 89 | +; CHECK-NEXT: LocalSym { |
| 90 | +; CHECK-NEXT: Kind: S_LOCAL (0x113E) |
| 91 | +; CHECK-NEXT: Type: * (0x1001) |
| 92 | +; CHECK-NEXT: Flags [ (0x1) |
| 93 | +; CHECK-NEXT: IsParameter (0x1) |
| 94 | +; CHECK-NEXT: ] |
| 95 | +; CHECK-NEXT: VarName: ccc |
| 96 | +; CHECK-NEXT: } |
| 97 | +; CHECK-NEXT: DefRangeRegisterSym { |
| 98 | +; CHECK-NEXT: Kind: S_DEFRANGE_REGISTER (0x1141) |
| 99 | +; CHECK-NEXT: Register: ARM64_X0 (0x32) |
| 100 | +; CHECK-NEXT: MayHaveNoName: 0 |
| 101 | +; CHECK-NEXT: LocalVariableAddrRange { |
| 102 | +; CHECK-NEXT: OffsetStart: .text+0x0 |
| 103 | +; CHECK-NEXT: ISectStart: 0x0 |
| 104 | +; CHECK-NEXT: Range: 0xBC |
| 105 | +; CHECK-NEXT: } |
| 106 | +; CHECK-NEXT: } |
| 107 | +; CHECK-NEXT: ProcEnd { |
| 108 | +; CHECK-NEXT: Kind: S_PROC_ID_END (0x114F) |
| 109 | +; CHECK-NEXT: } |
| 110 | + |
| 111 | +target triple = "aarch64-unknown-windows-msvc19.33.0" |
| 112 | + |
| 113 | +; Function Attrs: mustprogress nounwind uwtable vscale_range(1,16) |
| 114 | +define dso_local <vscale x 4 x i32> @"?f@@YAU__SVInt32_t@__clang@@U12@0PEAU12@@Z"(<vscale x 4 x i32> %aaa, <vscale x 4 x i32> %bbb, ptr noundef readonly captures(none) %ccc) local_unnamed_addr #0 !dbg !10 { |
| 115 | +entry: |
| 116 | + #dbg_value(ptr %ccc, !23, !DIExpression(), !26) |
| 117 | + #dbg_value(<vscale x 4 x i32> %bbb, !24, !DIExpression(), !26) |
| 118 | + #dbg_value(<vscale x 4 x i32> %aaa, !25, !DIExpression(), !26) |
| 119 | + tail call void asm sideeffect "", "~{z0},~{z1},~{z2},~{z3},~{z4},~{z5},~{z6},~{z7},~{z8},~{z9},~{z10},~{z11},~{z12},~{z13},~{z14},~{z15},~{z16},~{z17},~{z18},~{z19},~{z20},~{z21},~{z22},~{z23},~{z24},~{z25},~{z26},~{z27},~{z28},~{z29},~{z30},~{z31}"() #1, !dbg !27, !srcloc !28 |
| 120 | + %0 = load <vscale x 4 x i32>, ptr %ccc, align 16, !dbg !27 |
| 121 | + %mul = mul <vscale x 4 x i32> %0, %aaa, !dbg !27 |
| 122 | + %add = add <vscale x 4 x i32> %mul, %bbb, !dbg !27 |
| 123 | + ret <vscale x 4 x i32> %add, !dbg !27 |
| 124 | +} |
| 125 | + |
| 126 | +attributes #0 = { mustprogress nounwind uwtable vscale_range(1,16) "frame-pointer"="non-leaf" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+fp-armv8,+fullfp16,+neon,+sve,+v8a,-fmv" } |
| 127 | +attributes #1 = { nounwind } |
| 128 | + |
| 129 | +!llvm.dbg.cu = !{!0} |
| 130 | +!llvm.module.flags = !{!2, !3, !4, !5, !6, !7, !8} |
| 131 | +!llvm.ident = !{!9} |
| 132 | + |
| 133 | +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 21.0.0git", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) |
| 134 | +!1 = !DIFile(filename: "-", directory: "", checksumkind: CSK_MD5, checksum: "e54fc2ba768e4a43f64b8a9d03a374d6") |
| 135 | +!2 = !{i32 2, !"CodeView", i32 1} |
| 136 | +!3 = !{i32 2, !"Debug Info Version", i32 3} |
| 137 | +!4 = !{i32 1, !"wchar_size", i32 2} |
| 138 | +!5 = !{i32 8, !"PIC Level", i32 2} |
| 139 | +!6 = !{i32 7, !"uwtable", i32 2} |
| 140 | +!7 = !{i32 7, !"frame-pointer", i32 1} |
| 141 | +!8 = !{i32 7, !"debug-info-assignment-tracking", i1 true} |
| 142 | +!9 = !{!"clang version 21.0.0git"} |
| 143 | +!10 = distinct !DISubprogram(name: "f", linkageName: "?f@@YAU__SVInt32_t@__clang@@U12@0PEAU12@@Z", scope: !11, file: !11, line: 2, type: !12, scopeLine: 2, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !22) |
| 144 | +!11 = !DIFile(filename: "<stdin>", directory: "", checksumkind: CSK_MD5, checksum: "e54fc2ba768e4a43f64b8a9d03a374d6") |
| 145 | +!12 = !DISubroutineType(types: !13) |
| 146 | +!13 = !{!14, !14, !14, !21} |
| 147 | +!14 = !DIDerivedType(tag: DW_TAG_typedef, name: "svint32_t", file: !15, line: 30, baseType: !16) |
| 148 | +!15 = !DIFile(filename: "arm_sve.h", directory: "", checksumkind: CSK_MD5, checksum: "34027e9d24f4b03c6e5370869d5cc907") |
| 149 | +!16 = !DIDerivedType(tag: DW_TAG_typedef, name: "__SVInt32_t", file: !1, baseType: !17) |
| 150 | +!17 = !DICompositeType(tag: DW_TAG_array_type, baseType: !18, flags: DIFlagVector, elements: !19) |
| 151 | +!18 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) |
| 152 | +!19 = !{!20} |
| 153 | +!20 = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 2, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus)) |
| 154 | +!21 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !14, size: 64) |
| 155 | +!22 = !{!23, !24, !25} |
| 156 | +!23 = !DILocalVariable(name: "ccc", arg: 3, scope: !10, file: !11, line: 2, type: !21) |
| 157 | +!24 = !DILocalVariable(name: "bbb", arg: 2, scope: !10, file: !11, line: 2, type: !14) |
| 158 | +!25 = !DILocalVariable(name: "aaa", arg: 1, scope: !10, file: !11, line: 2, type: !14) |
| 159 | +!26 = !DILocation(line: 0, scope: !10) |
| 160 | +!27 = !DILocation(line: 2, scope: !10) |
| 161 | +!28 = !{i64 98} |
0 commit comments