1d7733f84SJack Anderson; RUN: llc -O0 %s -mtriple=msp430 -filetype=obj -o - -minimize-addr-in-v5=Ranges \ 2d7733f84SJack Anderson; RUN: | llvm-dwarfdump -debug-info -debug-addr -debug-rnglists -v - \ 3d7733f84SJack Anderson; RUN: | FileCheck --check-prefix=CHECK --check-prefix=RNG \ 4d7733f84SJack Anderson; RUN: --implicit-check-not=DW_TAG --implicit-check-not=NULL --implicit-check-not=_pc %s 5d7733f84SJack Anderson 6d7733f84SJack Anderson; RUN: llc -O0 %s -mtriple=msp430 -filetype=obj -o - -minimize-addr-in-v5=Expressions \ 7d7733f84SJack Anderson; RUN: | llvm-dwarfdump -debug-info -debug-addr -debug-rnglists -v - \ 8d7733f84SJack Anderson; RUN: | FileCheck --check-prefix=CHECK --check-prefix=EXPRORFORM --check-prefix=EXPR\ 9d7733f84SJack Anderson; RUN: --implicit-check-not=DW_TAG --implicit-check-not=NULL --implicit-check-not=_pc %s 10d7733f84SJack Anderson 11d7733f84SJack Anderson; RUN: llc -O0 %s -mtriple=msp430 -filetype=obj -o - -minimize-addr-in-v5=Form \ 12d7733f84SJack Anderson; RUN: | llvm-dwarfdump -debug-info -debug-addr -debug-rnglists -v - \ 13d7733f84SJack Anderson; RUN: | FileCheck --check-prefix=CHECK --check-prefix=EXPRORFORM --check-prefix=FORM \ 14d7733f84SJack Anderson; RUN: --implicit-check-not=DW_TAG --implicit-check-not=NULL --implicit-check-not=_pc %s 15d7733f84SJack Anderson 16d7733f84SJack Anderson; Ported from X86 test to cover 2-byte address size case 17*c395a846SIlya Kuklin; Check that 16-bit addresses of MSP430 are properly stored 18*c395a846SIlya Kuklin; in 32-bit DWARF fields 19d7733f84SJack Anderson 20d7733f84SJack Anderson; Generated from the following source. f4 is used to put a hole in the CU 21d7733f84SJack Anderson; ranges while keeping f2 and f4 in the same section (as opposed to 22d7733f84SJack Anderson; -ffunction-sections, which would produce CU ranges, but each function would 23d7733f84SJack Anderson; be in a different section, so unable to share addresses). The call to f1 at 24d7733f84SJack Anderson; the start of f3 ensures the range for the inlined subroutine doesn't share 25d7733f84SJack Anderson; the starting address with f3 (so it can be improved by using a rnglist to 26d7733f84SJack Anderson; allow it to share an address it wouldn't already be sharing). 27d7733f84SJack Anderson 28d7733f84SJack Anderson; Without f6 being in another section, technically we could use a non-zero CU 29d7733f84SJack Anderson; low_pc that could act as a base address for all the addresses in the CU & avoid 30d7733f84SJack Anderson; the need for these forced rnglists - we don't do that currently, but f6 ensures 31d7733f84SJack Anderson; that this test will remain meaningful even if that improvement is made in the 32d7733f84SJack Anderson; future. (implementing that would require detecting that all the addresses in 33d7733f84SJack Anderson; the CU ranges are in the same section, then picking the lowest such address as 34d7733f84SJack Anderson; the base address to make all other addresses relative to) 35d7733f84SJack Anderson 36d7733f84SJack Anderson; IR from the following, compiled with: 37d7733f84SJack Anderson; $ clang -g -c -gdwarf-5 -O1 38d7733f84SJack Anderson; __attribute__((optnone)) void f1() { } 39d7733f84SJack Anderson; __attribute__((always_inline)) inline void f2() { 40d7733f84SJack Anderson; f1(); 41d7733f84SJack Anderson; } 42d7733f84SJack Anderson; void f3() { 43d7733f84SJack Anderson; f1(); 44d7733f84SJack Anderson; f2(); 45d7733f84SJack Anderson; } 46d7733f84SJack Anderson; __attribute__((nodebug)) void f4() { 47d7733f84SJack Anderson; } 48d7733f84SJack Anderson; void f5() { 49d7733f84SJack Anderson; } 50d7733f84SJack Anderson; __attribute__((section(".other"))) void f6() { 51d7733f84SJack Anderson; } 52d7733f84SJack Anderson 53d7733f84SJack Anderson; CHECK-LABEL: .debug_info contents: 54d7733f84SJack Anderson; CHECK: DW_TAG_compile_unit 55d7733f84SJack Anderson; CHECK: DW_AT_low_pc 56*c395a846SIlya Kuklin; CHECK-SAME: (0x00000000) 57d7733f84SJack Anderson; RNG: DW_AT_ranges 58d7733f84SJack Anderson; RNG-SAME: (indexed (0x3) rangelist = [[CU_RANGE:.*]] 59d7733f84SJack Anderson; EXPRORFORM: DW_AT_ranges 60d7733f84SJack Anderson; EXPRORFORM-SAME: (indexed (0x0) rangelist = [[CU_RANGE:.*]] 61d7733f84SJack Anderson; CHECK: DW_TAG_subprogram 62d7733f84SJack Anderson; CHECK: DW_AT_low_pc 63*c395a846SIlya Kuklin; CHECK-SAME: (indexed (00000000) address = 0x00000000 ".text") 64d7733f84SJack Anderson; CHECK: DW_AT_high_pc 65d7733f84SJack Anderson; CHECK-SAME: (0x00000002) 66d7733f84SJack Anderson; CHECK: DW_AT_name 67d7733f84SJack Anderson; CHECK-SAME: "f1" 68d7733f84SJack Anderson; CHECK: DW_TAG_subprogram 69d7733f84SJack Anderson; CHECK: DW_AT_name 70d7733f84SJack Anderson; CHECK-SAME: "f2" 71d7733f84SJack Anderson; CHECK: DW_TAG_subprogram 72d7733f84SJack Anderson; EXPR: DW_AT_low_pc 73d7733f84SJack Anderson; EXPR-SAME: (DW_OP_addrx 0x0, DW_OP_const4u 0x2, DW_OP_plus) 74d7733f84SJack Anderson; FORM: DW_AT_low_pc 75*c395a846SIlya Kuklin; FORM-SAME: [DW_FORM_LLVM_addrx_offset] (indexed (00000000) + 0x2 address = 0x00000002 ".text") 76d7733f84SJack Anderson; EXPRORFORM: DW_AT_high_pc 77d7733f84SJack Anderson; EXPRORFORM-SAME: (0x0000000a) 78d7733f84SJack Anderson; RNG: DW_AT_ranges 79d7733f84SJack Anderson; RNG-SAME: (indexed (0x0) rangelist = [[F3_RANGE:.*]] 80d7733f84SJack Anderson; CHECK: DW_AT_name 81d7733f84SJack Anderson; CHECK-SAME: "f3" 82d7733f84SJack Anderson; CHECK: DW_TAG_inlined_subroutine 83d7733f84SJack Anderson; EXPR: DW_AT_low_pc 84d7733f84SJack Anderson; EXPR-SAME: [DW_FORM_exprloc] (DW_OP_addrx 0x0, DW_OP_const4u 0x6, DW_OP_plus) 85d7733f84SJack Anderson; FORM: DW_AT_low_pc 86*c395a846SIlya Kuklin; FORM-SAME: [DW_FORM_LLVM_addrx_offset] (indexed (00000000) + 0x6 address = 0x00000006 ".text") 87d7733f84SJack Anderson; EXPRORFORM: DW_AT_high_pc 88d7733f84SJack Anderson; EXPRORFORM-SAME: (0x00000004) 89d7733f84SJack Anderson; RNG: DW_AT_ranges 90d7733f84SJack Anderson; RNG-SAME: (indexed (0x1) rangelist = [[INL_RANGE:.*]] 91d7733f84SJack Anderson; CHECK: DW_TAG_call_site 92d7733f84SJack Anderson; RNG: DW_AT_call_return_pc 93*c395a846SIlya Kuklin; RNG-SAME: (indexed (00000001) address = 0x00000006 ".text") 94d7733f84SJack Anderson; EXPR: DW_AT_call_return_pc 95d7733f84SJack Anderson; EXPR-SAME: [DW_FORM_exprloc] (DW_OP_addrx 0x0, DW_OP_const4u 0x6, DW_OP_plus) 96d7733f84SJack Anderson; FORM: DW_AT_call_return_pc 97*c395a846SIlya Kuklin; FORM-SAME: [DW_FORM_LLVM_addrx_offset] (indexed (00000000) + 0x6 address = 0x00000006 ".text") 98d7733f84SJack Anderson; CHECK: DW_TAG_call_site 99d7733f84SJack Anderson; RNG: DW_AT_call_return_pc 100*c395a846SIlya Kuklin; RNG-SAME: (indexed (00000002) address = 0x0000000a ".text") 101d7733f84SJack Anderson; EXPR: DW_AT_call_return_pc 102d7733f84SJack Anderson; EXPR-SAME: [DW_FORM_exprloc] (DW_OP_addrx 0x0, DW_OP_const4u 0xa, DW_OP_plus) 103d7733f84SJack Anderson; FORM: DW_AT_call_return_pc 104*c395a846SIlya Kuklin; FORM-SAME: [DW_FORM_LLVM_addrx_offset] (indexed (00000000) + 0xa address = 0x0000000a ".text") 105d7733f84SJack Anderson; CHECK: NULL 106d7733f84SJack Anderson; CHECK: DW_TAG_subprogram 107d7733f84SJack Anderson; EXPR: DW_AT_low_pc 108d7733f84SJack Anderson; EXPR-SAME: [DW_FORM_exprloc] (DW_OP_addrx 0x0, DW_OP_const4u 0xe, DW_OP_plus) 109d7733f84SJack Anderson; FORM: DW_AT_low_pc 110*c395a846SIlya Kuklin; FORM-SAME: [DW_FORM_LLVM_addrx_offset] (indexed (00000000) + 0xe address = 0x0000000e ".text") 111d7733f84SJack Anderson; EXPRORFORM: DW_AT_high_pc 112d7733f84SJack Anderson; EXPRORFORM-SAME: (0x00000002) 113d7733f84SJack Anderson; RNG: DW_AT_ranges 114d7733f84SJack Anderson; RNG-SAME: (indexed (0x2) rangelist = [[F5_RANGE:.*]] 115d7733f84SJack Anderson; CHECK: DW_AT_name 116d7733f84SJack Anderson; CHECK-SAME: "f5" 117d7733f84SJack Anderson; CHECK: DW_TAG_subprogram 118d7733f84SJack Anderson; CHECK: DW_AT_low_pc [DW_FORM_addrx] (indexed ( 119d7733f84SJack Anderson; RNG-SAME: 00000003 120d7733f84SJack Anderson; EXPRORFORM-SAME: 00000001 121*c395a846SIlya Kuklin; CHECK: ) address = 0x00000000 ".other") 122d7733f84SJack Anderson; CHECK: DW_AT_high_pc 123d7733f84SJack Anderson; CHECK-SAME: (0x00000006) 124d7733f84SJack Anderson; CHECK: DW_AT_name 125d7733f84SJack Anderson; CHECK-SAME: "f6" 126d7733f84SJack Anderson; CHECK: DW_TAG_inlined_subroutine 127d7733f84SJack Anderson; RNG: DW_AT_low_pc 128*c395a846SIlya Kuklin; RNG-SAME: (indexed (00000003) address = 0x00000000 ".other") 129d7733f84SJack Anderson; EXPRORFORM: DW_AT_low_pc 130*c395a846SIlya Kuklin; EXPRORFORM-SAME: (indexed (00000001) address = 0x00000000 ".other") 131d7733f84SJack Anderson; CHECK: DW_AT_high_pc 132d7733f84SJack Anderson; CHECK-SAME: (0x00000004) 133d7733f84SJack Anderson; CHECK: DW_TAG_call_site 134d7733f84SJack Anderson; CHECK: DW_AT_call_return_pc 135d7733f84SJack Anderson; CHECK: NULL 136d7733f84SJack Anderson; CHECK: NULL 137d7733f84SJack Anderson 138d7733f84SJack Anderson; CHECK-LABEL: .debug_addr contents: 139d7733f84SJack Anderson; CHECK: 0x00000000: Address table 140d7733f84SJack Anderson; CHECK-NEXT: Addrs: [ 141*c395a846SIlya Kuklin; CHECK-NEXT: 0x00000000 142*c395a846SIlya Kuklin; RNG-NEXT: 0x00000006 143*c395a846SIlya Kuklin; RNG-NEXT: 0x0000000a 144*c395a846SIlya Kuklin; CHECK-NEXT: 0x00000000 145*c395a846SIlya Kuklin; RNG-NEXT: 0x00000004 146d7733f84SJack Anderson; CHECK-NEXT: ] 147d7733f84SJack Anderson 148d7733f84SJack Anderson; CHECK-LABEL: .debug_rnglists contents: 149d7733f84SJack Anderson; RNG: 0x00000000: range list header: {{.*}}, offset_entry_count = 0x00000004 150d7733f84SJack Anderson; EXPRORFORM: 0x00000000: range list header: {{.*}}, offset_entry_count = 0x00000001 151d7733f84SJack Anderson; CHECK: ranges: 152d7733f84SJack Anderson; RNG-NEXT: [[F3_RANGE]]: [DW_RLE_base_addressx]: 153*c395a846SIlya Kuklin; RNG-SAME: 0x00000000 154d7733f84SJack Anderson; RNG-NEXT: [DW_RLE_offset_pair ] 155d7733f84SJack Anderson; RNG-NEXT: [DW_RLE_end_of_list ] 156d7733f84SJack Anderson 157d7733f84SJack Anderson; RNG-NEXT: [[INL_RANGE]]: [DW_RLE_base_addressx]: 158*c395a846SIlya Kuklin; RNG-SAME: 0x00000000 159d7733f84SJack Anderson; RNG-NEXT: [DW_RLE_offset_pair ] 160d7733f84SJack Anderson; RNG-NEXT: [DW_RLE_end_of_list ] 161d7733f84SJack Anderson 162d7733f84SJack Anderson; RNG-NEXT: [[F5_RANGE]]: [DW_RLE_base_addressx]: 163*c395a846SIlya Kuklin; RNG-SAME: 0x00000000 164d7733f84SJack Anderson; RNG-NEXT: [DW_RLE_offset_pair ] 165d7733f84SJack Anderson; RNG-NEXT: [DW_RLE_end_of_list ] 166d7733f84SJack Anderson 167d7733f84SJack Anderson; CHECK-NEXT: [[CU_RANGE]]: [DW_RLE_base_addressx]: 168*c395a846SIlya Kuklin; CHECK-SAME: 0x00000000 169d7733f84SJack Anderson; CHECK-NEXT: [DW_RLE_offset_pair ] 170d7733f84SJack Anderson; CHECK-NEXT: [DW_RLE_offset_pair ] 171d7733f84SJack Anderson; RNG-NEXT: [DW_RLE_startx_length]: 172*c395a846SIlya Kuklin; RNG-SAME: 0x00000003 173d7733f84SJack Anderson; EXPRORFORM-NEXT: [DW_RLE_startx_length]: 174*c395a846SIlya Kuklin; EXPRORFORM-SAME: 0x00000001 175d7733f84SJack Anderson; CHECK-NEXT: [DW_RLE_end_of_list ] 176d7733f84SJack Anderson 177d7733f84SJack Anderson; Function Attrs: mustprogress noinline nounwind optnone uwtable 178d7733f84SJack Andersondefine dso_local void @_Z2f1v() local_unnamed_addr #0 !dbg !7 { 179d7733f84SJack Andersonentry: 180d7733f84SJack Anderson ret void, !dbg !12 181d7733f84SJack Anderson} 182d7733f84SJack Anderson 183d7733f84SJack Anderson; Function Attrs: mustprogress nounwind uwtable 184d7733f84SJack Andersondefine dso_local void @_Z2f3v() local_unnamed_addr #1 !dbg !13 { 185d7733f84SJack Andersonentry: 186d7733f84SJack Anderson call void @_Z2f1v(), !dbg !14 187d7733f84SJack Anderson call void @_Z2f1v() #3, !dbg !15 188d7733f84SJack Anderson ret void, !dbg !18 189d7733f84SJack Anderson} 190d7733f84SJack Anderson 191d7733f84SJack Anderson; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone uwtable willreturn 192d7733f84SJack Andersondefine dso_local void @_Z2f4v() local_unnamed_addr #2 { 193d7733f84SJack Andersonentry: 194d7733f84SJack Anderson ret void 195d7733f84SJack Anderson} 196d7733f84SJack Anderson 197d7733f84SJack Anderson; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone uwtable willreturn 198d7733f84SJack Andersondefine dso_local void @_Z2f5v() local_unnamed_addr #2 !dbg !19 { 199d7733f84SJack Andersonentry: 200d7733f84SJack Anderson ret void, !dbg !20 201d7733f84SJack Anderson} 202d7733f84SJack Anderson 203d7733f84SJack Anderson; Function Attrs: mustprogress nounwind uwtable 204d7733f84SJack Andersondefine dso_local void @_Z2f6v() local_unnamed_addr #1 section ".other" !dbg !21 { 205d7733f84SJack Andersonentry: 206d7733f84SJack Anderson call void @_Z2f1v() #3, !dbg !22 207d7733f84SJack Anderson ret void, !dbg !24 208d7733f84SJack Anderson} 209d7733f84SJack Anderson 210d7733f84SJack Andersonattributes #0 = { mustprogress noinline nounwind optnone uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" } 211d7733f84SJack Andersonattributes #1 = { mustprogress nounwind uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" } 212d7733f84SJack Andersonattributes #2 = { mustprogress nofree norecurse nosync nounwind readnone uwtable willreturn "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" } 213d7733f84SJack Andersonattributes #3 = { nounwind } 214d7733f84SJack Anderson 215d7733f84SJack Anderson!llvm.dbg.cu = !{!0} 216d7733f84SJack Anderson!llvm.module.flags = !{!2, !3, !4, !5} 217d7733f84SJack Anderson!llvm.ident = !{!6} 218d7733f84SJack Anderson 219d7733f84SJack Anderson!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 14.0.0 (git@github.com:llvm/llvm-project.git e2c3dc6fc76e767f08249f6d2c36e41660a4e331)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) 220d7733f84SJack Anderson!1 = !DIFile(filename: "/usr/local/google/home/blaikie/dev/scratch/test.cpp", directory: "/usr/local/google/home/blaikie/dev/llvm/src", checksumkind: CSK_MD5, checksum: "e70db21a276125757057e729999c09c7") 221d7733f84SJack Anderson!2 = !{i32 7, !"Dwarf Version", i32 5} 222d7733f84SJack Anderson!3 = !{i32 2, !"Debug Info Version", i32 3} 223d7733f84SJack Anderson!4 = !{i32 1, !"wchar_size", i32 4} 224d7733f84SJack Anderson!5 = !{i32 7, !"uwtable", i32 1} 225d7733f84SJack Anderson!6 = !{!"clang version 14.0.0 (git@github.com:llvm/llvm-project.git e2c3dc6fc76e767f08249f6d2c36e41660a4e331)"} 226d7733f84SJack Anderson!7 = distinct !DISubprogram(name: "f1", linkageName: "_Z2f1v", scope: !8, file: !8, line: 1, type: !9, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !11) 227d7733f84SJack Anderson!8 = !DIFile(filename: "scratch/test.cpp", directory: "/usr/local/google/home/blaikie/dev", checksumkind: CSK_MD5, checksum: "e70db21a276125757057e729999c09c7") 228d7733f84SJack Anderson!9 = !DISubroutineType(types: !10) 229d7733f84SJack Anderson!10 = !{null} 230d7733f84SJack Anderson!11 = !{} 231d7733f84SJack Anderson!12 = !DILocation(line: 1, column: 38, scope: !7) 232d7733f84SJack Anderson!13 = distinct !DISubprogram(name: "f3", linkageName: "_Z2f3v", scope: !8, file: !8, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !11) 233d7733f84SJack Anderson!14 = !DILocation(line: 6, column: 3, scope: !13) 234d7733f84SJack Anderson!15 = !DILocation(line: 3, column: 3, scope: !16, inlinedAt: !17) 235d7733f84SJack Anderson!16 = distinct !DISubprogram(name: "f2", linkageName: "_Z2f2v", scope: !8, file: !8, line: 2, type: !9, scopeLine: 2, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !11) 236d7733f84SJack Anderson!17 = distinct !DILocation(line: 7, column: 3, scope: !13) 237d7733f84SJack Anderson!18 = !DILocation(line: 8, column: 1, scope: !13) 238d7733f84SJack Anderson!19 = distinct !DISubprogram(name: "f5", linkageName: "_Z2f5v", scope: !8, file: !8, line: 11, type: !9, scopeLine: 11, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !11) 239d7733f84SJack Anderson!20 = !DILocation(line: 12, column: 1, scope: !19) 240d7733f84SJack Anderson!21 = distinct !DISubprogram(name: "f6", linkageName: "_Z2f6v", scope: !8, file: !8, line: 13, type: !9, scopeLine: 13, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !11) 241d7733f84SJack Anderson!22 = !DILocation(line: 3, column: 3, scope: !16, inlinedAt: !23) 242d7733f84SJack Anderson!23 = distinct !DILocation(line: 14, column: 3, scope: !21) 243d7733f84SJack Anderson!24 = !DILocation(line: 15, column: 1, scope: !21) 244