1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -filetype=obj | llvm-readobj - -codeview | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" 3*9880d681SAndroid Build Coastguard Workertarget triple = "i686-pc-windows-msvc18.0.0" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; C++ source to regenerate: 6*9880d681SAndroid Build Coastguard Worker; $ cat t.cpp 7*9880d681SAndroid Build Coastguard Worker; void f() { 8*9880d681SAndroid Build Coastguard Worker; typedef int FOO; 9*9880d681SAndroid Build Coastguard Worker; FOO f; 10*9880d681SAndroid Build Coastguard Worker; } 11*9880d681SAndroid Build Coastguard Worker; 12*9880d681SAndroid Build Coastguard Worker; struct S { int x; }; 13*9880d681SAndroid Build Coastguard Worker; float g(S *s) { 14*9880d681SAndroid Build Coastguard Worker; union pun { int x; float f; } p; 15*9880d681SAndroid Build Coastguard Worker; p.x = s->x; 16*9880d681SAndroid Build Coastguard Worker; return p.f; 17*9880d681SAndroid Build Coastguard Worker; } 18*9880d681SAndroid Build Coastguard Worker; typedef struct { int x; } U; 19*9880d681SAndroid Build Coastguard Worker; U u; 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; CHECK: ProcStart { 22*9880d681SAndroid Build Coastguard Worker; CHECK: DisplayName: f 23*9880d681SAndroid Build Coastguard Worker; CHECK: LinkageName: ?f@@YAXXZ 24*9880d681SAndroid Build Coastguard Worker; CHECK: } 25*9880d681SAndroid Build Coastguard Worker; CHECK: UDT { 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: Type: int (0x74) 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: UDTName: f::FOO 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: } 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ProcEnd { 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: } 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; CHECK: ProcStart { 33*9880d681SAndroid Build Coastguard Worker; CHECK: DisplayName: g 34*9880d681SAndroid Build Coastguard Worker; CHECK: LinkageName: ?g@@YAMPEAUS@@@Z 35*9880d681SAndroid Build Coastguard Worker; CHECK: } 36*9880d681SAndroid Build Coastguard Worker; CHECK: UDT { 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: Type: g::pun (0x{{[0-9A-F]+}}) 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: UDTName: g::pun 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: } 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ProcEnd { 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: } 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; CHECK: Subsection 44*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ProcStart 45*9880d681SAndroid Build Coastguard Worker; CHECK: UDT { 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: Type: S (0x{{[0-9A-F]+}}) 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: UDTName: S 48*9880d681SAndroid Build Coastguard Worker; CHECK: UDT { 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: Type: <unnamed-tag> (0x{{[0-9A-F]+}}) 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: UDTName: U 51*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: UDT { 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker%struct.U = type { i32 } 55*9880d681SAndroid Build Coastguard Worker%struct.S = type { i32 } 56*9880d681SAndroid Build Coastguard Worker%union.pun = type { i32 } 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker@"\01?u@@3UU@@A" = global %struct.U zeroinitializer, align 4 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable 61*9880d681SAndroid Build Coastguard Workerdefine void @"\01?f@@YAXXZ"() #0 !dbg !14 { 62*9880d681SAndroid Build Coastguard Workerentry: 63*9880d681SAndroid Build Coastguard Worker %f = alloca i32, align 4 64*9880d681SAndroid Build Coastguard Worker call void @llvm.dbg.declare(metadata i32* %f, metadata !17, metadata !19), !dbg !20 65*9880d681SAndroid Build Coastguard Worker ret void, !dbg !21 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 69*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.dbg.declare(metadata, metadata, metadata) #1 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable 72*9880d681SAndroid Build Coastguard Workerdefine float @"\01?g@@YAMPEAUS@@@Z"(%struct.S* %s) #0 !dbg !22 { 73*9880d681SAndroid Build Coastguard Workerentry: 74*9880d681SAndroid Build Coastguard Worker %s.addr = alloca %struct.S*, align 8 75*9880d681SAndroid Build Coastguard Worker %p = alloca %union.pun, align 4 76*9880d681SAndroid Build Coastguard Worker store %struct.S* %s, %struct.S** %s.addr, align 8 77*9880d681SAndroid Build Coastguard Worker call void @llvm.dbg.declare(metadata %struct.S** %s.addr, metadata !30, metadata !19), !dbg !31 78*9880d681SAndroid Build Coastguard Worker call void @llvm.dbg.declare(metadata %union.pun* %p, metadata !32, metadata !19), !dbg !37 79*9880d681SAndroid Build Coastguard Worker %0 = load %struct.S*, %struct.S** %s.addr, align 8, !dbg !38 80*9880d681SAndroid Build Coastguard Worker %x = getelementptr inbounds %struct.S, %struct.S* %0, i32 0, i32 0, !dbg !39 81*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %x, align 4, !dbg !39 82*9880d681SAndroid Build Coastguard Worker %x1 = bitcast %union.pun* %p to i32*, !dbg !40 83*9880d681SAndroid Build Coastguard Worker store i32 %1, i32* %x1, align 4, !dbg !41 84*9880d681SAndroid Build Coastguard Worker %f = bitcast %union.pun* %p to float*, !dbg !42 85*9880d681SAndroid Build Coastguard Worker %2 = load float, float* %f, align 4, !dbg !42 86*9880d681SAndroid Build Coastguard Worker ret float %2, !dbg !43 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } 90*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone } 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker!llvm.dbg.cu = !{!0} 93*9880d681SAndroid Build Coastguard Worker!llvm.module.flags = !{!10, !11, !12} 94*9880d681SAndroid Build Coastguard Worker!llvm.ident = !{!13} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.9.0 ", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !3) 97*9880d681SAndroid Build Coastguard Worker!1 = !DIFile(filename: "t.cpp", directory: "D:\5Csrc\5Cllvm\5Cbuild") 98*9880d681SAndroid Build Coastguard Worker!2 = !{} 99*9880d681SAndroid Build Coastguard Worker!3 = !{!4} 100*9880d681SAndroid Build Coastguard Worker!4 = distinct !DIGlobalVariable(name: "u", linkageName: "\01?u@@3UU@@A", scope: !0, file: !1, line: 13, type: !5, isLocal: false, isDefinition: true, variable: %struct.U* @"\01?u@@3UU@@A") 101*9880d681SAndroid Build Coastguard Worker!5 = !DIDerivedType(tag: DW_TAG_typedef, name: "U", file: !1, line: 12, baseType: !6) 102*9880d681SAndroid Build Coastguard Worker!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, file: !1, line: 12, size: 32, align: 32, elements: !7, identifier: ".?AUU@@") 103*9880d681SAndroid Build Coastguard Worker!7 = !{!8} 104*9880d681SAndroid Build Coastguard Worker!8 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !6, file: !1, line: 12, baseType: !9, size: 32, align: 32) 105*9880d681SAndroid Build Coastguard Worker!9 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) 106*9880d681SAndroid Build Coastguard Worker!10 = !{i32 2, !"CodeView", i32 1} 107*9880d681SAndroid Build Coastguard Worker!11 = !{i32 2, !"Debug Info Version", i32 3} 108*9880d681SAndroid Build Coastguard Worker!12 = !{i32 1, !"PIC Level", i32 2} 109*9880d681SAndroid Build Coastguard Worker!13 = !{!"clang version 3.9.0 "} 110*9880d681SAndroid Build Coastguard Worker!14 = distinct !DISubprogram(name: "f", linkageName: "\01?f@@YAXXZ", scope: !1, file: !1, line: 1, type: !15, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2) 111*9880d681SAndroid Build Coastguard Worker!15 = !DISubroutineType(types: !16) 112*9880d681SAndroid Build Coastguard Worker!16 = !{null} 113*9880d681SAndroid Build Coastguard Worker!17 = !DILocalVariable(name: "f", scope: !14, file: !1, line: 3, type: !18) 114*9880d681SAndroid Build Coastguard Worker!18 = !DIDerivedType(tag: DW_TAG_typedef, name: "FOO", scope: !14, file: !1, line: 2, baseType: !9) 115*9880d681SAndroid Build Coastguard Worker!19 = !DIExpression() 116*9880d681SAndroid Build Coastguard Worker!20 = !DILocation(line: 3, column: 7, scope: !14) 117*9880d681SAndroid Build Coastguard Worker!21 = !DILocation(line: 4, column: 1, scope: !14) 118*9880d681SAndroid Build Coastguard Worker!22 = distinct !DISubprogram(name: "g", linkageName: "\01?g@@YAMPEAUS@@@Z", scope: !1, file: !1, line: 7, type: !23, isLocal: false, isDefinition: true, scopeLine: 7, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2) 119*9880d681SAndroid Build Coastguard Worker!23 = !DISubroutineType(types: !24) 120*9880d681SAndroid Build Coastguard Worker!24 = !{!25, !26} 121*9880d681SAndroid Build Coastguard Worker!25 = !DIBasicType(name: "float", size: 32, align: 32, encoding: DW_ATE_float) 122*9880d681SAndroid Build Coastguard Worker!26 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !27, size: 64, align: 64) 123*9880d681SAndroid Build Coastguard Worker!27 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S", file: !1, line: 6, size: 32, align: 32, elements: !28, identifier: ".?AUS@@") 124*9880d681SAndroid Build Coastguard Worker!28 = !{!29} 125*9880d681SAndroid Build Coastguard Worker!29 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !27, file: !1, line: 6, baseType: !9, size: 32, align: 32) 126*9880d681SAndroid Build Coastguard Worker!30 = !DILocalVariable(name: "s", arg: 1, scope: !22, file: !1, line: 7, type: !26) 127*9880d681SAndroid Build Coastguard Worker!31 = !DILocation(line: 7, column: 12, scope: !22) 128*9880d681SAndroid Build Coastguard Worker!32 = !DILocalVariable(name: "p", scope: !22, file: !1, line: 8, type: !33) 129*9880d681SAndroid Build Coastguard Worker!33 = distinct !DICompositeType(tag: DW_TAG_union_type, name: "pun", scope: !22, file: !1, line: 8, size: 32, align: 32, elements: !34) 130*9880d681SAndroid Build Coastguard Worker!34 = !{!35, !36} 131*9880d681SAndroid Build Coastguard Worker!35 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !33, file: !1, line: 8, baseType: !9, size: 32, align: 32) 132*9880d681SAndroid Build Coastguard Worker!36 = !DIDerivedType(tag: DW_TAG_member, name: "f", scope: !33, file: !1, line: 8, baseType: !25, size: 32, align: 32) 133*9880d681SAndroid Build Coastguard Worker!37 = !DILocation(line: 8, column: 33, scope: !22) 134*9880d681SAndroid Build Coastguard Worker!38 = !DILocation(line: 9, column: 9, scope: !22) 135*9880d681SAndroid Build Coastguard Worker!39 = !DILocation(line: 9, column: 12, scope: !22) 136*9880d681SAndroid Build Coastguard Worker!40 = !DILocation(line: 9, column: 5, scope: !22) 137*9880d681SAndroid Build Coastguard Worker!41 = !DILocation(line: 9, column: 7, scope: !22) 138*9880d681SAndroid Build Coastguard Worker!42 = !DILocation(line: 10, column: 12, scope: !22) 139*9880d681SAndroid Build Coastguard Worker!43 = !DILocation(line: 10, column: 3, scope: !22) 140