1; RUN: llc -mtriple=x86_64-apple-darwin < %s -filetype=obj \ 2; RUN: | llvm-dwarfdump -debug-dump=info - | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s 3; RUN: llc -mtriple=x86_64-linux-gnu < %s -filetype=obj \ 4; RUN: | llvm-dwarfdump -debug-dump=info - | FileCheck --check-prefix=CHECK --check-prefix=LINUX %s 5; RUN: llc -mtriple=x86_64-apple-darwin < %s -filetype=obj -regalloc=basic \ 6; RUN: | llvm-dwarfdump -debug-dump=info - | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s 7 8; CHECK: DW_TAG_subprogram 9; CHECK: DW_AT_abstract_origin {{.*}} "foo" 10; CHECK: DW_TAG_formal_parameter 11; CHECK-NOT: DW_TAG 12; CHECK: DW_AT_abstract_origin {{.*}} "sp" 13; CHECK: DW_TAG_formal_parameter 14; CHECK-NOT: DW_TAG 15; CHECK: DW_AT_abstract_origin {{.*}} "nums" 16 17; CHECK: DW_TAG_subprogram 18; CHECK-NOT: DW_TAG 19; CHECK: DW_AT_name {{.*}} "foo" 20; CHECK: DW_TAG_formal_parameter 21; CHECK-NOT: DW_TAG 22; CHECK: DW_AT_name {{.*}} "sp" 23; CHECK: DW_TAG_formal_parameter 24; CHECK-NOT: DW_TAG 25; CHECK: DW_AT_name {{.*}} "nums" 26 27;CHECK: DW_TAG_inlined_subroutine 28;CHECK-NEXT: DW_AT_abstract_origin {{.*}} "foo" 29;CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] 30;CHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] 31;CHECK-NEXT: DW_AT_call_file 32;CHECK-NEXT: DW_AT_call_line 33 34;CHECK: DW_TAG_formal_parameter 35;FIXME: Linux shouldn't drop this parameter either... 36;CHECK-NOT: DW_TAG 37;DARWIN: DW_AT_abstract_origin {{.*}} "sp" 38;DARWIN: DW_TAG_formal_parameter 39;CHECK: DW_AT_abstract_origin {{.*}} "nums" 40;CHECK-NOT: DW_TAG_formal_parameter 41 42%struct.S1 = type { float*, i32 } 43 44@p = common global %struct.S1 zeroinitializer, align 8 45 46define i32 @foo(%struct.S1* nocapture %sp, i32 %nums) nounwind optsize ssp !dbg !0 { 47entry: 48 tail call void @llvm.dbg.value(metadata %struct.S1* %sp, i64 0, metadata !9, metadata !DIExpression()), !dbg !20 49 tail call void @llvm.dbg.value(metadata i32 %nums, i64 0, metadata !18, metadata !DIExpression()), !dbg !21 50 %tmp2 = getelementptr inbounds %struct.S1, %struct.S1* %sp, i64 0, i32 1, !dbg !22 51 store i32 %nums, i32* %tmp2, align 4, !dbg !22 52 %call = tail call float* @bar(i32 %nums) nounwind optsize, !dbg !27 53 %tmp5 = getelementptr inbounds %struct.S1, %struct.S1* %sp, i64 0, i32 0, !dbg !27 54 store float* %call, float** %tmp5, align 8, !dbg !27 55 %cmp = icmp ne float* %call, null, !dbg !29 56 %cond = zext i1 %cmp to i32, !dbg !29 57 ret i32 %cond, !dbg !29 58} 59 60declare float* @bar(i32) optsize 61 62define void @foobar() nounwind optsize ssp !dbg !6 { 63entry: 64 tail call void @llvm.dbg.value(metadata %struct.S1* @p, i64 0, metadata !9, metadata !DIExpression()) nounwind, !dbg !31 65 tail call void @llvm.dbg.value(metadata i32 1, i64 0, metadata !18, metadata !DIExpression()) nounwind, !dbg !35 66 store i32 1, i32* getelementptr inbounds (%struct.S1, %struct.S1* @p, i64 0, i32 1), align 8, !dbg !36 67 %call.i = tail call float* @bar(i32 1) nounwind optsize, !dbg !37 68 store float* %call.i, float** getelementptr inbounds (%struct.S1, %struct.S1* @p, i64 0, i32 0), align 8, !dbg !37 69 ret void, !dbg !38 70} 71 72declare void @llvm.dbg.value(metadata, i64, metadata, metadata) nounwind readnone 73 74!llvm.dbg.cu = !{!2} 75!llvm.module.flags = !{!43} 76 77!0 = distinct !DISubprogram(name: "foo", line: 8, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, unit: !2, scopeLine: 8, file: !1, scope: !1, type: !3, variables: !41) 78!1 = !DIFile(filename: "nm2.c", directory: "/private/tmp") 79!2 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 2.9 (trunk 125693)", isOptimized: true, emissionKind: FullDebug, file: !42, enums: !{}, retainedTypes: !{}, globals: !40, imports: !44) 80!3 = !DISubroutineType(types: !4) 81!4 = !{!5} 82!5 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed) 83!6 = distinct !DISubprogram(name: "foobar", line: 15, isLocal: false, isDefinition: true, virtualIndex: 6, isOptimized: true, unit: !2, file: !1, scope: !1, type: !7) 84!7 = !DISubroutineType(types: !8) 85!8 = !{null} 86!9 = !DILocalVariable(name: "sp", line: 7, arg: 1, scope: !0, file: !1, type: !10) 87!10 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, scope: !2, baseType: !11) 88!11 = !DIDerivedType(tag: DW_TAG_typedef, name: "S1", line: 4, file: !42, scope: !2, baseType: !12) 89!12 = !DICompositeType(tag: DW_TAG_structure_type, name: "S1", line: 1, size: 128, align: 64, file: !42, scope: !2, elements: !13) 90!13 = !{!14, !17} 91!14 = !DIDerivedType(tag: DW_TAG_member, name: "m", line: 2, size: 64, align: 64, file: !42, scope: !1, baseType: !15) 92!15 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, scope: !2, baseType: !16) 93!16 = !DIBasicType(tag: DW_TAG_base_type, name: "float", size: 32, align: 32, encoding: DW_ATE_float) 94!17 = !DIDerivedType(tag: DW_TAG_member, name: "nums", line: 3, size: 32, align: 32, offset: 64, file: !42, scope: !1, baseType: !5) 95!18 = !DILocalVariable(name: "nums", line: 7, arg: 2, scope: !0, file: !1, type: !5) 96!19 = !DIGlobalVariable(name: "p", line: 14, isLocal: false, isDefinition: true, scope: !2, file: !1, type: !11, variable: %struct.S1* @p) 97!20 = !DILocation(line: 7, column: 13, scope: !0) 98!21 = !DILocation(line: 7, column: 21, scope: !0) 99!22 = !DILocation(line: 9, column: 3, scope: !23) 100!23 = distinct !DILexicalBlock(line: 8, column: 1, file: !1, scope: !0) 101!27 = !DILocation(line: 10, column: 3, scope: !23) 102!29 = !DILocation(line: 11, column: 3, scope: !23) 103!30 = !{%struct.S1* @p} 104!31 = !DILocation(line: 7, column: 13, scope: !0, inlinedAt: !32) 105!32 = !DILocation(line: 16, column: 3, scope: !33) 106!33 = distinct !DILexicalBlock(line: 15, column: 15, file: !1, scope: !6) 107!34 = !{i32 1} 108!35 = !DILocation(line: 7, column: 21, scope: !0, inlinedAt: !32) 109!36 = !DILocation(line: 9, column: 3, scope: !23, inlinedAt: !32) 110!37 = !DILocation(line: 10, column: 3, scope: !23, inlinedAt: !32) 111!38 = !DILocation(line: 17, column: 1, scope: !33) 112!40 = !{!19} 113!41 = !{!9, !18} 114!42 = !DIFile(filename: "nm2.c", directory: "/private/tmp") 115!43 = !{i32 1, !"Debug Info Version", i32 3} 116!44 = !{} 117