162 lines · plain
1; RUN: llc < %s -filetype=obj | llvm-readobj --codeview - | FileCheck %s2 3; The point of this is mostly just to avoid crashing... there isn't any way4; to encode most of the information we want to encode. But we try to do what5; 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: 026; CHECK-NEXT: Name:27; CHECK-NEXT: }28 29; Emit frame information. This is missing the size of the SVE30; 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: 0x1035; CHECK-NEXT: PaddingFrameBytes: 0x036; CHECK-NEXT: OffsetToPadding: 0x037; CHECK-NEXT: BytesOfCalleeSavedRegisters: 0x038; CHECK-NEXT: OffsetOfExceptionHandler: 0x039; CHECK-NEXT: SectionIdOfExceptionHandler: 0x040; 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 Z54; registers, and no way to express its location on the stack relative55; 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: 0x100063; CHECK-NEXT: Flags [ (0x1)64; CHECK-NEXT: IsParameter (0x1)65; CHECK-NEXT: ]66; CHECK-NEXT: VarName: aaa67; 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: No72; CHECK-NEXT: OffsetInParent: 073; CHECK-NEXT: BasePointerOffset: 074; CHECK-NEXT: LocalVariableAddrRange {75; CHECK-NEXT: OffsetStart: .text+0x5876; CHECK-NEXT: ISectStart: 0x077; CHECK-NEXT: Range: 0xC78; CHECK-NEXT: }79; CHECK-NEXT: }80; CHECK-NEXT: LocalSym {81; CHECK-NEXT: Kind: S_LOCAL (0x113E)82; CHECK-NEXT: Type: 0x100083; CHECK-NEXT: Flags [ (0x101)84; CHECK-NEXT: IsOptimizedOut (0x100)85; CHECK-NEXT: IsParameter (0x1)86; CHECK-NEXT: ]87; CHECK-NEXT: VarName: bbb88; 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: ccc96; 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: 0101; CHECK-NEXT: LocalVariableAddrRange {102; CHECK-NEXT: OffsetStart: .text+0x0103; CHECK-NEXT: ISectStart: 0x0104; CHECK-NEXT: Range: 0xB8105; CHECK-NEXT: }106; CHECK-NEXT: }107; CHECK-NEXT: ProcEnd {108; CHECK-NEXT: Kind: S_PROC_ID_END (0x114F)109; CHECK-NEXT: }110 111target triple = "aarch64-unknown-windows-msvc19.33.0"112 113; Function Attrs: mustprogress nounwind uwtable vscale_range(1,16)114define 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 {115entry: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 !28120 %0 = load <vscale x 4 x i32>, ptr %ccc, align 16, !dbg !27121 %mul = mul <vscale x 4 x i32> %0, %aaa, !dbg !27122 %add = add <vscale x 4 x i32> %mul, %bbb, !dbg !27123 ret <vscale x 4 x i32> %add, !dbg !27124}125 126attributes #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" }127attributes #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}162