378 lines · plain
1# RUN: llc -o - %s -start-after=patchable-function -O0 -mtriple=x86_64-unknown-linux-gnu | FileCheck %s2 3# Test dwarf codegen of:4# - DW_OP_constu, X, DW_OP_minus5# - DW_OP_constu, X, DW_OP_plus6# - DW_OP_plus_uconst, X7# when feeding a DW_OP_breg.8#9# Internally in LLVM the value X is saved as an "uint64_t". But when10# DwarfExpression::addMachineRegExpression is trying to simplify the DWARF by11# folding such expressions into a DW_OP_breg (or DW_OP_fbreg) the offset is12# converted to an "int". We must be careful when doing those folds, checking13# that X is in the range for "int".14 15--- |16 define void @test() !dbg !5 {17 entry:18 ret void, !dbg !1419 }20 21 !llvm.dbg.cu = !{!0}22 !llvm.module.flags = !{!3, !4}23 24 !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)25 !1 = !DIFile(filename: "1.cc", directory: "/tmp")26 !2 = !{}27 !3 = !{i32 2, !"Dwarf Version", i32 4}28 !4 = !{i32 2, !"Debug Info Version", i32 3}29 !5 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 4, type: !6, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)30 !6 = !DISubroutineType(types: !7)31 !7 = !{null}32 !8 = !{!9}33 !9 = !DILocalVariable(name: "buf", scope: !5, file: !1, line: 5, type: !10)34 !10 = !DICompositeType(tag: DW_TAG_array_type, baseType: !11, size: 3200, align: 32, elements: !12)35 !11 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)36 !12 = !{!13}37 !13 = !DISubrange(count: 100)38 !14 = !DILocation(line: 7, column: 1, scope: !5)39 40...41---42name: test43tracksRegLiveness: true44body: |45 46 bb.0: ;-------------------------- DW_OP_plus -------------------------------47 48 ; UINT_MAX49 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs50 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 4294967295, DW_OP_minus), debug-location !1451 52 ; UINT_MAX+153 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs54 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 4294967296, DW_OP_minus), debug-location !1455 56 ; INT_MAX57 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs58 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 2147483647, DW_OP_minus), debug-location !1459 60 ; INT_MAX+161 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs62 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 2147483648, DW_OP_minus), debug-location !1463 64 ; 065 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs66 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 0, DW_OP_minus), debug-location !1467 68 ; -169 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs70 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 18446744073709551615, DW_OP_minus), debug-location !1471 72 ; -273 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs74 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 18446744073709551614, DW_OP_minus), debug-location !1475 76 RET64 debug-location !1477 78 79 bb.1: ;-------------------------- DW_OP_plus -------------------------------80 81 ; UINT_MAX82 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs83 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 4294967295, DW_OP_plus), debug-location !1484 85 ; UINT_MAX+186 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs87 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 4294967296, DW_OP_plus), debug-location !1488 89 ; INT_MAX90 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs91 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 2147483647, DW_OP_plus), debug-location !1492 93 ; INT_MAX+194 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs95 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 2147483648, DW_OP_plus), debug-location !1496 97 ; 098 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs99 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 0, DW_OP_plus), debug-location !14100 101 ; -1102 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs103 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 18446744073709551615, DW_OP_plus), debug-location !14104 105 ; -2106 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs107 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 18446744073709551614, DW_OP_plus), debug-location !14108 109 RET64 debug-location !14110 111 112 bb.2: ;-------------------------- DW_OP_plus_uconst -------------------------------113 114 ; UINT_MAX115 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs116 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 4294967295), debug-location !14117 118 ; UINT_MAX+1119 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs120 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 4294967296), debug-location !14121 122 ; INT_MAX123 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs124 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 2147483647), debug-location !14125 126 ; INT_MAX+1127 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs128 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 2147483648), debug-location !14129 130 ; 0131 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs132 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 0), debug-location !14133 134 ; -1135 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs136 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 18446744073709551615), debug-location !14137 138 ; -2139 renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs140 DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 18446744073709551614), debug-location !14141 142 RET64 debug-location !14143 144...145 146 147# CHECK-LABEL: .Ldebug_loc0:148# CHECK-NEXT: .quad .Ltmp0-.Lfunc_begin0149# CHECK-NEXT: .quad .Ltmp1-.Lfunc_begin0150# CHECK-NEXT: .short 9 # Loc expr size151# CHECK-NEXT: .byte 114 # DW_OP_breg2152# CHECK-NEXT: .byte 0 # 0153# CHECK-NEXT: .byte 16 # DW_OP_constu154# CHECK-NEXT: .byte 255 # 4294967295155# CHECK-NEXT: .byte 255 #156# CHECK-NEXT: .byte 255 #157# CHECK-NEXT: .byte 255 #158# CHECK-NEXT: .byte 15 #159# CHECK-NEXT: .byte 28 # DW_OP_minus160# CHECK-NEXT: .quad .Ltmp1-.Lfunc_begin0161# CHECK-NEXT: .quad .Ltmp2-.Lfunc_begin0162# CHECK-NEXT: .short 9 # Loc expr size163# CHECK-NEXT: .byte 114 # DW_OP_breg2164# CHECK-NEXT: .byte 0 # 0165# CHECK-NEXT: .byte 16 # DW_OP_constu166# CHECK-NEXT: .byte 128 # 4294967296167# CHECK-NEXT: .byte 128 #168# CHECK-NEXT: .byte 128 #169# CHECK-NEXT: .byte 128 #170# CHECK-NEXT: .byte 16 #171# CHECK-NEXT: .byte 28 # DW_OP_minus172# CHECK-NEXT: .quad .Ltmp2-.Lfunc_begin0173# CHECK-NEXT: .quad .Ltmp3-.Lfunc_begin0174# CHECK-NEXT: .short 6 # Loc expr size175# CHECK-NEXT: .byte 114 # DW_OP_breg2176# CHECK-NEXT: .byte 129 # -2147483647177# CHECK-NEXT: .byte 128 #178# CHECK-NEXT: .byte 128 #179# CHECK-NEXT: .byte 128 #180# CHECK-NEXT: .byte 120 #181# CHECK-NEXT: .quad .Ltmp3-.Lfunc_begin0182# CHECK-NEXT: .quad .Ltmp4-.Lfunc_begin0183# CHECK-NEXT: .short 6 # Loc expr size184# CHECK-NEXT: .byte 114 # DW_OP_breg2185# CHECK-NEXT: .byte 128 # -2147483648186# CHECK-NEXT: .byte 128 #187# CHECK-NEXT: .byte 128 #188# CHECK-NEXT: .byte 128 #189# CHECK-NEXT: .byte 120 #190# CHECK-NEXT: .quad .Ltmp4-.Lfunc_begin0191# CHECK-NEXT: .quad .Ltmp5-.Lfunc_begin0192# CHECK-NEXT: .short 2 # Loc expr size193# CHECK-NEXT: .byte 114 # DW_OP_breg2194# CHECK-NEXT: .byte 0 # 0195# CHECK-NEXT: .quad .Ltmp5-.Lfunc_begin0196# CHECK-NEXT: .quad .Ltmp6-.Lfunc_begin0197# CHECK-NEXT: .short 5 # Loc expr size198# CHECK-NEXT: .byte 114 # DW_OP_breg2199# CHECK-NEXT: .byte 0 # 0200# CHECK-NEXT: .byte 48 # DW_OP_lit0201# CHECK-NEXT: .byte 32 # DW_OP_not202# CHECK-NEXT: .byte 28 # DW_OP_minus203# CHECK-NEXT: .quad .Ltmp6-.Lfunc_begin0204# CHECK-NEXT: .quad .Ltmp7-.Lfunc_begin0205# CHECK-NEXT: .short 14 # Loc expr size206# CHECK-NEXT: .byte 114 # DW_OP_breg2207# CHECK-NEXT: .byte 0 # 0208# CHECK-NEXT: .byte 16 # DW_OP_constu209# CHECK-NEXT: .byte 254 # 18446744073709551614210# CHECK-NEXT: .byte 255 #211# CHECK-NEXT: .byte 255 #212# CHECK-NEXT: .byte 255 #213# CHECK-NEXT: .byte 255 #214# CHECK-NEXT: .byte 255 #215# CHECK-NEXT: .byte 255 #216# CHECK-NEXT: .byte 255 #217# CHECK-NEXT: .byte 255 #218# CHECK-NEXT: .byte 1 #219# CHECK-NEXT: .byte 28 # DW_OP_minus220#-----------------------------------------------------------------------221# CHECK-NEXT: .quad .Ltmp8-.Lfunc_begin0222# CHECK-NEXT: .quad .Ltmp9-.Lfunc_begin0223# CHECK-NEXT: .short 9 # Loc expr size224# CHECK-NEXT: .byte 114 # DW_OP_breg2225# CHECK-NEXT: .byte 0 # 0226# CHECK-NEXT: .byte 16 # DW_OP_constu227# CHECK-NEXT: .byte 255 # 4294967295228# CHECK-NEXT: .byte 255 #229# CHECK-NEXT: .byte 255 #230# CHECK-NEXT: .byte 255 #231# CHECK-NEXT: .byte 15 #232# CHECK-NEXT: .byte 34 # DW_OP_plus233# CHECK-NEXT: .quad .Ltmp9-.Lfunc_begin0234# CHECK-NEXT: .quad .Ltmp10-.Lfunc_begin0235# CHECK-NEXT: .short 9 # Loc expr size236# CHECK-NEXT: .byte 114 # DW_OP_breg2237# CHECK-NEXT: .byte 0 # 0238# CHECK-NEXT: .byte 16 # DW_OP_constu239# CHECK-NEXT: .byte 128 # 4294967296240# CHECK-NEXT: .byte 128 #241# CHECK-NEXT: .byte 128 #242# CHECK-NEXT: .byte 128 #243# CHECK-NEXT: .byte 16 #244# CHECK-NEXT: .byte 34 # DW_OP_plus245# CHECK-NEXT: .quad .Ltmp10-.Lfunc_begin0246# CHECK-NEXT: .quad .Ltmp11-.Lfunc_begin0247# CHECK-NEXT: .short 6 # Loc expr size248# CHECK-NEXT: .byte 114 # DW_OP_breg2249# CHECK-NEXT: .byte 255 # 2147483647250# CHECK-NEXT: .byte 255 #251# CHECK-NEXT: .byte 255 #252# CHECK-NEXT: .byte 255 #253# CHECK-NEXT: .byte 7 #254# CHECK-NEXT: .quad .Ltmp11-.Lfunc_begin0255# CHECK-NEXT: .quad .Ltmp12-.Lfunc_begin0256# CHECK-NEXT: .short 9 # Loc expr size257# CHECK-NEXT: .byte 114 # DW_OP_breg2258# CHECK-NEXT: .byte 0 # 0259# CHECK-NEXT: .byte 16 # DW_OP_constu260# CHECK-NEXT: .byte 128 # 2147483648261# CHECK-NEXT: .byte 128 #262# CHECK-NEXT: .byte 128 #263# CHECK-NEXT: .byte 128 #264# CHECK-NEXT: .byte 8 #265# CHECK-NEXT: .byte 34 # DW_OP_plus266# CHECK-NEXT: .quad .Ltmp12-.Lfunc_begin0267# CHECK-NEXT: .quad .Ltmp13-.Lfunc_begin0268# CHECK-NEXT: .short 2 # Loc expr size269# CHECK-NEXT: .byte 114 # DW_OP_breg2270# CHECK-NEXT: .byte 0 # 0271# CHECK-NEXT: .quad .Ltmp13-.Lfunc_begin0272# CHECK-NEXT: .quad .Ltmp14-.Lfunc_begin0273# CHECK-NEXT: .short 5 # Loc expr size274# CHECK-NEXT: .byte 114 # DW_OP_breg2275# CHECK-NEXT: .byte 0 # 0276# CHECK-NEXT: .byte 48 # DW_OP_lit0277# CHECK-NEXT: .byte 32 # DW_OP_not278# CHECK-NEXT: .byte 34 # DW_OP_plus279# CHECK-NEXT: .quad .Ltmp14-.Lfunc_begin0280# CHECK-NEXT: .quad .Ltmp15-.Lfunc_begin0281# CHECK-NEXT: .short 14 # Loc expr size282# CHECK-NEXT: .byte 114 # DW_OP_breg2283# CHECK-NEXT: .byte 0 # 0284# CHECK-NEXT: .byte 16 # DW_OP_constu285# CHECK-NEXT: .byte 254 # 18446744073709551614286# CHECK-NEXT: .byte 255 #287# CHECK-NEXT: .byte 255 #288# CHECK-NEXT: .byte 255 #289# CHECK-NEXT: .byte 255 #290# CHECK-NEXT: .byte 255 #291# CHECK-NEXT: .byte 255 #292# CHECK-NEXT: .byte 255 #293# CHECK-NEXT: .byte 255 #294# CHECK-NEXT: .byte 1 #295# CHECK-NEXT: .byte 34 # DW_OP_plus296#-----------------------------------------------------------------------297# CHECK-NEXT: .quad .Ltmp16-.Lfunc_begin0298# CHECK-NEXT: .quad .Ltmp17-.Lfunc_begin0299# CHECK-NEXT: .short 8 # Loc expr size300# CHECK-NEXT: .byte 114 # DW_OP_breg2301# CHECK-NEXT: .byte 0 # 0302# CHECK-NEXT: .byte 35 # DW_OP_plus_uconst303# CHECK-NEXT: .byte 255 # 4294967295304# CHECK-NEXT: .byte 255 #305# CHECK-NEXT: .byte 255 #306# CHECK-NEXT: .byte 255 #307# CHECK-NEXT: .byte 15 #308# CHECK-NEXT: .quad .Ltmp17-.Lfunc_begin0309# CHECK-NEXT: .quad .Ltmp18-.Lfunc_begin0310# CHECK-NEXT: .short 8 # Loc expr size311# CHECK-NEXT: .byte 114 # DW_OP_breg2312# CHECK-NEXT: .byte 0 # 0313# CHECK-NEXT: .byte 35 # DW_OP_plus_uconst314# CHECK-NEXT: .byte 128 # 4294967296315# CHECK-NEXT: .byte 128 #316# CHECK-NEXT: .byte 128 #317# CHECK-NEXT: .byte 128 #318# CHECK-NEXT: .byte 16 #319# CHECK-NEXT: .quad .Ltmp18-.Lfunc_begin0320# CHECK-NEXT: .quad .Ltmp19-.Lfunc_begin0321# CHECK-NEXT: .short 6 # Loc expr size322# CHECK-NEXT: .byte 114 # DW_OP_breg2323# CHECK-NEXT: .byte 255 # 2147483647324# CHECK-NEXT: .byte 255 #325# CHECK-NEXT: .byte 255 #326# CHECK-NEXT: .byte 255 #327# CHECK-NEXT: .byte 7 #328# CHECK-NEXT: .quad .Ltmp19-.Lfunc_begin0329# CHECK-NEXT: .quad .Ltmp20-.Lfunc_begin0330# CHECK-NEXT: .short 8 # Loc expr size331# CHECK-NEXT: .byte 114 # DW_OP_breg2332# CHECK-NEXT: .byte 0 # 0333# CHECK-NEXT: .byte 35 # DW_OP_plus_uconst334# CHECK-NEXT: .byte 128 # 2147483648335# CHECK-NEXT: .byte 128 #336# CHECK-NEXT: .byte 128 #337# CHECK-NEXT: .byte 128 #338# CHECK-NEXT: .byte 8 #339# CHECK-NEXT: .quad .Ltmp20-.Lfunc_begin0340# CHECK-NEXT: .quad .Ltmp21-.Lfunc_begin0341# CHECK-NEXT: .short 2 # Loc expr size342# CHECK-NEXT: .byte 114 # DW_OP_breg2343# CHECK-NEXT: .byte 0 # 0344# CHECK-NEXT: .quad .Ltmp21-.Lfunc_begin0345# CHECK-NEXT: .quad .Ltmp22-.Lfunc_begin0346# CHECK-NEXT: .short 13 # Loc expr size347# CHECK-NEXT: .byte 114 # DW_OP_breg2348# CHECK-NEXT: .byte 0 # 0349# CHECK-NEXT: .byte 35 # DW_OP_plus_uconst350# CHECK-NEXT: .byte 255 # 18446744073709551615351# CHECK-NEXT: .byte 255 #352# CHECK-NEXT: .byte 255 #353# CHECK-NEXT: .byte 255 #354# CHECK-NEXT: .byte 255 #355# CHECK-NEXT: .byte 255 #356# CHECK-NEXT: .byte 255 #357# CHECK-NEXT: .byte 255 #358# CHECK-NEXT: .byte 255 #359# CHECK-NEXT: .byte 1 #360# CHECK-NEXT: .quad .Ltmp22-.Lfunc_begin0361# CHECK-NEXT: .quad .Lfunc_end0-.Lfunc_begin0362# CHECK-NEXT: .short 13 # Loc expr size363# CHECK-NEXT: .byte 114 # DW_OP_breg2364# CHECK-NEXT: .byte 0 # 0365# CHECK-NEXT: .byte 35 # DW_OP_plus_uconst366# CHECK-NEXT: .byte 254 # 18446744073709551614367# CHECK-NEXT: .byte 255 #368# CHECK-NEXT: .byte 255 #369# CHECK-NEXT: .byte 255 #370# CHECK-NEXT: .byte 255 #371# CHECK-NEXT: .byte 255 #372# CHECK-NEXT: .byte 255 #373# CHECK-NEXT: .byte 255 #374# CHECK-NEXT: .byte 255 #375# CHECK-NEXT: .byte 1 #376# CHECK-NEXT: .quad 0377# CHECK-NEXT: .quad 0378